如何使用 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 应用程序(不是本地)?