2015-09-24 9 views
5

W mojej aplikacji używam window.history.back poruszać się z powrotem do poprzedniego widokuCordova - window.history.back() nie działa przycisk HTML z powrotem w iOS 9

Deklarację tyłu przycisk

<div class="back_icon" id="verification_back_icon"><a href="#" data-rel="back" data-transition="slidedown"><img src="images/back_btn.png" width="23"/></a></div> 

przycisk akcji:

$("#verification_back_icon").on("click", function(e) 
{ 
if(checkDirtyVacation()) 
{ 
    e.preventDefault(); 
    if(backbtnAlt== false) 
    { 
     backbtnAlt =true; 
     confirm("All data will be lost. Do you want to continue?", 
     function(r){ 
      if(r){ 
       //onBackKeyDown(); 
        clearVacationvalues(); 
        window.history.back();//this is not working in iOS 9 
      }else{ 

      } 
      backbtnAlt =false; 
     }); 
    } 
} 
else 
{ 
    e.preventDefault(); 
    if($(".vaction_location").hasClass("chkSelect")) 
    {  
     $(".vaction_location").removeClass("chkSelect"); 
     $(".vaction_location").addClass("chkUnSelect"); 
    } 


    window.history.back(); 
    } 
    }); 

To działało idealnie do iOS 8.4. W systemie iOS 9 ta nawigacja nie działa.

Używam Apache Cordova native platform version 3.8.0.

Jeśli ktoś ma podobny problem, zasugeruj mi. Próbowałem z history.back doesn't work on iOS using Cordova, ale bez powodzenia

Dziękuję.

+0

