0x00 背景
在如以往一样写着代码, 发现了问题, 举个例子 let url = URL(string: "https://www.baidu.com?search=你好")
, 按照 iOS17 之前没有编码的字符串是生成不了 url 的, 这里的 url == nil
但是在 iOS17 遇到的问题是不一样了, 犹豫服务器数据没有注意这个, 客户端也没有写编码, 在 iOS17 Xcode15 写的时候并没有任何异样, 在测试手里的设备就出问题了
0x01 问题在哪
查阅了官网文档 https://developer.apple.com/documentation/foundation/url/3126806-init, 发现有个重要的提示
Important
For apps linked on or after iOS 17 and aligned OS versions,URL
parsing has updated from the obsolete RFC 1738/1808 parsing to the same RFC 3986 parsing asURLComponents
. This unifies the parsing behaviors of theURL
andURLComponents
APIs. Now,URL
automatically percent- and IDNA-encodes invalid characters to help create a valid URL.
根据这段提示知道了, 在 iOS 17 之前,URL 初始化时支持的是较久的 RFC 1738/1808
标准, iOS17 后全面支持 RFC 3986
标准
0x02 RFC 是什么
RFC 是 Request for Comments
的首字母缩写,是互联网工程任务组 (IETF)的对于 URL 的规范出的文档,其中包含有关互联网和计算机网络相关主题(如路由、寻址和传输技术)的规范和组织说明。
0x03 怎么兼容
iOS 17 有一个 api public init?(string: String, encodingInvalidCharacters: Bool)
, 其中 encodingInvalidCharacters
,这个参数代表是否 encoding 掉无效的字符,如果传 false,URL 的行为将会和 iOS 16 上一致。
// iOS 16
let url = URL(string: "https://www.baidu.com?search=你好") // => nil
// iOS 17
let url = URL(string: "https://www.baidu.com?search=你好", encodingInvalidCharacters: false) // => nil
网友评论