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

Posted

技术标签:

【中文标题】PhoneGap/Cordova 打开外部链接到 Safari 而不是全屏 inApp【英文标题】:PhoneGap/Cordova open external link into Safari instead of full screen inApp 【发布时间】:2014-04-29 15:43:19 【问题描述】:

我在我的应用程序中嵌入了 GoogleMap。 在嵌入式地图(这是一个 iFrame)上,我有来自 google:'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').click(.....) 在 iF​​rame Link 上不起作用!

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

你有什么想法吗? 在此先感谢各位。

【问题讨论】:

【参考方案1】:

我找到了一个解决方案,这可能不是最好的,因为它只适用于 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 中打开的,所以我通过添加检查 mustNotReroot 来进行修复。 iFrame URL 是:https://www.google.com/maps/embed/v1/directions?key=MyAPI_Key&origin=Campbell&destination=Sunnyvale

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

如果您有更好的修复程序,例如适用于 iOS 和 Android 的 javascript 修复程序,请随时分享!

【讨论】:

以上是关于PhoneGap/Cordova 打开外部链接到 Safari 而不是全屏 inApp的主要内容,如果未能解决你的问题,请参考以下文章

PhoneGap Cordova InAppBrowser.open 在 iOS 中切换应用程序之前不会打开链接

Phonegap/Cordova InAppbrowser 文件下载问题

Phonegap / Cordova:jQuery 发布到外部服务器不起作用

在带有外部 URL 的 iOS 上使用 PhoneGap/Cordova

PhoneGap/Cordova ExternalScreen 插件状态“外部 Web 视图不可用”

包含 Google Admob 插件时,Phonegap/Cordova 2.9 iOS 应用内浏览器未打开