iOS 17 的 URL 和 16 的 URLComponents 可以自動對網址進行 URL Encoding
Published in
4 min readAug 17, 2022
網址只能包含 ASCII character-set 裡的文字,因此當我們將網址的字串變成 URL 時,若是網址包含 ASCII character-set 以外的字元,比方中文,則須對網址進行 URL Encoding,將這些特別字元轉換成 % 開頭的十六進位數字。
新版做法
從前我們必須手動對網址進行 URL Encoding,不過從 iOS 16 和 17 開始,URL 和 URLComponents 可以自動對網址進行 URL Encoding,方法如下。
- iOS 17 的 URL。
從 iOS 17 開始,生成 URL 時,我們可以直接傳入 ASCII character-set 以外的字元,它會自動幫我們進行 URL Encoding,不用再擔心網址裡有中文了。(ps: 在舊版以下的寫法則會得到 nil。)
let url = URL(string: "https://itunes.apple.com/search?term=戴佩妮&media=music&country=tw")
印出的結果
https://itunes.apple.com/search?term=%E6%88%B4%E4%BD%A9%E5%A6%AE&media=music&country=tw
如果不想要自動進行 URL Encoding,則可採用以下寫法,在參數 encodingInvalidCharacters 傳入 false。
let url = URL(string: "https://itunes.apple.com/search?term=戴佩妮&media=music&country=tw", encodingInvalidCharacters: false)
- iOS 16 的 URLComponents。
從 iOS 16 開始,生成 URLComponents 時,我們可以直接傳入 ASCII character-set 以外的字元,它會自動幫我們進行 URL Encoding。
let urlString = "https://itunes.apple.com/search?term=戴佩妮&media=music&country=tw"
if let url = URLComponents(string: urlString)?.url {
print(url)
}
舊版做法
手動對網址字串進行 URL Encoding 有以下兩種方法:
- 從字串呼叫
addingPercentEncoding(withAllowedCharacters:)
if let urlStr = "https://itunes.apple.com/search?term=戴佩妮&media=music&country=tw".addingPercentEncoding(withAllowedCharacters:.urlQueryAllowed),
let url = URL(string: urlStr) {
print(url)
}
- 使用 URLComponents 搭配 query 或 queryItems
var urlComponents = URLComponents(string: "https://itunes.apple.com/search")!
urlComponents.query = "term=戴佩妮&media=music&country=tw"
if let url = urlComponents.url {
print(url)
}