尝试使用swiftUI获取当前位置。下面的代码无法使用didUpdateLocations委托初始化。
class GetLocation : BindableObject {
var didChange = PassthroughSubject<GetLocation,Never>()
var location : CLLocation {
didSet {
didChange.send(self)
}
}
init() {}
}
答案 0 :(得分:3)
我在https://github.com/himbeles/LocationProvider上写了一个包含使用说明的单文件快速包。它为CLLocationManager及其委托人提供了| async
类型的包装器类。
有一个发布的属性private _recipesSource = new BehaviorSubject<Recipe[]>([]);
可以直接在SwiftUI中使用,还有一个PassthroughSubject,您可以通过Combine进行订阅。两者均在CLLocationManager的每个ObservableObject
事件上更新。
它还可以处理以前拒绝位置访问的情况:默认行为是向用户显示在应用程序设置中启用访问权限的请求和链接。
在SwiftUI中,用作
location
答案 1 :(得分:0)
下面的这段代码有效(不适用于生产环境)。实现CLLocationManagerDelegate
可以正常工作,并且lastKnownLocation
会相应地更新。
不要忘记在您的NSLocationWhenInUseUsageDescription
中设置Info.plist
class LocationManager: NSObject, CLLocationManagerDelegate, BindableObject {
private let manager: CLLocationManager
var didChange = PassthroughSubject<LocationManager, Never>()
var lastKnownLocation: CLLocation? {
didSet {
didChange.send(self)
}
}
init(manager: CLLocationManager = CLLocationManager()) {
self.manager = manager
super.init()
}
func startUpdating() {
self.manager.delegate = self
self.manager.requestWhenInUseAuthorization()
self.manager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print(locations)
lastKnownLocation = locations.last
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
manager.startUpdatingLocation()
}
}
}
答案 2 :(得分:0)
Xcode 11 beta 4,您需要将didChange更改为willChange。
var willChange = PassthroughSubject<LocationManager, Never>()
var lastKnownLocation: CLLocation? {
willSet {
willChange.send(self)
}
}