【问题标题】:How to force UIWebView to open link in browser?如何强制 UIWebView 在浏览器中打开链接?
【发布时间】:2013-11-19 12:20:00
【问题描述】:

我们有一个网站。在某些情况下,用户可以使用内置浏览器从 Facebook 应用程序或 VKontakte 应用程序打开。还有一个我想在 Safari 或其他浏览器中打开的链接。但不在此 WebView 中。

是否有任何 HTML 属性或可以告诉 WebView 不能自行打开此链接的内容?

更新:我不是应用程序开发人员。我是网络开发人员。而且我无权访问 Facebook 应用程序。我需要强制 Facebook 应用打开不在其内置浏览器中的链接。

【问题讨论】:

  • 你有没有尝试过?
  • 我尝试将 target="_blank" 添加到链接中,但没有帮助。
  • 不,这不会对UIWebView 做任何事情您尝试过给出的任何答案吗?您需要拦截 shouldStartLoadWithRequest: 中的点击并返回 NO,以便 UIWebView 不会加载,但在返回 NO 之前,您需要做任何您想做的事情。
  • 我无法尝试下面的答案,因为我只能修改网站。
  • 抱歉,您当时错误地标记了您的问题。如果这仅与站点相关并且您没有开发应用程序本身,那么没有objective-c 这与UIWebViews 有什么关系?请正确地重新标记您的问题。

标签: html ios url-scheme


【解决方案1】:

你可以使用 UIWebViewDelegate:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if(UIWebViewNavigationTypeLinkClicked == navigationType /*you can add some checking whether link should be opened in Safari */) {

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

【讨论】:

    【解决方案2】:

    Web 视图包含一些委托方法,可以从该委托方法中找到单击事件,您需要像这样调用 URL

     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"www.google.com"]];
    

    这是在单击 Web 视图中的任何链接时将触发的委托方法

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

    只需将 URL 与 URLRequest 区分开来。

    【讨论】:

    • 你在[[UIApplication sharedApplication] openURL:[[request URL]];中有错字
    • 不同的错字现在应该是[[UIApplication sharedApplication] openURL:[request URL]];
    • 已修复,我可以给 +1。
    【解决方案3】:

    如果你设置了UIWebViewDelegate你可以使用方法

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

    使用此方法,我们可以阻止或允许在UIWebView 或移动浏览器中打开某些链接/网址。

    所以我们可以做类似的事情

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        // We only want to block links
        if(navigationType == UIWebViewNavigationTypeLinkClicked) {
            NSString *url = [[request URL] absoluteString];
            if([url isEqualToString:@"http://www.google.co.uk"]) {
                // If the requested url is a link and is http://www.google.co.uk block it from loading in the UIWebView and load it in the mobile browser.
                if([[UIApplication sharedApplication] canOpenUrl:[request URL]]) {
                    // We should be checking to make sure we can open it first, for whatever reason we might not be able to and we don't want to give the user a bad journey.
                    [[UIApplication sharedApplication] openURL:[request URL]];
    
                    // We also need to tell our UIWebView not to do anything so we need to return NO.
                    return NO;
                }
            }
        }
    
        // If all is OK and we are happy for any other link to be included then just return YES and continue.
        return YES;
    }
    

    如果您想阻止所有链接,只需删除 isEqualToString: if statement 或者您可以通过将 else if 添加到 if statement 来阻止某些链接。此代码执行以下两件事之一

    更新

    事实证明,用户没有做 objective-c 的事情,他们正在做的事情 html 不在原始问题中,但是因为这可以帮助将来的用户,所以我会在这里留下我的答案.

    编辑

    由于用户使用html 尝试将用户引导至移动浏览器,因此他们正在寻找的东西称为 URL 方案。不幸的是,我不相信iOS 7 有任何可以打开 safari 移动浏览器的 URL 方案。 这个问题之前有人问过,所以我不会坐在这里再说一遍,我只会引导您回答问题并回答Open Mobile Safari from a Link in a WebView

    【讨论】:

      【解决方案4】:
      //codigo para abrir no safari
      -(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;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-16
        • 2016-05-31
        • 2019-01-23
        • 1970-01-01
        • 2015-11-30
        • 2011-08-18
        相关资源
        最近更新 更多