【问题标题】:Check if an URL has got http:// prefix检查 URL 是否有 http:// 前缀
【发布时间】:2011-04-16 21:22:30
【问题描述】:


在我的应用程序中,当用户添加一个对象时,也可以为这个对象添加一个链接,然后可以在 webView 中打开该链接。
我试图保存一个不带 http:// 前缀的链接,然后在 webView 中打开它,但无法打开它!
在 webView 开始加载之前,有没有办法检查保存的 URL 是否有 http:// 前缀?如果还没有,我该如何在 URL 中添加前缀?
谢谢!

【问题讨论】:

    标签: ios http url uiwebview hyperlink


    【解决方案1】:

    在 WKNavigationDelegate 的函数 'navigationAction' 中

        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            if navigationAction.navigationType == .linkActivated {
                if let url = navigationAction.request.url {
                    decisionHandler(.cancel)
                    var urlString = url.absoluteString
                    if urlString.lowercased().hasPrefix("http://") == false {
                        urlString = String(format: "http://%@", urlString)
                    }
    
                    let safariViewController = SFSafariViewController(url: url)
                    presentInFullScreen(safariViewController, animated: true, completion: nil)
                } else {
                    decisionHandler(.allow)
                }
            } else {
                decisionHandler(.allow)
            }
        }
    

    【讨论】:

      【解决方案2】:

      最好在URL 对象上使用scheme 属性:

      extension URL {
          var isHTTPScheme: Bool {
              return scheme?.lowercased().contains("http") == true // or hasPrefix
          }
      }
      

      示例用法:

      let myURL = URL(string: "https://stackoverflow.com/a/48835119/1032372")!
      if myURL.isHTTPScheme {
          // handle, e.g. open in-app browser:            
          present(SFSafariViewController(url: url), animated: true)
      } else if UIApplication.shared.canOpenURL(myURL) {
          UIApplication.shared.openURL(myURL)
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用方案属性来检查它。比如……

        if ([yourURL.scheme isEqualToString:@"http"] || [yourURL.scheme isEqualToString:@"https"]) {
            ...
        } 
        

        【讨论】:

          【解决方案4】:

          我在Swift中为String写了一个扩展,看看url字符串是http还是https

          extension String{
          
              func isValidForUrl()->Bool{
          
                  if(self.hasPrefix("http") || self.hasPrefix("https")){
                      return true
                  }
                  return false
              }
          }
          
          if(urlString.isValidForUrl())
              {
                //Do the thing here.
          }
          

          【讨论】:

            【解决方案5】:

            您可以在 NSString 上使用- (BOOL)hasPrefix:(NSString *)aString 方法来查看包含您的 URL 的 NSString 是否以 http:// 前缀开头,如果不是则添加前缀。

            NSString *myURLString = @"www.google.com";
            NSURL *myURL;
            if ([myURLString.lowercaseString hasPrefix:@"http://"]) {
                myURL = [NSURL URLWithString:myURLString];
            } else {
                myURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@",myURLString]];
            }
            

            我目前不在我的 mac 上,无法编译/测试这段代码,但我相信上面的方法应该可以工作。

            【讨论】:

            • 此测试以“HTTP://www.google.com”中断。它也不支持 ftp://,尽管 UIWebView 支持。
            • 我认为我的回答提供了足够的信息,马修可以解决他的问题。
            • 是的,格雷格,这就是我要找的……我将只支持 http 协议,因为它是唯一可以在我的应用程序中提供服务的协议……;)
            • 检查不区分大小写的前缀使用这个:stackoverflow.com/a/18264768/1162959
            【解决方案6】:

            我不确定是否有任何方法可以检查,但您可以在代码中检查。

            尝试使用

            NSRange range = [urlString rangeOfString:@"http://"];
            if (range.location != NSNotFound)
                // Add http://  
            

            【讨论】:

              【解决方案7】:

              首先,您应该为 NSURL 创建一个新类别:文件 > 新文件 > Objective-C 类别。您可以按照 HTTPURLWithString 的方式调用该类别,使其成为 NSURL 的类别,然后按下一步并将其添加到您的目标。然后在 NSURL+HTTPURLFromString.m 中实现以下消息(并在您的 .h 中声明该消息)

              @implementation NSURL (HTTPURLFromString)
              +(NSURL *)HTTPURLFromString:(NSString *)string
              {
                  NSString *searchString = @"http";
                  NSRange prefixRange = [string rangeOfString:searchString options:(NSCaseInsensitiveSearch | NSAnchoredSearch)];
              
                  if (prefixRange.length == 4) {
                      return [NSURL URLWithString:string];
                  }
                  return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", string]];
              
              }
              @end
              

              在WebView中打开链接很简单

              NSString *urlString = @"www.google.com";
              NSURL *url = [NSURL HTTPURLFromString:urlString];
              NSURLRequest *request = [NSURLRequest requestWithURL:url];
              [webView.mainFrame loadRequest:request];
              

              【讨论】:

                【解决方案8】:

                如果您正在检查“http://”,您可能需要不区分大小写的搜索:

                // probably better to check for just http instead of http://
                NSRange prefixRange = 
                    [temp rangeOfString:@"http" 
                                options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
                if (prefixRange.location == NSNotFound)
                

                尽管根据您的具体情况,我认为 url 方案检查是一个更好的答案,因为 URL 可以以 http 或 https 以及其他前缀开头,具体取决于您的用例。

                【讨论】:

                  【解决方案9】:
                  NSString * urlString = ...;
                  NSURL * url = [NSURL URLWithString:urlString];
                  if (![[url scheme] length])
                  {
                    url = [NSURL URLWithString:[@"http://" stringByAppendingString:urlString]];
                  }
                  

                  【讨论】:

                  • 这可能是一个解决方案,但是这种方法将 http:// 添加到 URL...如果 URL 有 http://,这个方法是什么?
                  • 此代码将“http://”添加到所有没有方案的 URL。 “blah”具有“http”方案,因此[[url scheme] length] 不为零,代码保持原样。
                  猜你喜欢
                  • 1970-01-01
                  • 2015-05-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-11-26
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多