Browse Source

修复超时定位引发的崩溃

weicu
liwei1dao 1 year ago
parent
commit
c6d97a7ee6
  1. 22
      local_plugins/chat_api/ios/chat_api/Sources/chat_api/QQMusicSystemFunctionHandler.swift
  2. 28
      local_plugins/chat_api/ios/chat_api/Sources/chat_api/SystemFunctionHandler.swift

22
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\"}")
}
}
)

28
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))
}
}
}

Loading…
Cancel
Save