PhoneGap / Cordova打开外部链接到Safari而不是全屏幕inApp

时间:2014-04-29 15:43:19

标签: javascript html iframe cordova

我在我的应用中嵌入了GoogleMap。 在嵌入式地图(这是一个iFrame)上,我有来自谷歌的链接:'term of use'。 当我点击链接(客户可以错误地做到这一点)时,它会在我的应用程序和全屏幕中打开页面。然后不可能回到应用程序!

所以我添加了Cordova插件InAppBrowser。我创建了一个小脚本来防止:

 $("a").click(function(e) {
        console.log("checking link");
        var link = e.currentTarget.href;
        var testURL = (link.indexOf("www") > (-1));
        testURL |= (link.indexOf("http") > (-1));
        testURL |= (link.indexOf(".com") > (-1));
        testURL |= (link.indexOf(".fr") > (-1));

        if (testURL) {/*if URL is external open in 'new window'*/
            console.log("Prevent InApp URL FullScreen");
            window.open(link, "_system");
        }
    });

它在页面上的经典链接上运行良好。 主要问题是谷歌地图是在iFrame中!这样我就无法访问jQuery中的元素和$(" a')。点击(.....)无法在iFrame Link上运行!

总结
我想要在Safari而不是我的应用程序中打开任何外部链接(http,wwww,.fr,.com,.org ...等)。或使用InAppBrowser插件,在我的应用程序中打开但不是全屏,以返回应用程序。

你有什么想法吗? 先谢谢你们。

1 个答案:

答案 0 :(得分:4)

我找到了一个解决方案,这可能不是最好的解决方案,因为它只适用于iOs(当然可以扩展到android):

我在MainViewController.m中添加了这段代码:

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType) navigationType
{ NSURL *url = [request URL];

    //mustNotReroot : for the google iFrame, the adress contains "embed" ==> must not be open in safari but in the app
    BOOL mustNotReroot = [url.path rangeOfString:@"embed"].location != NSNotFound;

    // Intercept any external http requests and forward to Safari
    // Otherwise forward to the PhoneGap WebView

    if (([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"])&& !mustNotReroot)
    {
         NSLog(@"Rerouting to Safari %@",url);
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    else
    {
        return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
    }
}

这样任何http或https都会转发到Safari.app。请注意,因为iFrame被理解为外部链接(因为它是XSS iFrame),所以它在Safari中打开,所以我通过添加check mustNotReroot来完成修复。 iFrame网址为:https://www.google.com/maps/embed/v1/directions?key=MyAPI_Key&origin=Campbell&destination=Sunnyvale

因为它包含嵌入我检查它是否包含嵌入,如果是:不要转发到Safari。

如果你有一个更好的解决方案,比如在iOS和Android上工作的javascript修补程序随时可以分享它!