【问题标题】:NSURL is returning nil for a valid URLNSURL 为有效的 URL 返回 nil
【发布时间】:2016-01-15 05:49:58
【问题描述】:

我有一个有效的 google maps 网址,如果您在浏览器中运行它会显示地图图像。但是,当我将它放在我的 Swift 代码中并尝试从 String 创建一个 NSURL 时,它返回 nil

let urlString = "https://maps.googleapis.com/maps/api/staticmap?maptype=hybrid&center=37.33233141,-122.0312186&path=color:0xff0000|weight:10|37.33233141,-122.0312186|21.422570,%2039.826190&markers=color:blue%7Clabel:S%7C37.33233141,-122.0312186&markers=color:blue%7Clabel:S%7C21.422570,39.826190&zoom=1&size=1080x1920"
let url = NSURL(string: urlString)

目前,这返回 nil,我不知道为什么。我做错了吗?

【问题讨论】:

  • 我建议你打开一个playground,尝试删除奇怪的字符(:,|),直到它起作用为止。
  • 给定的字符串绝对不是有效的 url 字符串。罪魁祸首是字符“|”这在查询组件中是不允许的。由于查询组件似乎已经被编码,这也表明了浏览器中的一个错误:如果浏览器做得对,它会将 百分比转义 | 字符到 %7C

标签: ios swift nsurl


【解决方案1】:

它应该可以工作:这就是为什么http://www.url-encode-decode.com

        let url = NSURL(string: urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)

由于不推荐使用上述 API,因此替代方法是

    let url = NSURL(string: urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)

【讨论】:

  • 您能否添加一些解释为什么您的代码应该有效?对于偶然发现这个问题的其他读者来说,纯代码答案并不是很有用。
  • @Cristik。请立即查看答案。
  • @real19 应用此功能只是碰巧起作用。鉴于提供的字符串是格式错误的 url,并且文档明确指出该函数对于“治愈”部分转义的 url 字符串是有问题的,而且该函数也被 deprecated 的事实 - 我强烈建议不要使用。
【解决方案2】:

看着Apple documentation

此方法要求 URLString 仅包含格式正确的 URL 中允许的字符。所有其他字符必须正确地进行百分比转义。任何百分比转义的字符都使用 UTF-8 编码进行解释。

您的字符串中可能存在不正确的内容,您需要在将其传递给NSURL 之前对其进行编码,您可以通过stringByAddingPercentEncodingWithAllowedCharacters 执行此操作:

if let encodedString = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet() {
    url = NSURL(string: urlString)
}

【讨论】:

  • 正如 OPs 问题中提到的,实际上给定的 URL 字符串不是有效的 url 字符串。它已经编码了。所以,你实际上是双倍编码它。
  • @CouchDeveloper 嗯......你有一个有效的观点,对于这个特定的问题,它的工作原理是查询是无效的 URLQueryAllowedCharacterSet() 不会影响 URL 中的字符。所以该函数返回一个有效的 url。尽管如此,这并不是解决所有可能情况的最佳解决方案......
  • 由于给定的 URL 字符串格式不正确,我们应该对将其作为输入的函数没有任何期望。相反,我们应该尝试修复这个格式错误的字符串的来源。相关的 RFC 已经明确定义了有效 URL 字符串的外观。还提供了一个 BNF,这使得组合和解析字符串变得容易。网络已经存在了几十年——我们应该期待这些东西现在最终能正常工作。但是,看到这些非常基本和关键的事情怎么会出错,这仍然很有趣;)
猜你喜欢
  • 2020-04-22
  • 2015-07-30
  • 1970-01-01
  • 2015-04-02
  • 2014-10-11
  • 2016-01-24
  • 2015-12-09
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多