2014-06-05 13 views
25

Ich habe versucht, dies für eine Weile zu arbeiten, und ich bin hierher gekommen, um zu fragen, wie gehe ich mit den CLLocationManagerDelegate-Methoden in Swift gehen? Ich habe dies an der Spitze meiner Klasse setzen:Implementieren CLLocationManagerDelegate-Methoden in Swift

var locationManager = CLLocationManager() 

ich folgende in meine viewDidLoad Methode gesetzt habe:

locationManager.delegate = self 
locationManager.distanceFilter = kCLDistanceFilterNone 
locationManager.desiredAccuracy = kCLLocationAccuracyBest 
locationManager.startUpdatingLocation() 

Und ich habe versucht, ohne Erfolg, diese Delegierten Methoden verwenden:

Ich habe auch versucht, @optional vor den Funktionen zu verwenden, aber Xcode löst dann einen Compilerfehler aus. Irgendwelche Ideen?

+0

Es scheint für mich mit Ihrem Code funktionieren, erhalten Sie den Dialog gefragt, ob Ihre App Ihren Standort verwenden kann? – voidref

+0

@votifref Jetzt, wo du es erwähnst, bekomme ich den Dialog nicht. Das ist ein bisschen merkwürdig ... Ich habe nur die Einstellungen überprüft und der App wurde ebenfalls die Erlaubnis zum Standort-Zugriff erteilt. –

Antwort

57

Sie benötigen die NSLocationAlwaysUsageDescription oder NSLocationWhenInUseUsageDescription Schlüssel zu Ihrem plist hinzufügen, wenn Sie nicht bereits haben, sind sie jetzt verpflichtend,


iOS8 + eine dieser beiden Strings erfordert gesetzt werden Stellen zu verwenden. Welche Sie verwenden, hängt davon ab, wie Sie beabsichtigen, nach dem Standort zu fragen.

  • Verwenden NSLocationAlwaysUsageDescription für Anwendungen, die die Position des Geräts auch wenn die App nicht geöffnet ist und wird verwendet, verwendet werden soll.

  • Verwenden Sie für Apps, die den Standort des Geräts nur verwenden möchten, wenn die App geöffnet und verwendet wird.

Hinweis: Wenn Sie die Saiten hinzufügen, bevor Sie erstellen und ausführen, löschen Sie die App Ihr ​​Gerät aus und lassen Sie es ein frisches tun installieren. Es scheint, dass die App, wenn sie vor dem Upgrade auf iOS8 Standorte autorisieren konnte, nicht erneut nach Ihrer Berechtigung fragt und nicht sieht, dass Sie diese Zeichenfolgen festlegen. Eine Lösch- und Bereinigungsinstallation löst dies.

Einstellung entweder der Saiten aufgefordert, ein Pop-up bei der Installation/dem ersten Gebrauch entlang der Linien von: „Erlauben‚ThisApp‘Ihren Standort zugreifen, auch wenn Sie nicht die App verwenden“

Hier ist ein Screenshot der plist Datei.

enter image description here

+0

[Sie meinen so] (http://imgur.com/5CA1tKK)? Das hat den Dialog auch nicht angezeigt. –

+1

Nein, anscheinend benötigt iOS8 eine dieser beiden anderen Zeichenfolgen (siehe meine Bearbeitung). Welchen Sie verwenden, sollte darauf basieren, wie Sie beabsichtigen, nach dem Ort zu fragen, von dem, was ich verstehe, aber ich konnte keine spezifischeren Informationen finden. Im Interesse einer vollständigen Enthüllung habe ich meine Arbeit auch nach dem Hinzufügen der Saiten noch nicht bekommen (mein Problem scheint anderswo zu sein. Ich versuche, meine ohne Swift im Moment zu bekommen), ich wollte nur die Saiten erwähnen, da die jetzt sind erforderlich. – DelightedD0D

+0

Wenn Sie die Strings hinzufügen, löschen Sie die App vor dem Erstellen und Ausführen, und lassen Sie sie neu installieren. Es scheint, dass, wenn die App autorisiert war, Standorte vor dem Upgrade auf iOS8 zu verwenden, sie nicht erneut nach Ihrer Erlaubnis fragt und nicht sieht, dass Sie diese Zeichenfolgen setzen. Eine Löschung und eine saubere Installation löste es für mich, endlich wieder arbeiten! – DelightedD0D

3

hatte ich das gleiche Problem. didUpdateLocations - hat nicht funktioniert. Führen Sie Ihre App aus. Gehen Sie zur Seite Einstellungen -> Datenschutz -> Standort und deaktivieren Sie die Standortdienste. didFailWithError wird den Fehler über fehlende Standortdienste abfangen. Dann schalten Sie es ein. Seit diesem Moment fängt didUpdateLocations die Standorte ab.

+0

Das scheint einmal zu funktionieren, aber wenn ich die App von Xcode neu starte, gehe ich zurück, um keine Standortaktualisierungen zu erhalten. – FiddleMeRagged

+1

Ja, ich weiß. Aber ich denke, es ist das Problem mit XCode 6. Lassen Sie uns Beta 2 warten :) – salty

5

erste diesen zweizeilige in plist Datei

1) NSLocationWhenInUseUsageDescription

2) NSLocationAlwaysUsageDescription hinzufügen

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)") 
     } 
} 
4

Um Benutzer Aktuellen Standort: -

Schritt 1:let locationManager = CLLocationManager() // make object of CLLocationManager class.

Schritt 2:In viewDidLoad instantiate the CLLocationManager class like,

// Für den Einsatz 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: nun die Delegatmethoden von CLLocationManager implementieren

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ügenin der Info.plist wie in iOS 8 ist es zwingend erforderlich, dies hinzuzufügen. Dies wird um die Erlaubnis bitten, den Standort des Benutzers zu verwenden.

0

Dies ist ein bisschen ein alter Thread, aber keiner der oben genannten funktionierte für mich auf Swift 2.2 xCode 7.3.1.

Das Problem ist, ich wurde mit:

func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) { 
    print("Got location") 
    locationManager.stopUpdatingLocation() 
} 

Und das wurde nie genannt. Als ich mich änderte zu:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    print("Got location") 
    locationManager.stopUpdatingLocation() 
} 

Es hat alles geklappt. Scheint wie der Delegat nicht aufgerufen wird, wenn Sie [AnyObject] verwenden