cordova-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Antonio Laguna (JIRA)" <>
Subject [jira] [Created] (CB-8028) handleOpenURL doesn't work properly when app is being launched for the first time
Date Mon, 17 Nov 2014 15:22:34 GMT
Antonio Laguna created CB-8028:

             Summary: handleOpenURL doesn't work properly when app is being launched for the
first time
                 Key: CB-8028
             Project: Apache Cordova
          Issue Type: Bug
          Components: iOS
    Affects Versions: 3.6.0
            Reporter: Antonio Laguna


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:

{code:javascript} = '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 

- (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
* 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.

This message was sent by Atlassian JIRA

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message