Integrate scenic selection and permission flows into home routing, add AMap SDK for device builds while keeping arm64 simulators compilable via Podfile post_install hooks. Co-authored-by: Cursor <cursoragent@cursor.com>
63 lines
2.0 KiB
Swift
63 lines
2.0 KiB
Swift
//
|
||
// 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)")
|
||
}
|
||
}
|