一个基于 Combine 的 CoreLocation 提供者。
每次从包装的 CLLocationManager
更新设备位置时,它都会提供最新的位置作为已发布的 CLLocation
对象,并通过名为 locationWillChange
的 PassthroughSubject<CLLocation, Never>
发布。
初始化并启动 LocationProvider
import LocationProvider
let locationProvider = LocationProvider()
do {
try locationProvider.start()
}
catch {
// handle the lack of authorization, e.g. by
// locationProvider.requestAuthorization()
}
需要捕获潜在的位置访问授权错误 LocationProviderError.noAuthorization
。
可以通过以下方式弹出标准位置访问用户对话框:
locationProvider.requestAuthorization()
默认情况下,它会请求 authorizedWhenInUse
类型的访问权限。
LocationProvider
具有一个属性 onAuthorizationStatusDenied
,用于定义在当前位置访问被拒绝的情况下要执行的操作。 默认操作是显示一个警报 (presentLocationSettingsAlert()
),建议进入应用程序设置屏幕以更改位置设置。
订阅 locationWillChange
subject 并存储返回的 Cancellable
cancellableLocation = locationProvider.locationWillChange.sink { loc in
// handleLocation(loc)
}
sink
闭包中的 handleLocation
函数将在 LocationProvider
发送的每个 CLLocation
对象上执行。
停止 LocationProvider
并取消订阅
locationProvider.stop()
cancellableLocation?.cancel()
此外,LocationProvider
是一个 ObservableObject,它具有一个 @Published
属性 location
,用于更新 ObservableObject。 可观察的 LocationProvider
及其 location
属性可以直接在 SwiftUI 中访问。
import SwiftUI
import LocationProvider
struct ContentView: View {
@StateObject var locationProvider = LocationProvider()
var body: some View {
VStack{
Text("latitude \(locationProvider.location?.coordinate.latitude ?? 0)")
Text("longitude \(locationProvider.location?.coordinate.longitude ?? 0)")
}
.onAppear {
do {try locationProvider.start()}
catch {
print("No location access.")
locationProvider.requestAuthorization()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
为了使应用程序可以访问用户位置,应在 Info.plist
中设置以下键:
NSLocationAlwaysAndWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
默认情况下,该软件包在后台请求位置访问权限。 因此,还请在 Info.plist
中将 Location
添加到 UIBackgroundModes
,或者在通过 locationProvider.start()
启动位置更新之前,设置 locationProvider.lm.allowsBackgroundLocationUpdates = false
。
一个使用 SwiftUI 中的 LocationProvider 的最小可用 iOS 应用程序可以在这里找到:https://github.com/himbeles/LocationProviderExample
如果您喜欢这个软件包并想支持我,