Antonio Laguna created CB-8028:
----------------------------------

             Summary: handleOpenURL doesn't work properly when app is being 
launched for the first time
                 Key: CB-8028
                 URL: https://issues.apache.org/jira/browse/CB-8028
             Project: Apache Cordova
          Issue Type: Bug
          Components: iOS
    Affects Versions: 3.6.0
            Reporter: Antonio Laguna


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:

{code:javascript}
window.foo = 'bar';
{code}

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 

{code}
- (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;
    }
}
{code}

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.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org
For additional commands, e-mail: issues-h...@cordova.apache.org

Reply via email to