iOS 17 的 URL 和 16 的 URLComponents 可以自動對網址進行 URL Encoding

網址只能包含 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)
}

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com