[
https://issues.apache.org/jira/browse/CB-8028?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14231236#comment-14231236
]
Antonio GarcĂa commented on CB-8028:
------------------------------------
I have the same problem with v3.7.0 & iOS 8.1.
When the app is closed the {{(void)processOpenUrl:(NSURL*)url
pageLoaded:(BOOL)pageLoaded}} method is called a first time from this stack
trace:
{code}
0 -[CDVViewController processOpenUrl:pageLoaded:] at CDVViewController.m:1011
1 -[CDVViewController processOpenUrl:] at CDVViewController.m:1030
2 -[AppDelegate application:openURL:sourceApplication:annotation:] at
AppDelegate.m:102
3 -[UIApplication _applicationOpenURL:payload:] ()
4 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:]
()
5 -[UIApplication _runWithMainScene:transitionContext:completion:] ()
6 -[UIApplication workspaceDidEndTransaction:] ()
7 __31-[FBSSerialQueue performAsync:]_block_invoke ()
8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ ()
9 __CFRunLoopDoBlocks ()
10 __CFRunLoopRun ()
11 CFRunLoopRunSpecific ()
12 -[UIApplication _run] ()
13 UIApplicationMain ()
14 main at ./UrlSchema/platforms/ios/UrlSchema/main.m:32
15 start ()
{code}
As {{pageLoaded == NO}} then {{document.readyState}} is evaluated
{code}
NSString* readyState = [webView
stringByEvaluatingJavaScriptFromString:@"document.readyState"];
{code}
At this moment the DOM isn't loaded, but the problem is that {{readyState}}
returns "complete" and {{pageLoaded}} changes to YES. Therefore the javascript
{{handleOpenURL}} invocation fails.
A possible solution would be to check the existence of the {{handleOpenURL}}
function within the DOM:
{code}
if (!pageLoaded) {
// query the webview for readystate
NSString* readyState = [webView
stringByEvaluatingJavaScriptFromString:@"document.readyState"];
pageLoaded = ([readyState isEqualToString:@"loaded"] || [readyState
isEqualToString:@"complete"]);
if(pageLoaded){
pageLoaded = [[webView stringByEvaluatingJavaScriptFromString:@"(typeof
handleOpenURL === 'function')"] boolValue];
}
}
{code}
> 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.7.0
> Reporter: Antonio Laguna
> Assignee: Shazron Abdullah
>
> 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: [email protected]
For additional commands, e-mail: [email protected]