Search code examples
javascripthtmlcordovaios9cordova-3.8.0

Cordova - window.history.back() not working on HTML back button in iOS 9


In my application I am using window.history.back to navigate back to previous View

Declaration of back button

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

Button action:

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

This worked perfectly till iOS 8.4. In iOS 9 this navigation is not working.

I am using Apache Cordova native platform version 3.8.0 .

If anyone facing the similar problem please suggest me. I have tried with history.back doesn't work on iOS using Cordova, but no luck

Thank you.


Solution

  • SOLUTION:

    This line resolved my issue :

     history.go(0); 
    

    I have replaced window.history.back() with history.go(0);

    Now it is working fine for me in iOS 9

    In index.html

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

    Add this in onDeviceReady function:

    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 for device OS version (as history.go(0) is working only with iOS 9) Prior to iOS 9 version window.history.back() working perfectly

    And now Add this piece of code in place of 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();
    }
    

    To fix this Message "Failed to load webpage with error: CDVWebViewDelegate: Navigation started when state=1" in console add below code in CDVWebViewDelegate.m

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

    Method Comment this piece of code shown below:

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