如何使用 Safari 应用程序在 UIWebView 中启动链接?

Posted

技术标签:

【中文标题】如何使用 Safari 应用程序在 UIWebView 中启动链接?【英文标题】:How to launch links in UIWebView with the Safari app? 【发布时间】:2010-10-19 21:09:26 【问题描述】:

我有一个小的嵌入式 UIWebView 用于应用程序的 about 部分。当用户点击其中的链接时,该链接会在那个小的嵌入式 UIWebView 中打开,它当然没有导航控件并且不是全屏的。我不喜欢那样。我可以强制它用 Safari 打开链接吗?

【问题讨论】:

【参考方案1】:

可以实现UIWebViewDelegate协议的shouldStartLoadWithRequest方法来拦截链接点击。在该方法中,您可以使用 UIApplication 的 openURL 方法在适当的应用程序中打开 url(即用于 HTTP/HTTPS 的 Safari)。

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

    NSURL *url = [request URL];

    if ([url isEqual:YOUR_HOME_URL_CONTSTANT])
        return YES;

    [[UIApplication sharedApplication] openURL:url];

    return NO;

【讨论】:

当我实现这个时, UIWebView 甚至不会启动本地内容。它仍然是空的……奇怪的事情。什么会导致这种情况?这是否也会影响 [v loadRequest:request] 方法? 在此代码中,您需要检查 URL 以查看是否应在 safari 中加载它。例如,也许您希望以 file: 开头的所有内容都加载到 Web 视图中,在这种情况下,此方法需要返回 YES。我的猜测是 openURL 不会打开文件 url,因为 NO 被返回,所以 webview 也不会加载它。 是的,在我提供的代码 sn-p 中,所有加载请求都被推送到外部应用程序。如果您想以不同的方式加载特定内容,您可以通过任何方式检查 URL 的属性,以确定是本地加载还是远程加载。返回值 BOOL 指定 webView 是否应该继续并尝试加载内容本身。我将使用一个简单的实现来更新示例。【参考方案2】:

你应该实现 UIWebViewDelegate 的shouldStartLoadWithRequest。在这里,您可以看到 UIWebView 何时开始加载 URL。然后你可以处理哪些应该在这个 webView 中加载,哪些应该由 Safari 加载。

我的代码如下:

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType 

    if (inType != UIWebViewNavigationTypeLinkClicked)
    
        //This was not a clicked link, so is probably the initial load 
        //and should be loaded in the UIWebView
        return YES;
    

    //This was a clicked link, so load using Safari
    [[UIApplication sharedApplication] openURL:[inRequest URL]];

    return NO;

这里我使用UIWebViewNavigationType 来确定是否是链接点击,并做出适当的响应。

【讨论】:

以上是关于如何使用 Safari 应用程序在 UIWebView 中启动链接?的主要内容,如果未能解决你的问题,请参考以下文章

在本机 safari 应用程序扩展中,我们如何使用 swift 的参数调用 javascript 函数?

如何让链接在 iOS 中使用 Xcode/Swift 自动打开 safari 应用程序(不是本地)?

如何访问 Safari 中的 redux 商店?

如何使用检查器在 Safari 上调试 Flutter Web App?

使用应用扩展更改 Safari URL

PhoneGap:如何跳过 inAppBrowser 以使用 Safari 打开 url