From a8e69d4ee7637e09e595f5d7153ee8019ccc24ed Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 11 Dec 2025 20:07:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9iOS=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/XunFeiAsrHelper.swift | 52 +++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift index 9b4c4455e..b9f703831 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift @@ -145,13 +145,29 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { } private func processResult(_ json: [String: Any]) { - guard let dataStr = json["data"] as? String, - let dataData = dataStr.data(using: .utf8), - let data = try? JSONSerialization.jsonObject(with: dataData, options: []) as? [String: Any] else { + var data: [String: Any]? = nil + + 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 } - 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], let st = cn["st"] as? [String: Any], let rt = st["rt"] as? [[String: Any]] else { @@ -229,10 +245,25 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { let signature = calculateSignature(params: params) params["signature"] = signature - var urlComponents = URLComponents(string: baseWsUrl) - urlComponents?.queryItems = params.map { URLQueryItem(name: $0.key, value: $0.value) } + // 手动构建 URL 查询字符串,确保编码一致性 + 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 { @@ -247,6 +278,8 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { var baseStr = "" var first = true + let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~") + for key in sortedKeys { if key == "signature" { continue } guard let value = params[key], !value.isEmpty else { continue } @@ -255,8 +288,9 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { 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)" first = false