web-dev-qa-db-ja.com

SwiftUIで現在地を取得する方法は?

SwiftUIを使用して現在位置を取得しようとしています。コードの下で、didUpdateLocationsデリゲートで初期化できませんでした。

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

    var location : CLLocation {
        didSet {
            didChange.send(self)
        }
    }
    init() {}
}
9
Görkem Aydın

以下のコードは機能します(本番環境では使用できません)。 CLLocationManagerDelegateの実装は問題なく機能し、lastKnownLocationはそれに応じて更新されます。

Info.plistNSLocationWhenInUseUsageDescriptionを設定することを忘れないでください

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()
        }
    }
}
5
Viktor Gardart

Xcode 11ベータ4以降、didChangewillChangeに変更する必要があります。

var willChange = PassthroughSubject<LocationManager, Never>()

var lastKnownLocation: CLLocation? {
    willSet {
        willChange.send(self)
    }
}
3
MwcsMac

私は1つのファイルを記述しましたSwiftの使用方法が記載されたパッケージ https://github.com/himbeles/LocationProvider 。これはObservableObjectを提供しますCLLocationManagerとそのデリゲートの-typeラッパークラス。SwiftUIで直接使用できる公開されたプロパティlocationと、Combine経由でサブスクライブできるPassthroughSubjectがあります。両方のdidUpdateLocations CLLocationManagerのイベント。

また、位置情報へのアクセスが以前に拒否された場合の処理​​も行います。デフォルトの動作では、アプリの設定でアクセスを有効にするリクエストとそこへのリンクをユーザーに提示します。

SwiftUIでは、次のように使用します

import SwiftUI
import LocationProvider

struct ContentView: View {
    @ObservedObject var locationProvider : LocationProvider

    init() {
        locationProvider = LocationProvider()
        do {try locationProvider.start()} 
        catch {
            print("No location access.")
            locationProvider.requestAuthorization()
        }
    }

    var body: some View {
        VStack{
        Text("latitude \(locationProvider.location?.coordinate.latitude ?? 0)")
        Text("longitude \(locationProvider.location?.coordinate.longitude ?? 0)")
        }
    }
}
0
lsrggr