2016-07-17 15 views
-1

ändert aufgerufen wird Ich versuche, Benutzer erhebliche Standortänderungen zu überwachen, um eine Singleton mit Location LocationService genannt, geht es wie folgt aus:„didUpdateLocations“ nicht, wenn signifikante Überwachung Standort

LocationService.Swift:

class var sharedInstance: LocationService { 
     struct Static { 
      static var onceToken: dispatch_once_t = 0 

      static var instance: LocationService? = nil 
     } 
     dispatch_once(&Static.onceToken) { 
      Static.instance = LocationService() 
     } 
     return Static.instance! 
    } 

    var locationManager: CLLocationManager? 
    var location: CLLocation? 
    var delegate: LocationServiceDelegate? 

    override init() { 
     super.init() 

     self.locationManager = CLLocationManager() 
     guard let locationManager = self.locationManager else { 
      return 
     } 

     if CLLocationManager.authorizationStatus() == .NotDetermined { 
      locationManager.requestAlwaysAuthorization() 
     } 

     locationManager.delegate = self 
     locationManager.distanceFilter = 10 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.pausesLocationUpdatesAutomatically = false 

     if NSString(string: UIDevice.currentDevice().systemName).floatValue >= 9 { 
      locationManager.allowsBackgroundLocationUpdates = true 
     } 
    } 

func startUpdatingLocation() { 
     print("Starting Location Updates") 
     self.locationManager?.startUpdatingLocation() 
    } 

func startMonitoringSignificantLocationChanges() { 
     print("Starting Significant Location Updates") 
     self.locationManager?.startMonitoringSignificantLocationChanges() 
    } 

// CLLocationManagerDelegate 
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     guard let location = locations.last else { 
      return 
     } 

     // singleton for get last location 
     self.location = location 
    } 

myVC.swift:

private let locationService = LocationService.sharedInstance 

func prepareInformation() { 
     self.locationService.delegate = self 
     self.locationService.startMonitoringSignificantLocationChanges() 
    } 

aber didUpdateLocations wird nur einmal aufgerufen, wenn die App gestartet wird, und dann wird es nicht einmal aufgerufen. Aber wenn ich schalten Sie die Zeile:

self.locationService.startMonitoringSignificantLocationChanges() 

zu:

self.locationService.startUpdatingLocation() 

es funktioniert super und jedesmal, wenn der Benutzer bewegt genannt.

Was kann das Problem sein? Vielen Dank!

Antwort

1

Laut Apple docs

Nach einer aktuellen Position fix Rückkehr erzeugt der Empfänger Update Ereignisse nur dann, wenn eine wesentliche Änderung in der Lage des Benutzers ist erkannt. Es beruht nicht auf dem Wert in der Eigenschaft distanceFilter , um Ereignisse zu generieren.

Und

Apps können eine Benachrichtigung erwarten, sobald das Gerät 500 Meter oder mehr von ihrer früheren Mitteilung bewegt. Es sollte nicht öfter als einmal alle fünf Minuten Benachrichtigungen erwarten. Wenn die Gerät in der Lage ist, Daten aus dem Netz abzurufen, der Standort-Manager ist viel wahrscheinlicher, Benachrichtigungen in angemessener Zeit zu liefern

Ich glaube, Sie ein Ereignis erwarten, wenn der Benutzer seine Position um 10 Meter ändert , aber diese Methode hängt nicht von distanceFilter ab. Wenn Sie startUpdatingLocation() verwenden, erhalten Sie Ereignisse, die von der Eigenschaft distanceFilter abhängig sind.

Sie können mehr darüber lesen here.