如何使用SwiftUI获取当前位置?

时间:2019-06-10 20:22:20

标签: cllocation swiftui

尝试使用swiftUI获取当前位置。下面的代码无法使用didUpdateLocations委托初始化。

class GetLocation : BindableObject {
    var didChange = PassthroughSubject<GetLocation,Never>()

    var location : CLLocation {
        didSet {
            didChange.send(self)
        }
    }
    init() {}
}

3 个答案:

答案 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)
    }
}