我正在使用 Swift 框架ASWebAuthenticationSession來通過瀏覽器為我的應用程式添加身份驗證。處理憑據后,身份驗證提供程式發送帶有特殊前綴的 URL,該 URL 會被我的應用程式攔截。URL 具有以下格式:
mycallback:un%3Dtest%26as%3D1%26token%3DeyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=
現在我想創建一個提取引數值的方法。所以我使用 URLComponents。我需要用 '?' 替換 ':',但盡管它將百分比編碼字符轉換回 ascii,但似乎無法正確決議 url
(lldb) po URLComponents(string: "mycallback?un=test&as=1&token=eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=")
? Optional<URLComponents>
? some : mycallback%3Fun%3Dtest%26as%3D1%26token%3DeyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=
- path : "mycallback?un=test&as=1&token=eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0="
(lldb) po URLComponents(string: "mycallback?un=test&as=1&token=eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=")?.queryItems
nil
另一種方法是按原樣使用截獲的 URL 并獲取方案 路徑,但如何從該結構中查詢引數?
(lldb) po URLComponents(string: "mycallback:un=test&as=1&token=eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=")
? Optional<URLComponents>
? some : mycallback:un%3Dtest%26as%3D1%26token%3DeyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=
- scheme : "mycallback"
- path : "un=test&as=1&token=eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0="
僅當我提前手動將百分比 encodingp 符號轉換為它們的 ascii 表示時,查詢才看起來不錯:
(lldb) po URLComponents(string: "mycallback?un=test&as=1&token=eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=")
? Optional<URLComponents>
? some : mycallback?un=test&as=1&token=eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=
- path : "mycallback"
? queryItems : 3 elements
? 0 : un=test
- name : "un"
? value : Optional<String>
- some : "test"
? 1 : as=1
- name : "as"
? value : Optional<String>
- some : "1"
? 2 : token=eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=
- name : "token"
? value : Optional<String>
- some : "eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0="
So my question is how to convert all percent encoding symbols (formatted with '%' followed by hex value) to their ascii representation ?
uj5u.com熱心網友回復:
您有一個方案所在的 URL,mycallback而路徑實際上是一個查詢。你只需要決議和調整它。
func decodedParameters(string: String) -> [URLQueryItem]? {
var c = URLComponents()
c.query = URLComponents(string: data)?.path
return c.queryItems
}
if let parameters = decodedParameters(string: data),
let token = parameters.first(where: { $0.name == "token"})?.value {
print(token)
}
// eyJiYmIiOiJBc2RhIiwgImRzY3ZnIjoiYXNhc2NkIn0=
如果你經常這樣做,你可能更喜歡創建一個擴展來讓它更容易一些:
extension Array where Element == URLQueryItem {
subscript(_ key: String) -> String? {
first(where: { $0.name == key})?.value
}
}
let parameters = decodedParameters(string: data) ?? []
if let token = parameters["token"] {
print(token)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/322509.html
