iOS regelmäßige Hintergrundstandort-Updates, die nicht nur von signifikanten Standortänderungen abhängen

8

Ich habe eine App, die den Standort des Benutzers melden muss, auch wenn es im Hintergrund läuft oder sogar beendet wird (beendet). Das Problem ist, dass die App den Standort nicht seltener als 1 Stunde Intervall melden sollte.

Ich verwende eine signifikante Standortänderung (SLC), um alle Bewegungen zu verfolgen, was ziemlich ausreichend ist, wenn der Benutzer unterwegs ist, aber sobald der Benutzer aufhört, werden keine weiteren Aktualisierungen ausgelöst und die App hat keine Gelegenheit, einen neuen Standort zu übermitteln (während der Benutzer bleibt) in der gleichen Gegend, aber ohne SLC).

Um diesen Fall zu erfassen, benutze ich die Hintergrundabruffunktion, um regelmäßig Updates im Hintergrund auch ohne SLC zu senden. Das Problem hier ist, dass Hintergrundabrufe oft verwendet wurden (alle 20-30 Minuten, seitdem ich sie in einer anderen iOS 7.x App benutzt habe), aber jetzt mit iOS8 / iOS9 kann ich sie nur einmal am Tag bekommen, was nicht akzeptabel ist in meinem Fall. Ich habe viele Tests durchgeführt, eine einfache Hintergrundabruf-App entwickelt, die beim Abruf eine lokale Benachrichtigung hinzufügt. Kein Glück, um es zu zwingen, öfter zu arbeiten.

Hier ist mein AppDelegate:

%Vor%

Alles, was hier getan wird, ist das Hinzufügen einer lokalen Benachrichtigung bei jedem Abruf im Hintergrund. Ich beende immer die Hintergrundausführung mit UIBackgroundFetchResultNewData.

Haben Sie Vorschläge, wie Sie Hintergrundabrufe häufiger zur Arbeit zwingen (oder Links nachweisen, die nicht mehr möglich sind)? Irgendwelche alternativen Lösungen, um meine Anforderung zu erfüllen, sind auch willkommen!

    
Alexey Strakh 20.09.2015, 21:40
quelle

2 Antworten

4

Es hat sich herausgestellt, dass die Hintergrundabrufe in iOS sehr davon abhängen, was Sie innerhalb des Handlers tun, insbesondere die Netzwerkaktivität. Hier ist die Liste der Abhängigkeiten, die Sie versuchen sollten zu verstehen, ob und wie oft iOS Ihr Fetch ausführen wird:

  • Zeit verbringen Sie in Handler
  • Ergebnis (NoData, NewData)
  • Fehlerbehandlung (Sie werden weniger wahrscheinlich gestartet, wenn der Code abstürzt
  • Timeouts (Ihre Codeausführung könnte von iOS unterbrochen werden)
  • Stromverbrauch
  • Netzwerkaktivität im Zusammenhang mit result (Sie müssen eine Netzwerkanforderung ausführen, wenn Sie sagen, dass Sie NewData haben, andernfalls könnte Ihr Abruf das nächste Mal an einem Tag oder so nie ausgeführt werden.
  

Apps, die kleine Mengen von Inhalten schnell und genau herunterladen   Reflektieren, wann sie Inhalte zum Herunterladen zur Verfügung hatten, sind wahrscheinlicher   um in Zukunft Ausführungszeit zu erhalten, als Apps, die lange brauchen   Zeit, um den Inhalt herunterzuladen, oder , dass der Inhalt des Anspruchs verfügbar war   aber dann nichts herunterladen.

Der letzte Punkt erwies sich in meinem Fall als entscheidend, weil ich zu Testzwecken Abrufe deklarierte und nie versuchte, etwas herunterzuladen. Sobald ich begonnen habe, Netzwerk in der Handler zu verwenden, funktionieren Hintergrundabrufe alle 15-30 Minuten wie erwartet.

Apple-Dokumentation: Ссылка

    
Alexey Strakh 30.09.2015, 17:53
quelle
3

Ich habe an einem ähnlichen Projekt gearbeitet. Nachdem ich verschiedene Lösungen ausprobiert habe, ist die einzige Lösung, die ich gefunden habe, die hier vorgeschlagene Lösung: Ссылка

Hier ist das Tutorial zum Git: Ссылка

Alle Credits Ссылка

Es hat mir eine Menge Zeit erspart!

    
Alban 29.09.2015 12:03
quelle

Tags und Links