From dc876ce16879fd25a7f81077ad7fcb105c64e354 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Mon, 29 Sep 2025 20:05:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B6=85=E6=97=B6=E5=AE=9A?= =?UTF-8?q?=E4=BD=8D=E5=BC=95=E5=8F=91=E7=9A=84=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QQMusicSystemFunctionHandler.swift | 22 ++++++++++++--- .../chat_api/SystemFunctionHandler.swift | 28 +++++++++++++------ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/QQMusicSystemFunctionHandler.swift b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/QQMusicSystemFunctionHandler.swift index 2558ca63b..cc5a9e047 100644 --- a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/QQMusicSystemFunctionHandler.swift +++ b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/QQMusicSystemFunctionHandler.swift @@ -141,6 +141,20 @@ private class QQMusicSearchHandler: FunctionHandler { } return await withCheckedContinuation { continuation in + // 添加线程安全的恢复保护 + var isResumed = false + let resumeLock = NSLock() + + func safeResume(with result: String) { + resumeLock.lock() + defer { resumeLock.unlock() } + + if !isResumed { + isResumed = true + continuation.resume(returning: result) + } + } + // 调用更新后的搜索接口,包含错误处理 QPlayAutoManager.shared.search( keyword: keyword, @@ -173,9 +187,9 @@ private class QQMusicSearchHandler: FunctionHandler { do { let jsonData = try JSONSerialization.data(withJSONObject: result) let jsonString = String(data: jsonData, encoding: .utf8) ?? "{}" - continuation.resume(returning: jsonString) + safeResume(with: jsonString) } catch { - continuation.resume(returning: "{\"success\": false, \"error\": \"JSON serialization failed\"}") + safeResume(with: "{\"success\": false, \"error\": \"JSON serialization failed\"}") } }, onError: { error in @@ -193,9 +207,9 @@ private class QQMusicSearchHandler: FunctionHandler { do { let jsonData = try JSONSerialization.data(withJSONObject: result) let jsonString = String(data: jsonData, encoding: .utf8) ?? "{}" - continuation.resume(returning: jsonString) + safeResume(with: jsonString) } catch { - continuation.resume(returning: "{\"success\": false, \"error\": \"Search failed and JSON serialization failed\"}") + safeResume(with: "{\"success\": false, \"error\": \"Search failed and JSON serialization failed\"}") } } ) diff --git a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/SystemFunctionHandler.swift b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/SystemFunctionHandler.swift index 93db410fa..5e13cf25b 100644 --- a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/SystemFunctionHandler.swift +++ b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/SystemFunctionHandler.swift @@ -411,16 +411,30 @@ private class GetCurrentLocationHandler: FunctionHandler { print("[GetCurrentLocationHandler] 开始处理位置请求") return await withCheckedContinuation { continuation in + // 添加线程安全的恢复保护 + var isResumed = false + let resumeLock = NSLock() + + func safeResume(with result: String) { + resumeLock.lock() + defer { resumeLock.unlock() } + + if !isResumed { + isResumed = true + continuation.resume(returning: result) + } + } + // 设置超时 let timeoutTask = Task { - try await Task.sleep(nanoseconds: 15_000_000_000) // 15秒 (15 * 1_000_000_000 nanoseconds) - continuation.resume(returning: self.createErrorResponse(message: "位置获取超时,请检查网络连接后重试")) + try await Task.sleep(nanoseconds: 15_000_000_000) // 15秒 + safeResume(with: self.createErrorResponse(message: "位置获取超时,请检查网络连接后重试")) } // 检查位置服务是否可用 guard CLLocationManager.locationServicesEnabled() else { timeoutTask.cancel() - continuation.resume(returning: self.createErrorResponse(message: "位置服务未启用。请前往 设置 > 隐私与安全 > 定位服务 启用定位服务")) + safeResume(with: self.createErrorResponse(message: "位置服务未启用。请前往 设置 > 隐私与安全 > 定位服务 启用定位服务")) return } @@ -434,26 +448,24 @@ private class GetCurrentLocationHandler: FunctionHandler { // 解析位置数据 guard let latStr = locationInfo["user_lat"] as? String, let lngStr = locationInfo["user_lng"] as? String, - let latitude = Double(latStr), let longitude = Double(lngStr) else { print("[GetCurrentLocationHandler] 位置数据格式错误") - continuation.resume(returning: self.createErrorResponse(message: "位置数据格式错误,请重试")) + safeResume(with: self.createErrorResponse(message: "位置数据格式错误,请重试")) return } print("[GetCurrentLocationHandler] 位置获取成功: lat=\(latitude), lng=\(longitude)") - // let message = "当前位置:\(address)(纬度 \(latitude),经度 \(longitude))" let successResponse = self.createSuccessResponse(latitude: latitude, longitude: longitude) print("[GetCurrentLocationHandler] 返回位置结果") - continuation.resume(returning: successResponse) + safeResume(with: successResponse) case .failure(let error): print("[GetCurrentLocationHandler] 位置获取失败: \(error.localizedDescription)") let errorMessage = self.getUserFriendlyErrorMessage(error) - continuation.resume(returning: self.createErrorResponse(message: errorMessage)) + safeResume(with: self.createErrorResponse(message: errorMessage)) } } }