Как узнать текущее местоположение с SwiftUI? - PullRequest
1 голос
/ 10 июня 2019

Попытка получить текущее местоположение с помощью swiftUI.Приведенный ниже код не может быть инициализирован делегатом didUpdateLocations.

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

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

Ответы [ 2 ]

0 голосов
/ 23 июля 2019

Xcode 11 beta 4, вам нужно изменить didChange на willChange.

var willChange = PassthroughSubject<LocationManager, Never>()

var lastKnownLocation: CLLocation? {
    willSet {
        willChange.send(self)
    }
}
0 голосов
/ 11 июня 2019

Этот код ниже работает (Не готов к производству). Реализация 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()
        }
    }
}
...