|
|
@ -145,13 +145,29 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private func processResult(_ json: [String: Any]) { |
|
|
private func processResult(_ json: [String: Any]) { |
|
|
guard let dataStr = json["data"] as? String, |
|
|
var data: [String: Any]? = nil |
|
|
let dataData = dataStr.data(using: .utf8), |
|
|
|
|
|
let data = try? JSONSerialization.jsonObject(with: dataData, options: []) as? [String: Any] else { |
|
|
if let dataDict = json["data"] as? [String: Any] { |
|
|
|
|
|
data = dataDict |
|
|
|
|
|
} else if let dataStr = json["data"] as? String, |
|
|
|
|
|
let dataData = dataStr.data(using: .utf8) { |
|
|
|
|
|
data = try? JSONSerialization.jsonObject(with: dataData, options: []) as? [String: Any] |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
guard let data = data else { |
|
|
|
|
|
print("\(tag): Failed to parse data field from result") |
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
let ls = data["ls"] as? Bool ?? false |
|
|
var ls = false |
|
|
|
|
|
if let lsBool = data["ls"] as? Bool { |
|
|
|
|
|
ls = lsBool |
|
|
|
|
|
} else if let lsInt = data["ls"] as? Int { |
|
|
|
|
|
ls = (lsInt != 0) |
|
|
|
|
|
} else if let lsStr = data["ls"] as? String { |
|
|
|
|
|
ls = (lsStr == "true" || lsStr == "1") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
guard let cn = data["cn"] as? [String: Any], |
|
|
guard let cn = data["cn"] as? [String: Any], |
|
|
let st = cn["st"] as? [String: Any], |
|
|
let st = cn["st"] as? [String: Any], |
|
|
let rt = st["rt"] as? [[String: Any]] else { |
|
|
let rt = st["rt"] as? [[String: Any]] else { |
|
|
@ -229,10 +245,25 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { |
|
|
let signature = calculateSignature(params: params) |
|
|
let signature = calculateSignature(params: params) |
|
|
params["signature"] = signature |
|
|
params["signature"] = signature |
|
|
|
|
|
|
|
|
var urlComponents = URLComponents(string: baseWsUrl) |
|
|
// 手动构建 URL 查询字符串,确保编码一致性 |
|
|
urlComponents?.queryItems = params.map { URLQueryItem(name: $0.key, value: $0.value) } |
|
|
var queryString = "" |
|
|
|
|
|
let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~") |
|
|
|
|
|
|
|
|
|
|
|
// 按照参数名的字母顺序排序,虽然 HTTP 协议不强制,但通常是个好习惯,也方便调试 |
|
|
|
|
|
let sortedParams = params.sorted { $0.key < $1.key } |
|
|
|
|
|
|
|
|
return urlComponents?.url?.absoluteString ?? baseWsUrl |
|
|
for (index, (key, value)) in sortedParams.enumerated() { |
|
|
|
|
|
if index > 0 { |
|
|
|
|
|
queryString += "&" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let encodedKey = key.addingPercentEncoding(withAllowedCharacters: allowed) ?? key |
|
|
|
|
|
let encodedValue = value.addingPercentEncoding(withAllowedCharacters: allowed) ?? value |
|
|
|
|
|
|
|
|
|
|
|
queryString += "\(encodedKey)=\(encodedValue)" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return "\(baseWsUrl)?\(queryString)" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private func getUtcTime() -> String { |
|
|
private func getUtcTime() -> String { |
|
|
@ -247,6 +278,8 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { |
|
|
var baseStr = "" |
|
|
var baseStr = "" |
|
|
var first = true |
|
|
var first = true |
|
|
|
|
|
|
|
|
|
|
|
let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~") |
|
|
|
|
|
|
|
|
for key in sortedKeys { |
|
|
for key in sortedKeys { |
|
|
if key == "signature" { continue } |
|
|
if key == "signature" { continue } |
|
|
guard let value = params[key], !value.isEmpty else { continue } |
|
|
guard let value = params[key], !value.isEmpty else { continue } |
|
|
@ -255,8 +288,9 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { |
|
|
baseStr += "&" |
|
|
baseStr += "&" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
let encodedKey = key.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? key |
|
|
// 使用严格的编码规则 |
|
|
let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? value |
|
|
let encodedKey = key.addingPercentEncoding(withAllowedCharacters: allowed) ?? key |
|
|
|
|
|
let encodedValue = value.addingPercentEncoding(withAllowedCharacters: allowed) ?? value |
|
|
|
|
|
|
|
|
baseStr += "\(encodedKey)=\(encodedValue)" |
|
|
baseStr += "\(encodedKey)=\(encodedValue)" |
|
|
first = false |
|
|
first = false |
|
|
|