2016-03-30 4 views
0

Nach dem Aufbau der iOS-App, die ich wollte, erkannte ich, es ist viel zu viel Batterie aufgrund der Standortdienste verbrauchen.App verbraucht zu viel Batterie

Hintergrund: Meine App ruft den Server jedes Mal über das Netzwerk an, wenn sich ein Benutzer 10 Meter (30 Fuß) bewegt. Dies löst die didUpdateLocation Funktion aus. Wenn diese Funktion ausgelöst wird, verwende ich NSURLSession, um die Koordinaten des Benutzers an den Server zu senden, das ist wirklich so.

Nun liegt das Problem darin, dass ich die Standortdienste-Hardware nach dem ersten Update nicht durch Aufruf von locationManager.stopUpdatingLocation() ausschalten kann, da ich keine weiteren Aktualisierungen erhalten werde, wenn der Benutzer sich entscheidet, erneut zu wechseln. Darüber hinaus bleiben die Standortdienste aktiv, während die App im Hintergrund zur Überwachung der Bewegung steht, was sich ebenfalls negativ auf die Akkulaufzeit auswirkt. Ich habe fast alles zu diesem Thema gelesen, wenn es um Dokumentation und andere Fragen hier geht.

Viele andere Fragen empfehlen die Verwendung eines NSTimer und die startUpdatingLocation() Aufruf nach einem Intervall von Zeit vergangen ist, und ich habe die erste Location Update und rief stopUpdatingLocation in meiner didUpdateLocation Funktion erhalten. Also habe ich folgendes versucht:

let timerAction = NSTimer(timeInterval: 6.0, target: self, selector: #selector(MapViewController().startLocationServices), userInfo: nil, repeats: true) 
    timerAction.fire() 

func startLocationServices() { 
    self.locationManager.startUpdatingLocation() 
} 

Dies hat aus irgendeinem Grund nicht funktioniert. Aber meine Frage konzentriert sich wirklich darauf, wie ich Batterie sparen und meine Anwendung wirklich energieeffizient machen kann, wenn ich die Bewegungen eines Benutzers im Vordergrund und im Hintergrund mit der distanceFilter = 10.0 überwachen muss?

Irgendein Vorschlag vielleicht um das, was Sie getan haben oder was Sie empfehlen würden, würde enorm gesucht und geschätzt werden.

Vielen Dank!

bearbeiten

@wain vorgeschlagen mit allowDeferredLocationUpdatesUntilTraveled:timeout:,

Start, um die Lieferung von Standortaktualisierungen, bevor Sie diese Methode aufrufen. Der am häufigsten verwendete Ort für den Aufruf dieser Methode ist der locationManager Ihres Delegates: didUpdateLocations: method. Nachdem Sie neue Standorte bearbeitet haben, rufen Sie diese Methode auf, wenn Sie zukünftige Aktualisierungen verschieben möchten, bis die Kriterien für Entfernung oder Zeit erfüllt sind. Wenn neue Ereignisse eintreffen und Ihre App sich im Hintergrund befindet, werden die Ereignisse zwischengespeichert und ihre Zustellung entsprechend verzögert.

+0

Nicht passieren (über eine Vielzahl von Gerätefunktionen mindestens). Warum brauchst du alle 10m 24/7? Wer wird an dieser App interessiert sein? Ist NATimer das einzige, was deine Forschung herausgefunden hat? – Wain

+0

Die App löscht Pins, wohin Sie den ganzen Tag gegangen sind. Es ist wie ein Zurückverfolgen deiner Schritte. Es ist nur zum Spass. Ich habe andere Apps gesehen, die dies tun und es relativ effizient machen, wie Moves, Uber und so weiter. – Mihado

Antwort

2

Ich beendete dieses Problem mit Geofencing beheben. Ich erstelle einen CLCircularRegion und rufe startMonitoringForRegion(_:) an. Jedes Mal, wenn der Benutzer die Region verlässt (10 Meter), ersuche ich den Server, zu sehen, wo er gerade ist und die Region zu aktualisieren. Dies verwendet wenig bis keine Batterie und ist genau das, wonach ich suche. Schauen Sie sich die Klassen CLLocationManager, CLLocationManagerDelegate und CLCircularRegion an, wie dies gemacht wird. Ich hoffe, dass dies für jemanden nützlich sein wird.

2

Sie haben 2 Möglichkeiten:

  1. Verwenden allowDeferredLocationUpdatesUntilTraveled:timeout:
  2. Nutzung wichtiger Standortwechsel

beim ersten Versuch, wenn es nicht auf dem Gerät verfügbar ist, dass Sie Ihre 10m opfern Ziel

+0

'allowDeferredLocationUpdatesUntilTraveled: timeout' Ich habe das im Detail angeschaut. Werde ich es von meinem 'viewDidLoad' aus aufrufen? Dort rufe ich 'startUpdatingLocation()' gerade auf. – Mihado

+0

Legen Sie vor dem Start der Ortungsverfolgung fest, dass Updates zu delegieren sind – Wain