Implementieren Sie CLLocationManagerDelegate-Methoden in Swift
-
21-12-2019 - |
Frage
Ich versuche schon seit einiger Zeit, dies zum Laufen zu bringen, und bin hierher gekommen, um zu fragen: Wie gehe ich mit der Verwendung der CLLocationManagerDelegate-Methoden in Swift um?Ich habe dies an die Spitze meiner Klasse gesetzt:
var locationManager = CLLocationManager()
Ich habe Folgendes in mein Verzeichnis eingefügt viewDidLoad
Methode:
locationManager.delegate = self
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
Und ich habe versucht, diese Delegate-Methoden ohne Erfolg zu verwenden:
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
locationReceived = true
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
locationReceived = false
}
Ich habe auch versucht, @optional vor den Funktionen zu verwenden, aber Xcode gibt dann einen Compilerfehler aus.Irgendwelche Ideen?
Lösung
Sie müssen das hinzufügen NSLocationAlwaysUsageDescription
oder NSLocationWhenInUseUsageDescription
Schlüssel zu Ihrer Plist, falls Sie dies noch nicht getan haben, sie sind jetzt obligatorisch,
Für iOS8+ muss eine dieser beiden Zeichenfolgen für die Verwendung von Standorten festgelegt werden.Welche Sie verwenden, hängt davon ab, wie Sie nach dem Standort fragen möchten.
Verwenden
NSLocationAlwaysUsageDescription
für Apps, die den Standort des Geräts auch dann nutzen möchten, wenn die App nicht geöffnet ist und verwendet wird.Verwenden
NSLocationWhenInUseUsageDescription
für Apps, die den Standort des Geräts nur verwenden möchten, wenn die App geöffnet und verwendet wird.
Notiz: Wenn Sie die Zeichenfolgen hinzufügen, löschen Sie die App vor dem Erstellen und Ausführen von Ihrem Gerät und lassen Sie sie neu installieren.Wenn die App vor dem Upgrade auf iOS8 zur Nutzung von Standorten berechtigt war, fragt sie offenbar nicht noch einmal nach Ihrer Erlaubnis und sieht nicht, dass Sie diese Zeichenfolgen festgelegt haben.Eine Lösch- und Neuinstallation löst dieses Problem.
Wenn Sie eine der Zeichenfolgen festlegen, wird bei der Installation/ersten Verwendung ein Popup angezeigt, das wie folgt aussieht:„Erlauben Sie „ThisApp“, auf Ihren Standort zuzugreifen, auch wenn Sie die App nicht verwenden.“
Hier ist ein Bildschirmfoto des plist Datei.
Andere Tipps
Fügen Sie zunächst diese beiden Zeilen in die Plist-Datei ein
1) NSLocationWhenInUseUsageDescription
2) NSLocationAlwaysUsageDescription
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"
var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
}
func initLocationManager() {
seenError = false
locationFixAchieved = false
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.locationServicesEnabled
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
locationManager.stopUpdatingLocation()
if (error) {
if (seenError == false) {
seenError = true
print(error)
}
}
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
if (locationFixAchieved == false) {
locationFixAchieved = true
var locationArray = locations as NSArray
var locationObj = locationArray.lastObject as CLLocation
var coord = locationObj.coordinate
println(coord.latitude)
println(coord.longitude)
}
}
func locationManager(manager: CLLocationManager!,
didChangeAuthorizationStatus status: CLAuthorizationStatus) {
var shouldIAllow = false
switch status {
case CLAuthorizationStatus.Restricted:
locationStatus = "Restricted Access to location"
case CLAuthorizationStatus.Denied:
locationStatus = "User denied access to location"
case CLAuthorizationStatus.NotDetermined:
locationStatus = "Status not determined"
default:
locationStatus = "Allowed to location Access"
shouldIAllow = true
}
NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil)
if (shouldIAllow == true) {
NSLog("Location to Allowed")
// Start location services
locationManager.startUpdatingLocation()
} else {
NSLog("Denied access: \(locationStatus)")
}
}
So erhalten Sie den aktuellen Standort des Benutzers: -
Schritt 1: let locationManager = CLLocationManager() // make object of CLLocationManager class.
Schritt 2: In viewDidLoad instantiate the CLLocationManager class like,
// Zur Verwendung im Hintergrund
self.locationManager.requestAlwaysAuthorization()
// For use in foreground
self.locationManager.requestWhenInUseAuthorization()
if (CLLocationManager.locationServicesEnabled())
{
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
Schritt 3: Implementieren Sie nun die Delegate-Methoden von CLLocationManager
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
var locValue:CLLocationCoordinate2D = manager.location.coordinate
println("locations = \(locValue.latitude) \(locValue.longitude)")
}
Schritt 4:Vergessen Sie nicht hinzuzufügen NSLocationAlwaysUsageDescription
In der Info.plist ist es wie in iOS 8 zwingend erforderlich, dies hinzuzufügen.Dadurch wird um Erlaubnis gebeten, den Standort des Benutzers zu verwenden.
Ich hatte das gleiche Problem.didUpdateLocations – hat nicht funktioniert.Führen Sie Ihre App aus.Gehen Sie zur Seite „Einstellungen“ -> „Datenschutz“ -> „Standort“ und deaktivieren Sie die Ortungsdienste.didFailWithError fängt den Fehler über fehlende Ortungsdienste ab.Dann schalten Sie es ein.Von diesem Moment an erfasst didUpdateLocations Standorte.
Dies ist ein etwas alter Thread, aber keines der oben genannten Dinge hat bei mir unter Swift 2.2 xCode 7.3.1 funktioniert.
Das Problem ist, dass ich Folgendes verwendet habe:
func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) {
print("Got location")
locationManager.stopUpdatingLocation()
}
Und das wurde nie aufgerufen.Als ich wechselte zu:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("Got location")
locationManager.stopUpdatingLocation()
}
Es hat alles geklappt.Scheint, als ob der Delegat bei Verwendung von [AnyObject] nicht aufgerufen wird.