2016-04-15 3 views
2

Ich entwickle eine App, die wichtige Standortänderungen überwacht, um den Standort des Benutzers im Hintergrund zu erhalten. Ich habe erfolgreich implementiert locationManager.startMonitoringSignificantLocationChanges und die locationManager:didUpdateLocations und locationManager:didFailWithError Methoden meiner CLLocationManagerDelegate.Ist es möglich, Standort-Updates zu verschieben, wenn wichtige Standortänderungen überwacht werden?

SLC ist jedoch genauer als ich brauche. Laut Apples Dokumentation - und bestätigt durch meine Tests - löst slc ungefähr alle 500 m und zwischen 5 und 10 Minuten ein Standort-Update aus. Daher habe ich locationManager.allowDeferredLocationUpdatesUntilTravelled:timeout in der Methode didUpdateLocations meines Delegierten implementiert, wie in diesem Handbuch beschrieben: http://apple.co/1W4gqEJ.

Hier ist mein Code:

var deferringUpdates = false 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    for location in locations { 
     NSLog("Significant location change recorded:\n%@", location) 
    } 

    if let location = locations.first { 
     let secondsAgo: NSTimeInterval = location.timestamp.timeIntervalSinceNow 

     // Only process the location if it is very recent (less than 15 seconds old). 
     if abs(secondsAgo) < 15.0 { 
      saveExtendedUserInfo(withLocation: location) 
     } 
    } 

    if !deferringUpdates { 
     manager.allowDeferredLocationUpdatesUntilTraveled(810, timeout: 600) 
     deferringUpdates = true 
     NSLog("Deferring location updates...") 
    } 
} 

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
    NSLog(error.localizedDescription) 
} 

func locationManager(manager: CLLocationManager, 
    didFinishDeferredUpdatesWithError error: NSError?) 
{ 
    deferringUpdates = false 

    if let deferralError = error { 
     NSLog(deferralError.localizedDescription) 
    } 
} 

Leider ist die der Standort-Manager aufschiebt nie die Updates. Unmittelbar nachdem allowDeferredUpdatesUntilTravelled:timeout aufgerufen wird, führt der Delegat didFinishDeferredUpdatesWithError aus und produziert kCLErrorDomain 12, das CLError.DeferredNotUpdatingLocation ist.

Warum bekomme ich diesen Fehler? Es scheint zu bedeuten, dass der Service für aufgeschobene Updates die Überwachung signifikanter Standortänderungen nicht als "aktualisierenden Standort" anerkennt. Ist es möglich, die Auslieferung von SLC-Events zu verschieben oder ihre Häufigkeit zu reduzieren? Wenn das so ist, wie?

+0

Hey. Ich implementiere die gleichen Dinge. Wie hast du das gemacht? Kannst du mir bitte dabei helfen? Wie und wo diese Methode verwenden .allowDeferredUpdatesUntilTravelled: Timeout entsprechend der Geschwindigkeit des Benutzers? – BHUMICA

Antwort

3

Der Zweck des Verschiebens von Aktualisierungen besteht darin, die Batterie zu sparen, die von der Haupt-CPU verbraucht wird, wenn 1-Hz-Positionsaktualisierungen vom GPS verarbeitet werden. Bei verzögerten Aktualisierungen bleibt die CPU im Energiesparmodus, während der GPS-Chip GPS-Positionen einmal pro Sekunde (1 Hz) akkumuliert.

Mit Significant Location Change (SLC) ist das System nicht mit dem GPS. Es bestimmt den Standort basierend auf der Triangulation des Zellenturms, wodurch die CPU erst aktiviert wird, wenn eine signifikante Änderung eingetreten ist.

Diese beiden Funktionen schließen sich gegenseitig aus, Sie können die Aktualisierung der wichtigen Standortänderung nicht verschieben, da der GPS-Chip nicht an SLC beteiligt ist.

Verwandte Themen