集成高德 SDK 并替换所有定位相关的 CoreLocation 与 MapKit

This commit is contained in:
2026-07-07 11:49:22 +08:00
parent 3acbf6315b
commit 8a4a30111c
29 changed files with 748 additions and 240 deletions

View File

@ -3,12 +3,11 @@
// suixinkan
//
import CoreLocation
import UIKit
/// Tab Android `MainTabViewModel.signIn`
@MainActor
final class MainTabScanHandler: NSObject, CLLocationManagerDelegate {
final class MainTabScanHandler {
var onShowMessage: ((String) -> Void)?
var onShowSignIn: ((OrderSignInResponse) -> Void)?
@ -18,15 +17,12 @@ final class MainTabScanHandler: NSObject, CLLocationManagerDelegate {
var onNavigateBindAcquirer: ((Int) -> Void)?
private let api: OrderAPI
private let locationManager = CLLocationManager()
private var locationContinuation: ((Result<CLLocationCoordinate2D, Error>) -> Void)?
private let locationProvider: any LocationProviding
private(set) var pendingMultiVerify: MultiVerifyParseData?
init(api: OrderAPI) {
init(api: OrderAPI, locationProvider: any LocationProviding = LocationProvider.shared) {
self.api = api
super.init()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationProvider = locationProvider
}
func handleScanResult(_ scanResult: String) async {
@ -141,14 +137,8 @@ final class MainTabScanHandler: NSObject, CLLocationManagerDelegate {
}
private func fetchSpotsForMultiVerify(pending: MultiVerifyParseData) async {
let status = locationManager.authorizationStatus
guard status == .authorizedWhenInUse || status == .authorizedAlways else {
locationManager.requestWhenInUseAuthorization()
onShowMessage?("缺少定位权限,功能无法进行")
return
}
do {
let coordinate = try await requestLocation()
let coordinate = try await locationProvider.requestCoordinate()
let response = try await api.multiTravelScenicSpotList(
orderNumber: pending.orderNumber,
lat: coordinate.latitude,
@ -160,35 +150,12 @@ final class MainTabScanHandler: NSObject, CLLocationManagerDelegate {
} else {
onShowMultiVerifySheet?(spots, spots.first)
}
} catch LocationProviderError.permissionDenied {
onShowMessage?(OrderLocationError.permissionDenied.errorDescription ?? "缺少定位权限,功能无法进行")
} catch {
onShowMessage?(error.localizedDescription)
onShowMessage?((error as? LocalizedError)?.errorDescription ?? error.localizedDescription)
}
}
private func requestLocation() async throws -> CLLocationCoordinate2D {
try await withCheckedThrowingContinuation { continuation in
locationContinuation = { result in
switch result {
case .success(let coordinate):
continuation.resume(returning: coordinate)
case .failure(let error):
continuation.resume(throwing: error)
}
}
locationManager.requestLocation()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
locationContinuation?(.success(location.coordinate))
locationContinuation = nil
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
locationContinuation?(.failure(error))
locationContinuation = nil
}
}
private extension MainTabScanHandler {