Dieser Beitrag ist ein Tutorial darueber, wie man den geografischen Standort eines iPhone oder iPad mit Apples CoreLocation-Framework abruft.
Ich gehe zuerst die Schritte durch, die notwendig sind, um einen Listener fuer Aenderungen des Geraetestandorts einzurichten.
Am Ende dieses Beitrags werde ich alles in einen praktischen Combine-Publisher verpacken.
Gerne kannst du mir einen Kaffee ausgeben, wenn dir dieser Beitrag gefallen hat.
Der LocationManager
Die Hauptklasse, die die ganze Arbeit erledigt, ist CLLocationManager. Lass uns einen instanziieren.
private let locationManager = CLLocationManager()
Ein Delegate wird benoetigt, um die Standortaktualisierungen zu empfangen.
self.locationManager.delegate = self
Der Delegate muss die folgende Funktion implementieren. Hier ist ein einfaches Beispiel, das den empfangenen Laengen- und Breitengrad ausgibt.
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
print("Longitude: \(location.coordinate.longitude)")
print("Latitude: \(location.coordinate.latitude)")
}
Dann setzen wir die gewuenschte Genauigkeit. Es gibt mehrere Optionen; ich muss noch erforschen, wie sie sich verhalten.
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
Die Genauigkeit haengt auch damit zusammen, wann die App den Standort verfolgen soll oder darf.
In meinem Fall moechte ich zum Beispiel den Standort verfolgen, auch wenn die App nicht aktiv genutzt wird.
Die App muss dies anfordern. Daher muessen wir den folgenden Aufruf machen.
self.locationManager.requestAlwaysAuthorization()
Wir muessen auch einige Schluessel in der Info.plist setzen. Diese sind erforderlich; ohne sie wird die Standortverfolgung nicht verfuegbar sein.

Wenn der Benutzer die App startet, wird er aufgefordert, diese Anfrage zu bestaetigen.

Zurueck zu unserem Code, es gibt noch einen Schritt, damit das alles funktioniert.
self.locationManager.startUpdatingLocation()
Das war’s - wir sind fertig.
Zusammenfassung
Wie frueher versprochen, habe ich den vollstaendigen Code in eine Klasse gepackt, die einen Combine-Publisher implementiert.
Wenn du dir nicht sicher bist, was ich meine, siehe den Ressourcen-Abschnitt am Ende des Dokuments fuer weiterfuehrende Lektuere.
import Combine
import CoreLocation
import Foundation
class LocationPublisher: NSObject {
typealias Output = (longitude: Double, latitude: Double)
typealias Failure = Never
private let wrapped = PassthroughSubject<(Output), Failure>()
private let locationManager = CLLocationManager()
override init() {
super.init()
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager.requestAlwaysAuthorization()
self.locationManager.startUpdatingLocation()
}
}
extension LocationPublisher: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
wrapped.send((longitude: location.coordinate.longitude, latitude: location.coordinate.latitude))
}
}
extension LocationPublisher: Publisher {
func receive<Downstream: Subscriber>(subscriber: Downstream) where Failure == Downstream.Failure, Output == Downstream.Input {
wrapped.subscribe(subscriber)
}
}
Wann immer sich der Standort aendert, sendet der Publisher ein Tupel aus Laengen- und Breitengrad.
Wir muessen nur diese Aenderungen abonnieren, um sie zu verarbeiten.
Dies kann durch Aufrufen von sink und Uebergabe einer Funktion erfolgen.
let locationPublisher = LocationPublisher()
var cancellables = [AnyCancellable]()
locationPublisher.sink(receiveValue: doSomething).store(in: &cancellables)
func doSomething(location: (longitude: Double, latitude: Double)) {
print("Longitude: \(longitude)")
print("Latitude: \(latitude)")
}
Das war’s fuer heute! Ich hoffe, dir hat dieser Beitrag gefallen und du fandest ihn nuetzlich.
Gerne kannst du mir einen Kaffee ausgeben, wenn dir dieser Beitrag gefallen hat..