45 lines
1.3 KiB
Swift
45 lines
1.3 KiB
Swift
import CoreLocation
|
|
import Foundation
|
|
|
|
public enum LocationCurrentRequest {
|
|
public typealias TimeoutRunner = @Sendable (
|
|
_ timeoutMs: Int,
|
|
_ operation: @escaping @Sendable () async throws -> CLLocation
|
|
) async throws -> CLLocation
|
|
|
|
@MainActor
|
|
public static func resolve(
|
|
manager: CLLocationManager,
|
|
desiredAccuracy: OpenClawLocationAccuracy,
|
|
maxAgeMs: Int?,
|
|
timeoutMs: Int?,
|
|
request: @escaping @Sendable () async throws -> CLLocation,
|
|
withTimeout: TimeoutRunner) async throws -> CLLocation
|
|
{
|
|
let now = Date()
|
|
if let maxAgeMs,
|
|
let cached = manager.location,
|
|
now.timeIntervalSince(cached.timestamp) * 1000 <= Double(maxAgeMs)
|
|
{
|
|
return cached
|
|
}
|
|
|
|
manager.desiredAccuracy = self.accuracyValue(desiredAccuracy)
|
|
let timeout = max(0, timeoutMs ?? 10000)
|
|
return try await withTimeout(timeout) {
|
|
try await request()
|
|
}
|
|
}
|
|
|
|
public static func accuracyValue(_ accuracy: OpenClawLocationAccuracy) -> CLLocationAccuracy {
|
|
switch accuracy {
|
|
case .coarse:
|
|
kCLLocationAccuracyKilometer
|
|
case .balanced:
|
|
kCLLocationAccuracyHundredMeters
|
|
case .precise:
|
|
kCLLocationAccuracyBest
|
|
}
|
|
}
|
|
}
|