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

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

【问题讨论】:

    标签: iphone ipad uiwebview


    【解决方案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 来确定是否是链接点击,并做出适当的响应。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2011-02-08
      • 2017-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2023-03-22
      • 2014-11-01
      • 1970-01-01
      相关资源
      最近更新 更多