garantierte Zustellung für Uploads nach Netzwerkwiederherstellung, auch wenn meine App nicht ausgeführt wird

8

Ich gebe eine iOS-App an (die außerhalb unserer Firma erstellt wird), die den Dateneintrag eines Benutzers auf einen Server hochladen wird. Wenn das Gerät nicht mit dem Internet verbunden ist, möchten wir Daten auf dem Gerät speichern und hochladen, wenn das Netzwerk erneut verbunden wird. (Die App wird hauptsächlich auf iPod Touch-Geräten ausgeführt, die die meiste Zeit getrennt sind).

Wenn der Nutzer das Gerät entsperrt und unsere App erneut öffnet, nachdem das Netzwerk wieder verbunden wurde, sollte das Hochladen auf den Server einfach sein, da die App ausgeführt wird.

Aber was ist, wenn die App nicht läuft, wobei "nicht ausgeführt" einen oder mehrere der folgenden Punkte bedeuten kann:

  • Gerät wurde aus- und wieder eingeschaltet
  • Benutzer hat das Gerät gesperrt und es sitzt in seiner Tasche
  • App ist abgestürzt
  • Benutzer hat die App verlassen
  • Benutzer hat begonnen, andere Apps zu verwenden, damit unsere App nicht mehr im Vordergrund läuft
  • Gibt es andere Fälle?

Gibt es in den oben genannten Fällen einen Weg (idealerweise batteriesparend), um sicherzustellen, dass lokale Daten bald nach Wiederherstellung der Internetverbindung hochgeladen werden? Ist die Antwort unterschiedlich, je nachdem, welcher der oben genannten Fälle dazu geführt hat, dass die App nicht ausgeführt wurde?

Und gibt es eine iOS-Mindestversion, die das Gerät benötigt, um einige (oder alle) der oben genannten nicht laufenden Fälle noch hochladen zu können, wenn die App nicht läuft?

Ich entschuldige mich, wenn dies offensichtliche neue Fragen sind - ich bin kein iOS-Experte.

    
Justin Grant 01.09.2012, 02:04
quelle

4 Antworten

7

Es gibt eine interessante Technik, die ua von Instapaper und News.me (die Pioniere dieser Technik), wo Sie die Hintergrundüberwachung verwenden, um Hintergrund-Downloads oder Uploads zu initiieren. Marco (Instapaper) bloggte und redete (in Episode 80 des Build and Analyze Podcasts ) über seine Kommunikation mit Apple, damit es ist sollte im App Store erlaubt sein.

In Kürze besteht die Technik darin, dass Sie bestimmte Regionen (Geofences) wie "home" oder "work" einrichten und auf die locationManager:didEnterRegion: (und ähnliche) Callbacks reagieren. Ihre App wird aus dem Hintergrund aufwachen, sobald Sie die vordefinierte Region betreten und Sie können prüfen, ob Daten hochgeladen werden können.

Diese Technik garantiert nicht , dass die Daten hochgeladen werden, wenn das Netzwerk wieder eine Verbindung herstellt, aber Ihre App kann die Informationen automatisch hochladen, wenn die iPod Touch-Benutzer in ihr WLAN-Netzwerk gelangen.

Das sollte am ehesten mindestens einmal am Tag sein, was für Sie häufig genug ist oder nicht. Sie könnten einen Zeitstempel hinzufügen, als der anfängliche Upload versucht wurde, und diesen während des Uploads senden, sobald es die richtige Reihenfolge der Ereignisse (Dateneinträge) auf Ihrem Server erreicht hat.

    
David Rönnqvist 05.09.2012 13:43
quelle
3

Es gibt keine Möglichkeit, dies sicherzustellen. Wenn Ihre Anwendung "nicht läuft" (gemäß der in Ihrer Frage beschriebenen Definition), ist sie nicht in der Lage, auf eine Änderung des Netzwerkstatus des Geräts zu reagieren. Es sollte so eingerichtet werden, dass der Upload bei der nächsten Ausführung der Anwendung fortgesetzt wird.

BEARBEITEN: Einige der Fälle, die Sie beschrieben haben, können in der Tat unterschiedliche Möglichkeiten für Ihre Anwendung bieten. Insbesondere, wenn der Benutzer die App durch Drücken der Home-Taste "verlässt" oder eine andere App im Vordergrund startet, kann Ihre Anwendung das im Hintergrund weiter ausführen und möglicherweise auf eine Änderung der Netzwerkerreichbarkeit reagieren.

