【问题标题】:Force a WebView link to launch Safari?强制 WebView 链接启动 Safari?
【发布时间】:2011-02-01 17:05:18
【问题描述】:

我的 iPhone 应用程序中嵌入了一个 UIWebView。我希望能够将该 web 视图中的某些链接打开到完整的 Mobile Safari 应用程序(即不是我的嵌入式版本)。

是否有一种简单的方法来构建我的一些 href 来强制执行此操作,而不是在我的嵌入式 web 视图中打开每个链接?

谢谢。

【问题讨论】:

标签: iphone ios uiwebview mobile-safari


【解决方案1】:

布拉德·拉森回答的 Swift 版本:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    var url: NSURL = request.URL!
    var isExternalLink: Bool = url.scheme == "http" || url.scheme == "https" || url.scheme == "mailto"
    if (isExternalLink && navigationType == UIWebViewNavigationType.LinkClicked) {
        return !UIApplication.sharedApplication().openURL(request.URL!)
    } else {
        return true
    }
}

【讨论】:

    【解决方案2】:

    这就是我们解决它的方法,将它添加到您的 ViewController.m 文件中:

        - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        first.delegate = (id)self;
                    [first loadRequest:[NSURLRequest requestWithURL:[NSURL     URLWithString:@"http://my.FellowshipNWA.org?publicapp"]]];
    }
    
    // Add section below so that external links & PDFs will open in Safari.app
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request     navigationType:(UIWebViewNavigationType)navigationType {
        if (navigationType == UIWebViewNavigationTypeOther) {
            NSString *checkURL = @"http://my.fellowshipnwa.org/?givenowsafari";
            NSString *reqURL = request.URL.absoluteString;
            if ([reqURL isEqualToString:checkURL])
                 {
                     [[UIApplication sharedApplication] openURL:request.URL];
                return false;
        }
            else {
                return true;
            }
        }
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      好的,我明白了。也许它不是完美的解决方案,但你可以这样做:

      仅在您的WebViewController.m

      webView.delegate = self; 行添加到viewDidLoad 过程:

      - (void)viewDidLoad {
          webView.delegate = self;
          .... your code ....
      }
      

      然后您可以按照上述布尔结果函数在 Controller.m 文件中的某处添加:

      - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
          if (navigationType == UIWebViewNavigationTypeLinkClicked) {
              [[UIApplication sharedApplication] openURL:request.URL];
              return false;
          }
          return true;
      }
      

      【讨论】:

      • 对于新手来说,设置代理的相关信息很重要 :)
      【解决方案4】:

      我自己没有尝试过,但我认为你可以实现 UIWebViewDelegate 方法

      webView:shouldStartLoadWithRequest:navigationType 
      

      只要点击 UIWebView 中的链接,就会调用它。在该方法中,您只需要确定单击的链接是否应该导致启动 Safari,如果应该,请使用 openURL。

      - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
      
          // Check if this was a click event and then some other criteria for determining if you want to launch Safari.
          if (navigationType == UIWebViewNavigationTypeLinkClicked && [Some other criteria]) {
              [[UIApplication sharedApplication] openURL:request.URL];
      
              // Return false to indicate to the UIWebView to not navigate to the linked target
              return false;
          }
      
          // Return true so that the UIWebView loads the link target
          return true;
      }
      

      不要忘记您需要将 UIWebView 委托属性设置为实现 UIWebViewDelegate 的类的实例。

      【讨论】:

        【解决方案5】:

        为了扩展 Randy 所说的,这是我在我的应用程序中使用的,以使每个 http://、https:// 和 mailto:// URL 在外部 Safari 或 Mail 应用程序中打开:

        -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 
        {
            NSURL *requestURL =[ [ request URL ] retain ]; 
            if ( ( [ [ requestURL scheme ] isEqualToString: @"http" ] || [ [ requestURL scheme ] isEqualToString: @"https" ] || [ [ requestURL scheme ] isEqualToString: @"mailto" ]) 
                && ( navigationType == UIWebViewNavigationTypeLinkClicked ) ) { 
                return ![ [ UIApplication sharedApplication ] openURL: [ requestURL autorelease ] ]; 
            } 
            [ requestURL release ]; 
            return YES; 
        }
        

        正如 Randy 所说,您需要在设置为 UIWebView 委托的任何类中实现此功能。要仅选择 URL 启动 Safari,您可以将其方案从 http:// 更改为 safari:// 或类似的东西,并且仅将这些 URL 踢到系统(在将自定义 URL 方案替换为 http:// 之后) .

        我在我的内部帮助文档中执行此操作,该文档是在 UIWebView 中显示的 HTML,因此在我的应用程序中嵌入通用 Web 浏览器时,我不会在审核过程中遇到问题。

        【讨论】:

        • 保留和释放 URL 是不是很偏执?
        • @morningstar - 也许,现在 ARC 已经过时了,但当时我在其他地方遇到与线程相关的崩溃问题(传递给不同线程方法的自动释放对象被释放该方法的中间),所以我犯了偏执狂的错误。同样,现在 ARC 已经为您完成了这项工作,因此我的代码中不再包含此内容。
        • 是的,好的,由于线程问题,我可以看到它可能是必要的。
        • 如何使用#links 进行这项工作?目前他们也在Safari中开放?谢谢
        猜你喜欢
        • 1970-01-01
        • 2021-04-20
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多