Cordova - window.history.back() не работает над кнопкой возврата HTML в iOS 9

В моем приложении я использую window.history.back для перехода к предыдущему виду

Объявление кнопки возврата

 <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>

Действие кнопки:

 $("#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();
   }
  }); 

Это работало отлично до iOS 8.4. В iOS 9 эта навигация не работает.

я использую Apache Cordova native platform version 3.8.0,

Если кто сталкивается с подобной проблемой, пожалуйста, предложите мне. Я пытался с history.back не работает на iOS с использованием Cordova, но не повезло

Спасибо.

6 ответов

Решение

РЕШЕНИЕ:

Эта строка решила мою проблему:

 history.go(0); 

Я заменил window.history.back() с history.go(0);

Теперь у меня нормально работает в iOS 9

В index.html

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

Добавьте это в функцию 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 );
                       }
                   }

Проверка версии ОС устройства (как history.go(0) работает только с iOS 9) До версии iOS 9 window.history.back() работает отлично

А теперь добавьте этот кусок кода вместо 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();
           }

Чтобы исправить это сообщение "Не удалось загрузить веб-страницу с ошибкой: CDVWebViewDelegate: навигация началась, когда состояние =1" в консоли, добавьте приведенный ниже код в CDVWebViewDelegate.m

В - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*) запрашивает навигационный тип:(UIWebViewNavigationType)navigationType

Метод Комментируйте этот фрагмент кода, показанный ниже:

    /*  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];
                    }*/

Проблема в том, что настройка window.location.hash является асинхронным в iOS 9.0 UIWebview (используется Cordova/Phonegap) - подробности см. в этом отчете об ошибках.

Это вызывает проблемы при использовании jQuery Mobile, который по умолчанию использует window.location.hash перемещаться между "страницами". Это также вызывает проблемы с всплывающими окнами / диалоговыми окнами / меню выбора, которые используют этот механизм.

Вы можете исправить это, запретив jQuery Mobile автоматически прослушивать / использовать location.hash:

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

Тем не менее, я обнаружил, что это имеет побочные эффекты на Android, такие как неиспользование аппаратной кнопки "назад", поэтому я специально нацелил ее на iOS 9 с помощью https://github.com/apache/cordova-plugin-device:

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

Обратите внимание, что я использую navigator.app.backHistory() не window.history.back() в сочетании с hashListeningEnabled = false - это может иметь значение.

В качестве альтернативы вы можете использовать этот плагин для использования нового WKWebView на iOS 8 и 9. WKWebView используется Safari на iOS 8+, поэтому сайты JQM, просматриваемые в браузере на iOS 9, не сталкиваются с этими проблемами. cordova-ios 3 по-прежнему использует UIWebView из- за ошибки в WKWebView в iOS 8, но в предстоящем cordova-ios 4 будет поддерживаться основной плагин WKWebView для iOS 9+. Обратите внимание, что при использовании WKWebView с приложениями Cordova / Phonegap существуют дополнительные соображения из-за его более строгой безопасности, например, требование наличия заголовков CORS для ответов XHR.

Я думаю, что это действие по умолчанию тега A вызывает ошибку. Поэтому я просто предотвращаю действие по умолчанию, добавив return false в конце функции обработчика кликов

И это работает.

  • HTML

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

  • Javascript

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

Отключение push-состояния сработало для меня:

$.mobile.pushStateEnabled = false;

@Sujania,

По словам команды phonegap, iOS9 официально не поддерживается. Эта проблема может быть еще одна ошибка в iOS9. Возможно, вам придется ждать исправления.

PhoneGap Build iOS 9 Состояние поддержки
http://community.phonegap.com/nitobi/topics/phonegap-build-ios-9-support-status

Итог: iOS 9 официально не поддерживается до Cordova-iOS 4.0.0, над которой команда Cordova усердно работает. Однако некоторые проблемы могут быть решены с помощью простых изменений конфигурации.

На данный момент о 4 ошибках сообщается в хранилище Cordova Bug. Ваша проблема не появляется в репозитории - по состоянию на эту дату.

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

Попробуй это

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);
        }
      }
Другие вопросы по тегам