Second call steals the callbackID of the first. On it. Thanks!
> On Sep 7, 2016, at 6:34 AM, Li, Jonathan <jonathan...@sap.com> wrote: > > Hi, > > The problem with > self.callbackId = command.callbackId; > is it causes the current inappbrowser stopping work properly after user > clicks a link to open mobile safari using window.open method from the current > inappbrowser html page. > > In our application, the inappbrowser is opened in inappbrowser webivew > controller, the open method will set self.callbackId to the related value. In > the html page loaded in the inappbrowser, there is link using window.open > with system target to open an external page in mobile safari. When user > clicks this link, the inappbrowser open method will be called again, and set > self.callbackid to a new vaule, as a result after the mobile safari is > opened, the original inappbrowser’s callback will not work anymore as its > callback id is replaced by the second open method. > > Theoretically, the first inappbrowser’s function should still not be affected > if it opens another link in new system browser, as the callback id is not > used by system browser > > For the issue of when to use SASafarirViewController, it seems > SASafariViewController is more a replacement for mobile safari (for system > target) instead of inappbrowser webviewcontroller (for blank target). As > SFSafariViewController is designed to replace the function of mobile safari, > so there are no backward compatible issues or losing functions by doing so, > and application will not have any major behavior difference with this change. > On the other hand, SASafariViewController does not provide all the functions > provided by inappbrowser webviewcontroller, replacing inappbrowser webview > controller with SASafariViewController will have more risks. > > Thanks > Jonathan > From: julio cesar sanchez <jcesarmob...@gmail.com> > Date: Wednesday, September 7, 2016 at 3:25 AM > To: "Li, Jonathan" <jonathan...@sap.com> > Cc: "dev@cordova.apache.org" <dev@cordova.apache.org> > Subject: Re: optimizing ios inappbrowser plugin's open and openInSystem > method s > > What is the problem self.callbackId = command.callbackId; causes when used > with _system option? > > I think _system option should open in safari app as it does now, and > SFSafariViewController should replace the ViewController we use when _blank > is used. > > 2016-09-07 6:41 GMT+02:00 Li, Jonathan > <jonathan...@sap.com<mailto:jonathan...@sap.com>>: > > Hi, > Currently there are two issues in iOS inappbrowser’s open and openInSystem > methods. > > First, in the inappbrowser open method, it sets the instance variable at below > self.callbackId = command.callbackId; > this causes the problem when opening a _system targe from an inappbrowser > viewController, even if the callbackID are not applicable to system browser. > > Second, the _system target will always be opened in external mobile safari > browser, although SFSafariViewController for iOS 9 device provides a better > user experience. The major benefit with SFSafariViewController is the > application staying in foreground, so that the application does not need to > handle the application life cycle events triggered by opening the mobile > safari. > > > The below code is a prototype handling the two issues. Just want to know your > comment about this change, and if it is fine, a pull request will be > submitted for it. > > - (void)open:(CDVInvokedUrlCommand*)command > { > CDVPluginResult* pluginResult; > > NSString* url = [command argumentAtIndex:0]; > NSString* target = [command argumentAtIndex:1 > withDefault:kInAppBrowserTargetSelf]; > NSString* options = [command argumentAtIndex:2 withDefault:@"" > andClass:[NSString class]]; > > //**********the below line causes trouble to open system url from > inappbrowser > //self.callbackId = command.callbackId; > > if (url != nil) { > #ifdef __CORDOVA_4_0_0 > NSURL* baseUrl = [self.webViewEngine URL]; > #else > NSURL* baseUrl = [self.webView.request URL]; > #endif > NSURL* absoluteUrl = [[NSURL URLWithString:url relativeToURL:baseUrl] > absoluteURL]; > > if ([self isSystemUrl:absoluteUrl]) { > target = kInAppBrowserTargetSystem; > } > > if ([target isEqualToString:kInAppBrowserTargetSelf]) { > [self openInCordovaWebView:absoluteUrl withOptions:options]; > } else if ([target isEqualToString:kInAppBrowserTargetSystem]) { > [self openInSystem:absoluteUrl]; > } else { // _blank or anything else > [self openInInAppBrowser:absoluteUrl withOptions:options]; > } > > pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; > } else { > pluginResult = [CDVPluginResult > resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"incorrect number of > arguments"]; > } > > //***********new code > if (![target isEqualToString:kInAppBrowserTargetSystem]) { > [pluginResult setKeepCallback:[NSNumber numberWithBool:YES]]; > self.callbackId = command.callbackId; > } > > [self.commandDelegate sendPluginResult:pluginResult > callbackId:command.callbackId]; > } > > > - (void)openInSystem:(NSURL*)url > { > //************ customization: open _system web url in Safari view > controller on ios 9 device > if (([[[UIDevice currentDevice] systemVersion] compare:@"9.0" > options:NSNumericSearch] != NSOrderedAscending) && > ([[url.scheme lowercaseString] isEqualToString:@"http"] || > [[url.scheme lowercaseString] isEqualToString:@"https"])) { > SFSafariViewController* sf = [[SFSafariViewController alloc] > initWithURL:url]; > sf.delegate = self; > //check whether inappbrowser is presented, if so, use it to present > the safari viewcontroller > if (self.viewController.presentedViewController != nil){ > [self.viewController.presentedViewController > presentViewController:sf animated:YES completion:nil]; > } > else{ > [self.viewController presentViewController:sf animated:YES > completion:nil]; > } > } > else{ > if ([[UIApplication sharedApplication] canOpenURL:url]) { > [[UIApplication sharedApplication] openURL:url]; > } else { // handle any custom schemes to plugins > [[NSNotificationCenter defaultCenter] > postNotification:[NSNotification > notificationWithName:CDVPluginHandleOpenURLNotification object:url]]; > } > } > } > > - (void)safariViewControllerDidFinish:(SFSafariViewController *)controller{ > [controller dismissViewControllerAnimated:YES completion:nil]; > } > > > Thanks > Jonathan >