Die Art dessen, was im Hintergrund und wie lange ausgeführt werden kann, ist gut dokumentiert und wird von jeder Version von iOS unterstützt, die Multitasking unterstützt. Ich empfehle Ihnen, die Dokumentation zu App States and Background Services .

    
isaac 05.09.2012 03:19
quelle
1
  • Gerät wurde aus- und wieder eingeschaltet - & gt; wirklich KEINEN Weg zur Fortsetzung, es sei denn, Sie öffnen die App !!!
  • Benutzer hat das Gerät gesperrt und es sitzt in seiner Tasche - & gt; Apps ApplicationStatus ist UIApplicationStateInactive, wird jedoch im Hintergrund ausgeführt. Sie können immer noch auf Benachrichtigungen und d. h. Beschleunigungsmesserereignisse reagieren. Versuchen Sie die Erreichbarkeitsklasse und protokollieren Sie die Änderungen!
  • App abgestürzt - & gt; KEIN WEG, außer wenn die App geöffnet wird
  • Benutzer hat die App verlassen - & gt; App sitzt im Hintergrund. Dort haben Sie maximal 10 Minuten Beschränkung von vollständig mit Ihrer App (wie die App "Pastebot" tut)
  • Der Benutzer hat begonnen, andere Apps zu verwenden, damit unsere App nicht in der App läuft Vordergrund mehr - & gt; Entspricht dem Benutzer, der die App beendet hat

Beim Multitasking sagt Apple folgendes:

  • Echte Multitasking nur für bestimmte Arten der Nutzung, da gibt es Audio-Hintergrund spielen, VOIP (wie Skype), Navigationsanwendungen
  • Alle anderen Apps können eine bestimmte Zeit nach dem Schließen der App / im Hintergrund anfordern, um bestimmte Aufgaben zu erledigen (z. B. Senden einer E-Mail, SMS oder Hochladen / Herunterladen wichtiger Daten)

Wichtiges Zitat aus der Dev-Dokumentation:

  

Die Methode applicationDidEnterBackground: Ihres App-Delegierten hat ungefähr 5 Sekunden, um alle Aufgaben zu beenden und zurückzukehren. In der Praxis sollte diese Methode so schnell wie möglich zurückkehren. Wenn die Methode nicht vor Ablauf der Zeit zurückgegeben wird, wird Ihre App gelöscht und aus dem Speicher gelöscht. Wenn Sie noch mehr Zeit für die Ausführung von Aufgaben benötigen, rufen Sie die Methode beginBackgroundTaskWithExpirationHandler: auf, um die Ausführungszeit im Hintergrund anzufordern und anschließend alle länger andauernden Aufgaben in einem sekundären Thread zu starten. Unabhängig davon, ob Sie Hintergrundaufgaben starten, muss die applicationDidEnterBackground: -Methode dennoch innerhalb von 5 Sekunden beendet werden.

    
Fab1n 05.09.2012 13:12
quelle
1

Wenn Sie eine restliche API erstellen, würde ich Ihnen RestKit empfehlen, da es eine request queue hat, die das Netzwerk überprüft Status auf dem Gerät und startet das Hochladen, sobald der Netzwerkzugriff sichergestellt wurde. Sie können mehr darüber hier lesen: Ссылка . Lesen Sie die Abschnitte über die Anforderungswarteschlange und den Download / Upload im Hintergrund. Es sollte angemerkt werden, dass RestKit eine große Bibliothek ist, die Vor- und Nachteile hat. Ich bin mir nicht ganz sicher, wie dieses que mit dem App-Lebenszyklus funktioniert, wenn es die Anfrage que speichert, selbst wenn die App beendet wird. Das müsstest du untersuchen. RestKit unterstützt das Hochladen / Herunterladen von Hintergrunddateien, aber wie bereits erwähnt, ist es unmöglich, einen Upload durchzuführen, wenn die App beendet wird und sich nicht im Hintergrund befindet.

Ich würde nicht empfehlen RestKit zu verwenden, wenn die API nicht Ruhe ist.

Sie können RestKit hier herunterladen und ausprobieren: Ссылка .

    
Anders 09.09.2012 09:32
quelle

Tags und Links