Files
openclaw/apps/shared/OpenClawKit/Sources/OpenClawKit/LocationServiceSupport.swift
2026-03-02 11:32:20 +00:00

50 lines
1.6 KiB
Swift

import CoreLocation
import Foundation
@MainActor
public protocol LocationServiceCommon: AnyObject, CLLocationManagerDelegate {
var locationManager: CLLocationManager { get }
var locationRequestContinuation: CheckedContinuation<CLLocation, Error>? { get set }
}
public extension LocationServiceCommon {
func configureLocationManager() {
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
}
func authorizationStatus() -> CLAuthorizationStatus {
self.locationManager.authorizationStatus
}
func accuracyAuthorization() -> CLAccuracyAuthorization {
LocationServiceSupport.accuracyAuthorization(manager: self.locationManager)
}
func requestLocationOnce() async throws -> CLLocation {
try await LocationServiceSupport.requestLocation(manager: self.locationManager) { continuation in
self.locationRequestContinuation = continuation
}
}
}
public enum LocationServiceSupport {
public static func accuracyAuthorization(manager: CLLocationManager) -> CLAccuracyAuthorization {
if #available(iOS 14.0, macOS 11.0, *) {
return manager.accuracyAuthorization
}
return .fullAccuracy
}
@MainActor
public static func requestLocation(
manager: CLLocationManager,
setContinuation: @escaping (CheckedContinuation<CLLocation, Error>) -> Void) async throws -> CLLocation
{
try await withCheckedThrowingContinuation { continuation in
setContinuation(continuation)
manager.requestLocation()
}
}
}