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

Reply via email to