【问题标题】:iOS - NSDataDetector: Why does url missing '.com' (http://google) return as valid URL?iOS - NSDataDetector:为什么 url 缺少 '.com' (http://google) 返回为有效 URL?
【发布时间】:2015-01-11 03:33:43
【问题描述】:

我正在尝试使用 NSDataDetector 从文本字段中验证提供的 URL,如果我在任何文本的前面输入包含“http://”的 URL,它总是返回有效。

i.e. http://someurl, http://someotherurl, etc.

仅供参考 - 尽管网络浏览器能够使用上述格式解释 url,但 NSURL 每次使用这种格式时都会返回错误。由于我需要在我的应用程序中使用提供的 URL 调用操作,因此在从提供的 URL 文本创建 NSURL 时它必须是有效的。

关于如何纠正这个问题的任何想法,因为这些 url 不是真的有效?

这是我的代码:

   linkDetector = NSDataDetector(types: NSTextCheckingType.Link.rawValue, error: nil)
    linkDetector?.enumerateMatchesInString(self.textField.text, options: NSMatchingOptions(0), range: NSMakeRange(0, countElements(urlString!)), usingBlock: { (result: NSTextCheckingResult!, flags, stop) -> Void in
            self.validatedUrlString = self.textField.text
    })

【问题讨论】:

    标签: ios http nsurl nsdatadetector


    【解决方案1】:

    根据RFC 1304 Section 3.5,有效的域名扩展(在http://协议说明符之后)可能如下:

    <domain> ::= <subdomain> | " "
    <subdomain> ::= <label> | <subdomain> "." <label>
    <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
    

    本质上,这意味着. 不是域名的要求。一个非常常见的例子是http://localhost,它不包含.

    【讨论】:

      【解决方案2】:

      因为there are new top level domains like .google and .apple 所以现在只包含“apple”的 URL 实际上可能是一个有效的 URL。

      事实上,如果我输入http://apple,那个看似普通的有效 URL 实际上会在 Firefox 中成功解析。

      【讨论】:

      • 是的,这更像是浏览器对输入字符串的解释。但在 iOS 中,尝试使用以下命令创建 NSURL:http:// apple(添加空格以忽略标记)不会返回有效:错误域 = NSURLErrorDomain 代码 = -1003“操作无法完成。(NSURLErrorDomain 错误 - 1003.)" UserInfo=0x7fe7306db1e0 {NSErrorFailingURLStringKey=http://apple/, NSErrorFailingURLKey=http://apple/, _kCFStreamErrorDomainKey=12, _kCFStreamErrorCodeKey=8, NSUnderlyingError=0x7fe7305ab800"操作无法完成。(kCFErrorDomainCFNetwork 错误 - 1003.)"}
      • 听起来你实际上在 NSURL 中发现了一个 bug... 因为我们已经证明 http:// google 是一个有效的 URL。如果 NSDataDetector 认为它是一个 URL,而浏览器认为它是一个 URL,则问题可能出在 NSURL 内部实现中(您可以提交一个radar in Apple's bugreporter 网站)。
      • 没有错误。 +[NSURL URLWithString:] 很乐意从 "http://apple" 创建一个 URL,因此数据检测器是正确的。但是,只有在您的 DNS 可以解析主机名“apple”(这可能取决于您的搜索域等)时,加载 URL 才会成功。现在,Web 浏览器可能会通过添加 .com 来重试查找,如果初始请求失败(实际上,在我的公司网络上,apple 指向一个内部网站,而不是 apple.com),但这不是可以在框架级别完成的事情。这是应用逻辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多