// // ScenicSelectionLocationProvider.swift // suixinkan // // Created by Codex on 2026/6/23. // import CoreLocation import Foundation /// 景区选择定位服务,负责向系统请求一次当前位置。 final class ScenicSelectionLocationProvider: NSObject, CLLocationManagerDelegate { var onLocation: ((CLLocation) -> Void)? var onFailure: ((String) -> Void)? private let manager = CLLocationManager() /// 初始化定位服务并配置精度。 override init() { super.init() manager.delegate = self manager.desiredAccuracy = kCLLocationAccuracyHundredMeters } /// 请求一次当前位置;未授权时先触发系统授权弹窗。 func request() { switch manager.authorizationStatus { case .notDetermined: manager.requestWhenInUseAuthorization() case .authorizedAlways, .authorizedWhenInUse: manager.requestLocation() case .denied, .restricted: onFailure?("定位权限未开启,请在系统设置中允许访问位置") @unknown default: onFailure?("定位状态不可用") } } /// 监听授权状态变化,并在授权后继续请求定位。 func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { switch manager.authorizationStatus { case .authorizedAlways, .authorizedWhenInUse: manager.requestLocation() case .denied, .restricted: onFailure?("定位权限未开启,请在系统设置中允许访问位置") default: break } } /// 接收系统返回的位置。 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let location = locations.last { onLocation?(location) } } /// 接收系统定位错误。 func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { onFailure?("定位失败:\(error.localizedDescription)") } }