Swift中曾正常工作的URL为何解析失败?URL解析器是否变更?
Swift URL解析相关问题解答
核心结论
Swift的URL解析逻辑(基于Foundation的URL类)并未发生突然的破坏性变更。你遇到的问题本质是{和}属于RFC 3986标准中需要编码的非保留字符,之前的“正常解析”属于解析器的宽松容错,而现在解析逻辑更严格遵循标准,导致未编码的特殊字符无法生成合法URL对象。
解决方案
要正确生成URL对象,必须对{和}进行百分号编码:
{对应编码:%7B}对应编码:%7D
代码示例
方式1:手动替换特殊字符
import UIKit var greeting = "https://foo.foo.com/ddm/trackimp/N61.foo.COM/B;gdpr=${GDPR};" // 替换{和}为编码后的字符 let encodedGreeting = greeting.replacingOccurrences(of: "{", with: "%7B") .replacingOccurrences(of: "}", with: "%7D") let u = URL(string: encodedGreeting) // 此时u会是合法的URL对象
方式2:使用系统编码方法(更通用)
如果URL中还有其他潜在特殊字符,建议用系统方法批量编码路径或查询参数部分:
import UIKit let baseURL = "https://foo.foo.com/ddm/trackimp/N61.foo.COM/B;" let queryPart = "gdpr=${GDPR};" // 对查询部分进行编码 if let encodedQuery = queryPart.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) { let fullURLString = baseURL + encodedQuery let u = URL(string: fullURLString) }
注:
.urlQueryAllowed字符集包含了查询参数中允许的合法字符,会自动对{}这类字符进行编码。
补充说明
RFC 3986明确规定,URL中除了保留字符(如:/?#[]@!$&'()*+,;=)和未保留字符(字母、数字、-._~)之外的字符,都需要进行百分号编码。旧版本的iOS/macOS系统可能对非标准字符有宽松处理,但随着系统迭代,解析逻辑逐步严格化,这才导致之前的代码现在失效。
内容的提问来源于stack exchange,提问作者Rob Bonner
相关产品推荐
相关产品推荐

