iPhone - Hintergrund für die Suche nach Ereignissen
Für eine ganze Weile war ich auf der Suche in einer Art und Weise, in meiner iPhone app zur Abfrage alle X Minuten die Daten zu prüfen Zähler. Nach viel Lesen die Hintergrund-Durchführung-Dokumentation und ein paar trial-apps würde ich entlassen, dies als unmöglich, ohne zu missbrauchen, die hintergrund-APIs.
Letzte Woche fand ich diese Anwendung, die tut genau das. http://itunes.apple.com/us/app/dataman-real-time-data-usage/id393282873?mt=8
Es läuft im hintergrund und merkt sich die Anzahl der Mobilfunk - /WLAN-Daten, die Sie verwendet haben. Ich vermute, dass der Entwickler die Registrierung seiner app als tracking-Standort ändert sich, aber die Ortungsdienste-Symbol nicht sichtbar ist, während die app läuft, die ich dachte, war eine Voraussetzung.
Hat jemand irgendwelche Hinweise darauf, wie dies erreicht werden kann?
InformationsquelleAutor der Frage NeilInglis | 2011-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich gesehen, dass dieses Verhalten auch. Nach dem Versuch eine Menge entdeckte ich zwei Dinge, die helfen könnten. Aber ich bin immer noch unsicher, wie diese Einfluss auf den review-Prozess.
Wenn du das backgrounding Funktionen, die app gestartet von iOS im hintergrund wieder einmal war es beenden (durch das system). Wir werden den Missbrauch später.
In meinem Fall habe ich die VoIP-backgrounding enabled in meine plist.
Der gesamte code ist hier in Ihrem AppDelegate:
und die Registrierung erfolgt in
Nun passiert das Wunder: ich weiß nicht einmal mit VoIP-Anschlüssen. Aber diese 10 Minuten callback bietet einen schönen Nebeneffekt: Nach 10 Minuten (manchmal früher) entdeckte ich, dass mein Timer und die Vorherige Ausführung Trittstufen ausgeführt werden, für eine kurze Weile. Sie können diese sehen, wenn Sie einige NSLog(..) in Ihrem code. Dies bedeutet, dass diese kurze "wakeup" führt den code für eine Weile. Laut Apple haben wir 30 Sekunden Ausführungszeit Links. Ich gehe davon aus, dass hintergrund-code wie threads ausgeführt werden, für knapp 30 Sekunden. Dies ist nützlich, code, wenn Sie "manchmal" etwas überprüfen.
Der doc sagt, dass alle hintergrund-tasks (VoIP, audio -, Standort-updates) werden automatisch neu gestartet, in den hintergrund, wenn die app beendet wurde. VoIP-apps gestartet wird im hintergrund automatisch nach dem Booten!
Mit Missbrauch dieses Verhalten, können Sie machen Sie Ihre app zu suchen, wie läuft "ewig".
Registrieren Sie sich für einen hintergrund-Prozess (also VoIP). Dadurch wird die app neu gestartet werden, nachdem die Kündigung.
Nun einige schreiben "die Aufgabe muss beendet werden" - code. Laut Apple haben Sie einige Zeit (5 Sekunden?) Links zu Aufgaben beenden. Ich entdeckte, dass diese müssen CPU-Zeit. Das heißt also: wenn Sie nichts tun, wird Ihre app noch ausgeführt wird! Apple schlage vor, rufen Sie eine expirationhandler, wenn Sie fertig sind mit Ihrer Arbeit. In den folgenden code können Sie sehen, dass ich ein Kommentar bei den expirationHandler. Dadurch wird die app laufen, solange das system ermöglicht es Ihrer app ausgeführt werden. Alle Timer und threads bleiben, bis iOS beendet die app.
Sehr spare mit CPU-Zeit hier, und Ihre app läuft mehr!!! Aber eine Sache ist sicher: Ihre app wird beendet, nachdem es eine Weile. Aber weil Sie sich registriert haben, Ihre app als VoIP-oder eine der anderen, das system wird neu gestartet, die app in den hintergrund, starten Sie Ihren Prozess im hintergrund 😉
Mit diesem PingPong-ich kann eine Menge tun, backgrounding. aber erinnern Sie sich sehr schonen mit CPU-Zeit. Und speichern Sie alle Daten, um wieder die Aussicht - Ihre app wird beendet, einige Zeit später. Um es erscheinen immer noch läuft, müssen Sie springen zurück in Ihre letzten "Zustand" nach wakeup.
Ich weiß nicht, ob dies ist der Ansatz der apps, die Sie erwähnt, aber es funktioniert für mich.
Hoffe ich konnte helfen
Update:
Nach der Messung der Zeit von der BG-task, gab es eine überraschung. Die BG-Task ist begrenzt auf 600 Sekunden. Dies ist die exakte minimale Zeit, die der VoIP-minimumtime (setKeepAliveTimeout:600).
Also DIESER code führt ins "unendliche" Ausführung im hintergrund:
Header:
Code:
Nachdem die app abgelaufen ist, wird der VoIP-expirationHandler genannt werden, wo Sie starten Sie einfach eine lange laufende Aufgabe. Diese Aufgabe wird abgebrochen nach 600 Sekunden. Aber es wird wieder ein Aufruf an die Ablauf-handler, die beginnt eine lange laufende Aufgabe, etc. Jetzt müssen Sie nur noch prüfen Wetter-App wieder in den Vordergrund zu stellen. Schließen Sie dann das bgTask, und Sie sind fertig. Vielleicht kann man tun, sth. wie dies innerhalb der expirationHandler von der long running task. Probieren Sie es einfach aus. Verwenden Sie Ihre Konsole, um zu sehen, was passiert... viel Spaß!
Update 2:
Manchmal die Vereinfachung der Dinge hilft. Mein neuer Ansatz ist dieser:
Dieser arbeitet ohne die VoIP hack. Laut der Dokumentation der Ablauf-handler (in diesem Fall meine 'expirationHandler' block) wird ausgeführt, wenn die Ausführung, die Zeit ist vorbei. Definieren Sie den block in einen block variable, kann man rekursiv start der lang Laufenden task wieder in den Ablauf handler. Dies führt in endlose Ausführung, auch.
Bewusst sein, um die Applikation beenden, wenn Ihre Anwendung tritt in den Vordergrund wieder. Und beenden Sie den Vorgang, wenn Sie brauchen es nicht mehr.
Für meine eigene Erfahrung, die ich gemessen etwas.
Mit der Lage Rückrufe mit mit der GPS-radio-auf saugt meinen Akku sehr schnell down. Mit dem Ansatz, was ich geschrieben in Update 2 nimmt fast keine Energie. Nach der "userexperience" dies ist ein besserer Ansatz. Vielleicht andere Apps, die genauso funktionieren, versteckt sein Verhalten hinter GPS-Funktionalität ...
InformationsquelleAutor der Antwort JackPearse
Was Funktioniert & Was nicht
Es ist nicht ganz klar, welche dieser Antworten zu work & ich habe verschwendet viel Zeit damit, Sie alle. So, hier ist meine Erfahrung mit jeder Strategie:
beginBackgroundTask...
- funktioniert nicht. Es wird Sie nach 10 Minuten. Auch wenn Sie versuchen, die Korrekturen in die Kommentare (zumindest die Kommentare bis Nov 30, 2012).Im Grunde verwenden Sie die "location" hintergrund-Modus halten Sie Ihre app im hintergrund laufen. Es funktioniert, auch wenn der Benutzer nicht erlauben, den aktuellen Standort. Auch wenn der Benutzer drückt die home-Taste und startet eine weitere app, die app noch ausgeführt werden. Es ist auch eine Batterie Abtropffläche & kann eine Strecke sein, die in den Genehmigungsprozess, wenn Sie Ihre app hat nichts zu tun mit der Lage, aber soweit ich weiß ist es die einzige Lösung, die eine gute chance hat, bewilligt zu werden.
Hier ist, wie es funktioniert:
In Ihre plist, set:
Verweisen Sie auf die CoreLocation framework (Build-Phasen) und fügen Sie diesen code irgendwo in Ihre app (bevor es weiter geht in den hintergrund):
Hinweis:
startMonitoringSignificantLocationChanges
wird nicht Arbeit.Es ist auch erwähnenswert, dass, wenn Ihre app abstürzt, dann iOS wird nicht bringen Sie wieder zum Leben. Die VOIP-hack ist die einzige, die können bringen Sie zurück.
InformationsquelleAutor der Antwort bendytree
Gibt es eine andere Technik zu bleiben für immer in den hintergrund - Start/Stopp-Standort-manager im hintergrund Aufgabewird reset der hintergrund-timer, wenn didUpdateToLocation: genannt wird.
Ich weiß nicht, warum es funktioniert, aber ich denke, didUpdateToLocation ist auch als eine Aufgabe und damit setzt Sie den timer.
Basierend auf Tests, ich glaube, das ist das, was DataMan Pro ist mit.
Finden Sie in diesem Beitrag https://stackoverflow.com/a/6465280 wo ich trick aus.
Hier sind einige Ergebnisse aus unserer app:
InformationsquelleAutor der Antwort Kashif Shaikh
Habe ich versucht das Update 2, aber es funktioniert einfach nicht. Wenn der Ablauf-handler aufgerufen wird, endet die hintergrund-task. Starten Sie dann einen neuen hintergrund Aufgabe nur Kräfte, die eine sofortige Aufruf zum Ablauf handler wieder (der timer wird nicht zurückgesetzt und ist immer noch abgelaufen). Also ich habe 43 startet/Stoppt die hintergrund-tasks, bevor die app angehalten wurde.
InformationsquelleAutor der Antwort iOSTester
Wenn es nicht GPS-ich denke, die einzige andere Weg, es zu tun, ist die Hintergrundmusik-Funktion, d.h., spielen 4"33" die ganze Zeit aktiviert. Beide klingen ein bisschen wie ein Missbrauch der hintergrund-Verarbeitung-APIs und damit potenziell den Launen der review-Prozess.
InformationsquelleAutor der Antwort Stephen Darlington
in meinen tests auf iOS5 ich fand es hilfreich, CoreLocation monitoring gestartet, über startMonitoringForLocationChangeevents(nicht SignificantLocationChange),
Genauigkeit spielt keine Rolle
und es auch auf diese Weise auf den iPod
wenn ich das Tue - backgroundTimeRemaining ist nie untergeht.
InformationsquelleAutor der Antwort dkzm