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