cordova-issues mailing list archives

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

     [ https://issues.apache.org/jira/browse/CB-8028?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Antonio Laguna updated CB-8028:
-------------------------------
    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:

{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 {{CDDViewController}} class

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

  was:
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.


> 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 {{CDDViewController}} class
> {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-unsubscribe@cordova.apache.org
For additional commands, e-mail: issues-help@cordova.apache.org


Mime
View raw message