Jeśli "poprzedni widok" używa skrótów, potem problem jest prawdopodobnie ze względu na fakt, to ustal ing z 'window.location.hash' jest asynchroniczny to iOS 9 UIWebView - [patrz tutaj] (https://openradar.appspot.com/22186109). Trudno powiedzieć bez więcej szczegółów na temat jakich frameworków używasz ... – DaveAlden

+0

@DaveAlden ..dziękuję za odpowiedź..Zobacz moje zaktualizowane pytanie – Sujania

+0

Z Twojego fragmentu HTML, wygląda na to, że możesz używać jQuery mobile? Jeśli tak, to w jakiej wersji? Jeśli nie, podaj przykład, jak poruszać się między widokami. – DaveAlden

Odpowiedz

1

ROZWIĄZANIE:

Linia ta rozwiązać mój problem:

history.go(0); 

Wymieniłem window.history.back() z history.go(0);

teraz działa dobrze dla mnie w iOS 9

W index.html

<script type="text/javascript">$.mobile.hashListeningEnabled = false;</script> 

Dodaj to funkcja onDeviceReady:

function onDeviceReady() 
     { 
if(device.platform === "iOS" && parseInt(device.version) === 9){ 
       $.mobile.hashListeningEnabled = false; 
      } 

      if (! ($.mobile.hashListeningEnabled && 
        $.mobile.path.isHashValid(location.hash) && 
        ($(hashPage).is(":jqmData(role='page')") || 
        $.mobile.path.isPath(hash) || 
        hash === $.mobile.dialogHashKey))) { 

         // make sure to set initial popstate state if it exists 
         // so that navigation back to the initial page works properly 
         if ($.event.special.navigate.isPushStateEnabled()) { 
          $.mobile.navigate.navigator.squash(path.parseLocation().href); 
         } 

         $.mobile.changePage($.mobile.firstPage, { 
              transition: "none", 
              reverse: true, 
              changeHash: false, 
              fromHashChange: true 
              }); 
        } else { 
         // trigger hashchange or navigate to squash and record the correct 
         // history entry for an initial hash path 
         if (!$.event.special.navigate.isPushStateEnabled()) { 
          $window.trigger("hashchange", [true]); 
         } else { 
          // TODO figure out how to simplify this interaction with the initial history entry 
          // at the bottom js/navigate/navigate.js 
          $.mobile.navigate.history.stack = []; 
          $.mobile.navigate($.mobile.path.isPath(location.hash) ? location.hash : location.href); 
         } 
        } 

Validation dla urządzenia wersję systemu operacyjnego (jak history.go(0) pracuje tylko z iOS 9) Przed iOS 9 wersja window.history.back() działa idealnie

A teraz Dodaj ten fragment kodu w miejsce window.history.back()

 if(device.platform === "iOS" && parseInt(device.version) === 9){ 
       console.log("version" + device.version); 
       console.log("iOS 9"); 
       history.go(0); 
       //write your code here     
      } 
     else{ 
      window.history.back(); 
      } 

Aby rozwiązać ten komunikat „Failed załadować stronę z błędem: CDVWebViewDelegate: Nawigacja zaczęło się, gdy stan = 1” w konsoli dodać poniżej kodu w CDVWebViewDelegate.m

In - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType

Method Komentarz ten kawałek kodu przedstawiono poniżej:

/* if ([_delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) { 
         NSDictionary* errorDictionary = @{NSLocalizedDescriptionKey : description}; 
         NSError* error = [[NSError alloc] initWithDomain:@"CDVWebViewDelegate" code:1 userInfo:errorDictionary]; 
         [_delegate webView:webView didFailLoadWithError:error]; 
        }*/ 
+0

Nawigacja działa poprawnie, gdy otrzymuję tę linię w konsoli: CDVWebViewDelegate: Nawigacja rozpoczęła się, gdy stan = 1 Nie można załadować strony z błędem: CDVWebViewDelegate: Nawigacja rozpoczęta, gdy stan = 1 – Sujania

+0

Czy ktoś wie, czy to zachowanie jest mniejszy lub poważny problem? – Sujania

+0

jeśli aplikacja działa, jest nieistotna – jcesarmobile

0

Spróbuj

if(r){ 
     try{ 
      var nav = window.navigator; 
      if(this.phonegapNavigationEnabled && nav && nav.app && nav.app.backHistory) 
      { 
      nav.app.backHistory(); 
      } 
      else 
      { 
      window.history.back(); 
      } 
     } 
     catch(e) 
     { 
     alert(e); 
     } 
     } 
+0

dziękuję za odpowiedź .. Ale nadal ten sam problem .. Mój widok nie wyskakuje poprawnie – Sujania

1

@Sujania,

Zdaniem zespołu PhoneGap, iOS9 nie jest oficjalnie wspierać. Ten problem może być kolejnym błędem w iOS9. Być może będziesz musiał poczekać na poprawkę.

PhoneGap Budowanie iOS 9 obsługuje stanu
http://community.phonegap.com/nitobi/topics/phonegap-build-ios-9-support-status

Top line: iOS 9 is not officially supported until Cordova-iOS 4.0.0, which the Cordova team is hard at work on. However some issues can be solved with some simple configuration changes.

W tym momencie, 4 błędy są zgłaszane do repozytorium Bug Cordova. Twój problem nie pojawia się w repozytorium - od tej daty.

https://issues.apache.org/jira/browse/CB-9684?jql=text%20~%20%22iOS9%22

+0

Używam natywnej wersji platformy Cordova w wersji 3.8.0 .. – Sujania

+0

Niezależnie od tego, z czego korzystasz, ponieważ w postach na forum stwierdza się, że * iOS 9 nie jest oficjalnie wspierany do wersji Cordova-iOS 4.0.0 *. Oznacza to, że utworzymy obejście lub poczekamy, aż zostanie oficjalnie wspierane. ** LUB ** zgłoś zgłoszenie błędu z cordova. ** LUB ** poczekaj, aż ktoś inny utworzy pracę. Z mojej strony nie pracuję na czołowych pozycjach, więc jestem niewłaściwą osobą, z którą należy się kontaktować. --Powodzenia. – JesseMonroy650

5

Problemem jest to, że ustawienie window.location.hash jest asynchroniczny w iOS 9,0 UIWebView (wykorzystywana przez Cordova/PhoneGap) - patrz this bug report szczegóły.

Powoduje to problemy podczas korzystania z jQuery Mobile, która domyślnie używa window.location.hash do nawigacji pomiędzy "stronami". Powoduje również problemy z wyskakującymi okienkami/dialogami/wybranymi menu, które używają tego mechanizmu.

Można rozwiązać ten problem poprzez zapobieganie jQuery Mobile, z automatycznie słuchania/używanie location.hash:

$(document).on("deviceready", function(){ 
    $.mobile.hashListeningEnabled = false; 
}); 

Jednak znalazłem to miało skutków ubocznych, takich jak Android powodując przycisk nie działa sprzęt z powrotem, więc Kieruję go specjalnie na iOS 9 stosując cordova-plugin-device:

$(document).on("deviceready", function(){ 
    if(device.platform === "iOS" && parseInt(device.version) === 9){ 
     $.mobile.hashListeningEnabled = false; 
    } 
}); 

Zauważ, że używam navigator.app.backHistory() nie window.history.back() w połączeniu z hashListeningEnabled = false - to może zrobić różnicę.

Alternatywnie możesz użyć this plugin, aby użyć nowego WKWebView na iOS 8 i 9.WKWebView jest używany przez Safari na iOS 8+, dlatego witryny JQM wyświetlane w przeglądarce na iOS 9 nie napotykają tych problemów. cordova-ios 3 nadal używa UIWebView z powodu a bug w WKWebView w iOS 8, ale nadchodzące cordova-ios 4 will support a WKWebView core plugin dla iOS 9+. Zwróć uwagę, że istnieją dodatkowe względy podczas korzystania z WKWebView z aplikacjami Cordova/Phonegap ze względu na bardziej rygorystyczne zabezpieczenia, takie jak wymaganie nagłówków CORS w odpowiedziach XHR.

+0

po użyciu $ .mobile.hashListeningEnabled = false; w metodzie ondeviceReady kliknięcie nawigacji nie działa. Wcześniej powrócił do ładowania strony niezależnie od liczby kliknięć do przodu nawigacji. – Sujania

+0

Jeśli to nie działa, WKWebView może być lepszą opcją – DaveAlden

+0

Czy powinienem zamienić UIWebView na WKWebView w konstruktorze interfejsów? Spróbuję tego raz .. – Sujania

2

Wyłączenie stan Push pracował dla mnie:

$ .mobile.pushStateEnabled = false;

+0

@lan Drake to naprawdę działa świetnie w przeciwieństwie do mojego rozwiązania. Nie daje to żadnej "nawigacji uruchomionej, gdy stan = 1 "problem. Dziękuję za rozwiązanie. – Sujania

+0

po wyłączeniu opcji pushState powyżej, czy mogę użyć "navigator.app.backHistory()" na odwrocie? –

1

Myślę, że to domyślne działanie tagu A powoduje błąd. Więc po prostu zapobiegam domyślnej akcji, dodając return false na końcu funkcji obsługi kliknięcia

I to działa.

  • html

<a id="back-btn">back</a>

  • javascript

    $('#back-btn').on('click', function(e) { 
         window.history.go(-1); 
         return false; 
        }) 
    
Powiązane problemy