You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:19:57