如何在 Safari 中打开外部链接而不是应用程序的 UIWebView?

IT技术 javascript ios cordova
2021-03-05 17:27:37

我有一个 Phonegap (cordova) 应用程序,我想在 phonegap WebView 中加载一些外部网页,我还有其他外部网页,我想在用户激活它们时在 safari 中加载它们。

通常大多数人都会遇到想要在 WebView 中打开外部链接的问题。OpenAllWhitelistURLsInWebView设置YES(在 Cordova.plist/Phongap.plist 中)可以解决这个问题。

但我不想打开WebView 的所有链接,只打开一些。

我希望我可以调用window.open('http://someexternalsite')在 Safariwindow.parent.location.href = 'http://mysite'中打开并在 WebView 中打开它。

知道如何做到这一点吗?

6个回答

如果要在 safari 中打开的链接都包含一个公共字符串,则可以使用下一段代码。

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

    // Intercept the external http requests and forward to Safari.app
    // Otherwise forward to the PhoneGap WebView
    if ([[url scheme] isEqualToString:@"SCHEME"]) {
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    else {
        return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
    }
}

此代码放置AppDelegate.m在 Safari 中将打开所有使用指定 SCHEME 的 URL。

恐怕这就是我所能想到的。

希望这可以帮助

更新 :

代码应该放在 MainViewControler 中,至少对于cordova 2.2.0。

该方法最初被注释。我不得不用它来重定向谷歌地图链接:

NSRange isGoogleMaps = [[url absoluteString] rangeOfString:@"maps.google.com" options:NSCaseInsensitiveSearch];
NSRange isGoogleTerms = [[url absoluteString] rangeOfString:@"terms_maps.html" options:NSCaseInsensitiveSearch];

if(isGoogleMaps.location != NSNotFound || isGoogleTerms.location != NSNotFound ) {
        [[UIApplication sharedApplication] openURL:url];
       return NO;
}
else 
    return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
我也想用这个。这就是您必须放入该文件(而在任何其他文件中没有任何内容)才能使其工作的全部内容吗?我只想target="_blank"在 safari 中打开所有外部链接
2021-04-22 17:27:37
碰巧有人知道用android实现这一目标的方法吗?
2021-04-27 17:27:37
我希望会有更好的方法,但看起来电话间隙不支持我正在寻找的开箱即用的东西。谢谢!
2021-04-28 17:27:37
@AdamD 根据 phonegap 人员的说法,您的建议应该适用build.phonegap.com/blog/access-tags & build.phonegap.com/docs/config-xml我不知道为什么它对我不起作用,也许是因为我正在使用 javascript window.open 而不是通过链接来完成。在那篇文章中还说,如果您不将 URL 添加到白名单,它将在 Android 的外部浏览器中自动打开(适用于 4.1,但由于某种原因不适用于 2.2 等早期版本)。在 iOS 上,您仍然需要将其添加到白名单中,以便在 webview 中或 out 中对 url 执行任何操作。
2021-05-01 17:27:37
if ( [request.URL.absoluteString rangeOfString:@"somedomain.com"].location != NSNotFound) { [[UIApplication sharedApplication]openURL:request.URL]; 返回否;这工作得很好。我从其他帖子中了解到 Cordova 2.0+ 将支持在 safari 中打开 _blank 目标,但尚未对其进行测试。我开始使用我的 android 版本,所以我还需要让它工作。如果有效,我会回来报告
2021-05-05 17:27:37

只需在您的 javascript 中捕获所有具有 的链接target="_blank",然后使用“_system”参数将它们传递给 window.open。这将适用于 iOS 和 Android。

$(document).on('click', 'a[target="_blank"]', function(ev) {
  var url;

  ev.preventDefault();
  url = $(this).attr('href');
  window.open(url, '_system');
});
在 FB 应用程序中在 8.3 上测试,它似乎不再起作用。
2021-04-18 17:27:37
如果它有效,那就太棒了,但在 iOS 8.xx 和 Android 5.xx 上进行了测试,但没有奏效。Native 似乎是唯一的出路。
2021-04-21 17:27:37
_system似乎是 PhoneGap/Cordova 的一个功能:docs.phonegap.com/en/2.3.0 / ...
2021-05-16 17:27:37

根据@TDeBailleul 的回答,这对我有用。基本上,任何具有 PDF 后缀的链接,或者如果它是我想在 Safari 中打开的特定页面,或者如果它不是 www.example.com/*(外部链接)中的页面,它将在新窗户:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    // Open PDF files, Specific Pages, and External Links (not beginning with http://www.example.com) in Safari.app
    if (
        (navigationType == UIWebViewNavigationTypeLinkClicked) && 
        ([[[request URL] absoluteString] hasSuffix:@"pdf"] || [[[request URL] absoluteString] hasPrefix:@"http://www.example.com/specific-page.php"] || ![[[request URL] absoluteString] hasPrefix:@"http://www.example.com"])
        ) { 

        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    } 

    return YES;
}

希望这对其他人有帮助!

是的,这对我也有效。有没有运气让类似的东西适用于 Android(2.2 版)?
2021-05-10 17:27:37

您可以(从 phonegap 1.5.0 开始)使用:

<a href="some://external/url" target="_blank">Click Me</a>

这应该会导致 phonegap 启动本机浏览器。

我认为 user868766 指的是要使上述工作正常运行,您需要将外部 url 列入白名单。我一直在开发的应用程序在本机浏览器中打开了新闻故事的来源,因此我们在白名单中使用了 * 以确保我们没有排除任何来源。

希望有帮助。

我试过这个,它似乎没有做任何事情。相反,我尝试在 javascript 中执行此操作,但它似乎没有执行任何操作 window.open("some://external/url", "_blank"); 我还将 webview 中打开的所有白名单 url 设置为 true,因为我的主应用程序实际上是一个 webapp,phonegap 应用程序仅用作登录页面,在通过身份验证后,重定向到 webapp。如果客户端需要更新,它应该重定向到另一个位置(而不是 web 应用程序)。
2021-05-10 17:27:37
@MatthewLevine 您仍然需要在Cordova.plist. 如果您需要允许任何域,则只有一个ExternalHosts条目*
2021-05-15 17:27:37

正确的做法是使用inAppBrowser 插件

使用cordova CLI安装它:

cordova plugin add org.apache.cordova.inappbrowser

然后,要在 safari 上打开链接,只需使用:

window.open('http://apache.org', '_system');

有一个新版本的插件托管在 npm 上

从cordova CLI安装它:

cordova plugin add cordova-plugin-inappbrowser

要在 safari 上打开网站,您可以使用

cordova.InAppBrowser.open('http://apache.org', '_system');

或者,如果您想像旧版本一样继续使用 window.open,您可以在设备就绪事件中执行此操作:

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    window.open = cordova.InAppBrowser.open;
}