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?

War es hilfreich?

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.

enter image description here

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top