Uploaded image for project: 'Apache Cordova'
  1. Apache Cordova
  2. CB-8028

handleOpenURL doesn't work properly when app is being launched for the first time

VotersWatch issueWatchersLinkUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Duplicate
    • 3.7.0
    • 3.8.0
    • cordova-ios
    • None

    Description

      Hi!

      Please bear in mind that this is my first issue being reported here but I thought it to be worth it.

      So, we've been developing a Cordova application lately and we decided to add a notification center plugin to be able to launch the application from it, taking advantage of the url-scheme on iOS.

      We discovered that it worked flawlessly when it was launched and the app was in background but it wasn't when the app was closed and tried to launch from there.

      So I dug deeper.

      Since this is an Ionic application, I thought the issue was due to Angular not being ready at the appropriate time or something like that so I just put something really low-level which didn't depend on any library:

      window.foo = 'bar';
      

      And then checked with a timeout (after app was ready) to see if it was there. But it wasn't.

      So I dug deeper.

      So the issue seems to come on this function which is on the CDDViewController class

      - (void)processOpenUrl:(NSURL*)url pageLoaded:(BOOL)pageLoaded
      {
          if (!pageLoaded) {
              // query the webview for readystate
              NSString* readyState = [webView stringByEvaluatingJavaScriptFromString:@"document.readyState"];
              pageLoaded = [readyState isEqualToString:@"loaded"] || [readyState isEqualToString:@"complete"];
          }
      
          if (pageLoaded) {
              // calls into javascript global function 'handleOpenURL'
              NSString* jsString = [NSString stringWithFormat:@"if (typeof handleOpenURL === 'function') { handleOpenURL(\"%@\");}", url];
              [self.webView stringByEvaluatingJavaScriptFromString:jsString];
          } else {
              // save for when page has loaded
              self.openURL = url;
          }
      }
      

      The thing is that the second check for pageLoaded is positive even though the page is clearly at a really early stage. The Splash is still being shown and the DOM although it may be ready-ish, it doesn't work properly (clearly).

      This is the flow:

      • It comes first by (void)processOpenUrl:(NSURL*)url - The handleOpenUrl function is then called cause even though NO is passed as a parameter, Cordova gets to think it's ready.
      • Then it comes to onPageDidLoad which would call (void)processOpenUrl:(NSURL*)url pageLoaded:(BOOL)pageLoaded too but since openURL hasn't been saved this time, it won't do anything

      Just to make sure of things, I tried to self.openURL = url; even if the page was loaded and that turned out to work.

      I don't understand the implications of this but IMHO, onPageDidLoad is a better point to understand wether the app is ready or not than querying the document like that cause the code doesn't seem to be there yet.

      Please note that I put my handler before anything else on the header to ensure it wasn't a racing issue.

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            shazron Shazron Abdullah
            ALaguna Antonio Laguna
            Votes:
            7 Vote for this issue
            Watchers:
            8 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment