Vor iOS 7 waren Entwickler ziemlich eingeschränkt in dem, was sie tun konnten, wenn ihre Apps den Vordergrund verließen. Abgesehen von VOIP und standortbasierten Funktionen bestand die einzige Möglichkeit, Code im Hintergrund auszuführen, darin, Hintergrundaufgaben zu verwenden, die auf einige Minuten beschränkt waren. Wenn Sie ein großes Video zur Offline-Anzeige herunterladen oder die Fotos eines Benutzers auf Ihrem Server sichern möchten, können Sie nur einen Teil der Arbeit erledigen.
iOS 7 fügt zwei neue APIs zum Aktualisieren der Benutzeroberfläche und des Inhalts Ihrer App im Hintergrund hinzu. Mit dem ersten, Background Fetch, können Sie in regelmäßigen Abständen neue Inhalte aus dem Netzwerk abrufen. Die zweite, Remote Notifications, ist eine neue Funktion, die Push-Benachrichtigungen nutzt, um eine App zu benachrichtigen, wenn ein Ereignis aufgetreten ist. Mit diesen beiden neuen Mechanismen können Sie die Benutzeroberfläche Ihrer App auf dem neuesten Stand halten und die Arbeit am neuen Hintergrundübertragungsdienst planen, mit dem Sie Netzwerkübertragungen außerhalb des Prozesses (Downloads und Uploads) durchführen können.
Hintergrundabruf und Fernbenachrichtigungen sind einfache Anwendungsdelegierte mit 30 Sekunden Wanduhrzeit, um Arbeiten auszuführen, bevor Ihre App angehalten wird. Sie sind nicht für CPU-intensive Arbeit oder lang laufende Aufgaben gedacht, sondern für die Warteschlange lang laufender Netzwerkanforderungen, wie ein großer Filmdownload, oder die Durchführung schneller Inhaltsaktualisierungen.
Aus Benutzersicht ist die einzige offensichtliche Änderung des Multitasking der neue App Switcher, der eine Momentaufnahme der Benutzeroberfläche jeder App anzeigt, wie sie war, als sie den Vordergrund verließ. Es gibt jedoch einen Grund für die Anzeige der Snapshots: Sie können den Snapshot Ihrer App jetzt aktualisieren, nachdem Sie die Hintergrundarbeit abgeschlossen haben, und eine Vorschau neuer Inhalte anzeigen. Apps für soziale Netzwerke, Nachrichten oder Wetter können jetzt die neuesten Inhalte anzeigen, ohne dass der Benutzer die App öffnen muss. Wir werden später sehen, wie Sie den Snapshot aktualisieren.
Background Fetch
Background Fetch ist eine Art intelligenter Abfragemechanismus, der am besten für Apps mit häufigen Inhaltsaktualisierungen wie Social Networking-, Nachrichten- oder Wetter-Apps geeignet ist. Das System weckt die App basierend auf dem Verhalten eines Benutzers und zielt darauf ab, Hintergrundabrufe auszulösen, bevor der Benutzer die App startet. Wenn der Benutzer beispielsweise eine App immer um 1 Uhr morgens verwendet, lernt und passt sich das System an und führt Abrufe vor Nutzungszeiträumen durch. Wenn Sie melden, dass während eines Abrufs keine neuen Daten verfügbar waren, kann iOS diese Informationen anpassen, um Abrufe in ruhigen Zeiten zu vermeiden.
Der erste Schritt beim Aktivieren des Hintergrundabrufs besteht darin, anzugeben, dass Sie die Funktion im Schlüssel UIBackgroundModes
in Ihrer Info-Liste verwenden. Der einfachste Weg, dies zu tun, ist die Verwendung der neuen Registerkarte Funktionen im Projekteditor von Xcode 5, die einen Abschnitt Hintergrundmodi für die einfache Konfiguration von Multitasking-Optionen enthält.
Alternativ können Sie den Schlüssel manuell bearbeiten:
<key>UIBackgroundModes</key><array> <string>fetch</string></array>
Als nächstes teilen Sie iOS mit, wie oft Sie abrufen möchten:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ ; return YES;}
Sie müssen also ein Zeitintervall festlegen, da sonst die App niemals im Hintergrund aufgerufen wird. Der Wert UIApplicationBackgroundFetchIntervalMinimum
fordert das System auf, so oft wie möglich zu verwalten, wann Ihre App geweckt wird. Beispielsweise kann eine Wetter-App die Bedingungen nur stündlich aktualisieren. iOS wartet mindestens das angegebene Zeitintervall zwischen den Hintergrundabrufen.
Wenn Ihre Anwendung es einem Benutzer ermöglicht, sich abzumelden, und Sie wissen, dass keine neuen Daten vorhanden sind, möchten Sie möglicherweise minimumBackgroundFetchInterval
auf UIApplicationBackgroundFetchIntervalNever
zurücksetzen, um ein guter Bürger zu sein und Ressourcen zu schonen.
Der letzte Schritt besteht darin, die folgende Methode in Ihrem Anwendungsdelegaten zu implementieren:
- (void) application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ NSURLSessionConfiguration *sessionConfiguration = ; NSURLSession *session = ; NSURL *url = initWithString:@"http://yourserver.com/data.json"]; NSURLSessionDataTask *task = ; // Start the task ;}
Hier können Sie arbeiten ausführen, wenn Sie vom System geweckt werden. Denken Sie daran, dass Sie nur 30 Sekunden Zeit haben, um festzustellen, ob neue Inhalte verfügbar sind, die neuen Inhalte zu verarbeiten und Ihre Benutzeroberfläche zu aktualisieren. Dies sollte genug Zeit sein, um Daten aus dem Netzwerk abzurufen und ein paar Miniaturansichten für Ihre Benutzeroberfläche abzurufen, aber nicht viel mehr. Wenn Ihre Netzwerkanforderungen abgeschlossen sind und Ihre Benutzeroberfläche aktualisiert wurde, sollten Sie den Completion-Handler aufrufen.
Der Completion-Handler dient zwei Zwecken. Zunächst misst das System die von Ihrem Prozess verwendete Leistung und zeichnet auf, ob neue Daten basierend auf dem von Ihnen übergebenen Argument UIBackgroundFetchResult
verfügbar waren. Zweitens wird beim Aufrufen des Completion-Handlers ein Snapshot Ihrer Benutzeroberfläche erstellt und der App Switcher aktualisiert. Der Benutzer sieht den neuen Inhalt, wenn er Apps wechselt. Dieses Snapshot-Verhalten des Vervollständigungshandlers ist allen Vervollständigungshandlern in den neuen Multitasking-APIs gemeinsam.
In einer realen Anwendung sollten Sie completionHandler
an Unterkomponenten Ihrer Anwendung übergeben und aufrufen, wenn Sie Daten verarbeitet und Ihre Benutzeroberfläche aktualisiert haben.
An dieser Stelle fragen Sie sich vielleicht, wie iOS die Benutzeroberfläche Ihrer App erfassen kann, wenn sie im Hintergrund ausgeführt wird, und wie der Anwendungslebenszyklus mit dem Hintergrundabruf funktioniert. Wenn Ihre App derzeit angehalten ist, wird sie vom System aktiviert, bevor application: performFetchWithCompletionHandler:
aufgerufen wird. Wenn Ihre App nicht ausgeführt wird, startet das System sie und ruft die üblichen Delegatmethoden auf, einschließlich application: didFinishLaunchingWithOptions:
. Sie können sich vorstellen, dass die App genauso ausgeführt wird, als hätte der Benutzer sie vom Sprungbrett aus gestartet, außer dass die Benutzeroberfläche unsichtbar und außerhalb des Bildschirms gerendert ist.
In den meisten Fällen führen Sie die gleiche Arbeit aus, wenn die Anwendung im Hintergrund gestartet wird, wie im Vordergrund, aber Sie können Hintergrundstarts erkennen, indem Sie sich die applicationState
-Eigenschaft von UIApplication ansehen:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ NSLog(@"Launched in background %d", UIApplicationStateBackground == application.applicationState); return YES;}
Hintergrundabruf testen
Es gibt zwei Möglichkeiten, einen Hintergrundabruf zu simulieren. Die einfachste Methode besteht darin, Ihre Anwendung über Xcode auszuführen und im Debug-Menü von Xcode auf Hintergrundabruf simulieren zu klicken, während Ihre App ausgeführt wird.
Alternativ können Sie ein Schema verwenden, um zu ändern, wie Xcode Ihre App ausführt. Wählen Sie unter dem Xcode-Menüpunkt Produkt die Option Schema und dann Schemata verwalten. Bearbeiten oder fügen Sie von hier aus ein neues Schema hinzu und aktivieren Sie das Kontrollkästchen Start aufgrund eines Hintergrundabrufereignisses wie unten gezeigt.
Fernbenachrichtigungen
Mit Fernbenachrichtigungen können Sie Ihre App benachrichtigen, wenn wichtige Ereignisse eintreten. Möglicherweise müssen Sie neue Sofortnachrichten zustellen, aktuelle Nachrichtenbenachrichtigungen senden oder die neueste Folge der Lieblingssendung Ihres Benutzers zur Offline-Anzeige herunterladen. Remote-Benachrichtigungen eignen sich hervorragend für sporadische, aber sofort wichtige Inhalte, bei denen die Verzögerung zwischen Hintergrundabrufen möglicherweise nicht akzeptabel ist. Remote-Benachrichtigungen können auch viel effizienter sein als das Abrufen im Hintergrund, da Ihre Anwendung nur bei Bedarf gestartet wird.
Eine Remote-Benachrichtigung ist eigentlich nur eine normale Push-Benachrichtigung mit dem Flag content-available
. Sie können einen Push mit einer Warnmeldung senden, die den Benutzer darüber informiert, dass etwas passiert ist, während Sie die Benutzeroberfläche im Hintergrund aktualisieren. Remote-Benachrichtigungen können jedoch auch stumm geschaltet werden, keine Warnmeldung oder keinen Ton enthalten und nur zum Aktualisieren der Benutzeroberfläche Ihrer App oder zum Auslösen von Hintergrundarbeiten verwendet werden. Sie können dann eine lokale Benachrichtigung veröffentlichen, wenn Sie den Download oder die Verarbeitung des neuen Inhalts abgeschlossen haben.
Stille Push-Benachrichtigungen sind ratenbegrenzt, also haben Sie keine Angst, so viele zu senden, wie Ihre Anwendung benötigt. iOS und die APNS-Server steuern, wie oft sie zugestellt werden, und Sie werden nicht in Schwierigkeiten geraten, wenn Sie zu viele senden. Wenn Ihre Push-Benachrichtigungen gedrosselt werden, werden sie möglicherweise verzögert, bis das Gerät das nächste Mal ein Keep-Alive-Paket sendet oder eine andere Benachrichtigung empfängt.
Senden von Remote-Benachrichtigungen
Um eine Remote-Benachrichtigung zu senden, setzen Sie das Flag content-available in einer Push-Benachrichtigungsnutzlast. Das Flag content-available ist derselbe Schlüssel, mit dem Kiosk-Apps benachrichtigt werden, sodass die meisten Push-Skripte und -Bibliotheken bereits Remotebenachrichtigungen unterstützen. Wenn Sie eine Remotebenachrichtigung senden, möchten Sie möglicherweise auch einige Daten in die Benachrichtigungsnutzlast aufnehmen, damit Ihre Anwendung auf das Ereignis verweisen kann. Dies kann Ihnen einige Netzwerkanfragen ersparen und die Reaktionsfähigkeit Ihrer App erhöhen.
Ich empfehle die Verwendung von Nomad CLI Houston Dienstprogramm Push-Nachrichten zu senden, während der Entwicklung, aber Sie können Ihre Lieblings-Bibliothek oder Skript verwenden.
Sie können Houston als Teil des Nomad-cli-Ruby-Edelsteins installieren:
gem install nomad-cli
Und senden Sie dann eine Benachrichtigung mit dem in Nomad enthaltenen APN-Dienstprogramm
# Send a Push Notification to your Deviceapn push <device token> -c /path/to/key-cert.pem -n -d content-id=42
Hier gibt das Flag -n
an, dass der inhaltsverfügbare Schlüssel enthalten sein soll, und -d
ermöglicht es uns, der Nutzlast unsere eigenen Datenschlüssel hinzuzufügen.
Die resultierende Benachrichtigungsnutzlast sieht folgendermaßen aus:
{ "aps" : { "content-available" : 1 }, "content-id" : 42}
iOS 7 fügt eine neue Anwendungsdelegatmethode hinzu, die aufgerufen wird, wenn eine Push-Benachrichtigung mit dem Schlüssel content-available empfangen wird:
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ NSLog(@"Remote Notification userInfo is %@", userInfo); NSNumber *contentID = userInfo; // Do something with the content ID completionHandler(UIBackgroundFetchResultNewData);}
Auch hier wird die App im Hintergrund gestartet und hat 30 Sekunden Zeit, um neue Inhalte abzurufen und die Benutzeroberfläche zu aktualisieren, bevor der Completion-Handler aufgerufen wird. Wir könnten eine schnelle Netzwerkanforderung ausführen, wie wir es im Beispiel für den Hintergrundabruf getan haben, aber lassen Sie uns den leistungsstarken neuen Hintergrundübertragungsdienst verwenden, um eine große Download-Aufgabe in die Warteschlange zu stellen und zu sehen, wie wir unsere Benutzeroberfläche aktualisieren können, wenn sie abgeschlossen ist.
NSURLSession und Hintergrundübertragungsdienst
Während NSURLSession
eine neue Klasse in iOS 7 ist, bezieht sie sich auch auf die neue Technologie in Foundation Networking. Als Ersatz für NSURLConnection
werden bekannte Konzepte und Klassen wie NSURL
, NSURLRequest
und NSURLResponse
beibehalten. Sie arbeiten mit dem Ersatz von NSURLConnection
, NSURLSessionTask
, um Netzwerkanforderungen zu stellen und deren Antworten zu verarbeiten. Es gibt drei Arten von Sitzungsaufgaben – Daten, Herunterladen und Hochladen –, von denen jede syntaktischen Zucker zu NSURLSessionTask
hinzufügt.
Ein NSURLSession
koordiniert einen oder mehrere dieser NSURLSessionTask
s und verhält sich entsprechend dem NSURLSessionConfiguration
, mit dem es erstellt wurde. Sie können mehrere NSURLSession
s erstellen, um verwandte Aufgaben mit derselben Konfiguration zu gruppieren. Um mit dem Hintergrundübertragungsdienst zu interagieren, erstellen Sie eine Sitzungskonfiguration mit . Aufgaben, die zu einer Hintergrundsitzung hinzugefügt werden, werden in einem externen Prozess ausgeführt und fortgesetzt, auch wenn Ihre App angehalten wird, abstürzt oder beendet wird.
NSURLSessionConfiguration
Hier können Sie Standard-HTTP-Header festlegen, Cache-Richtlinien konfigurieren, die Nutzung des Mobilfunknetzes einschränken und vieles mehr. Eine Option ist das Flag discretionary
, mit dem das System Aufgaben für eine optimale Leistung planen kann. Dies bedeutet, dass Ihre Übertragungen nur über WLAN erfolgen, wenn das Gerät über ausreichende Stromversorgung verfügt. Wenn der Akku fast leer ist oder nur eine Mobilfunkverbindung verfügbar ist, wird Ihre Aufgabe nicht ausgeführt. Das Flag discretionary
wirkt sich nur aus, wenn das Sitzungskonfigurationsobjekt durch Aufrufen der Methode backgroundSessionConfiguration:
erstellt wurde und wenn die Hintergrundübertragung initiiert wird, während sich Ihre App im Vordergrund befindet. Wenn die Übertragung aus dem Hintergrund initiiert wird, wird die Übertragung immer im diskretionären Modus ausgeführt.
Jetzt wissen wir ein wenig über NSURLSession
und wie eine Hintergrundsitzung funktioniert, kehren wir zu unserem Remote-Benachrichtigungsbeispiel zurück und fügen Code hinzu, um einen Download für den Hintergrundübertragungsdienst in die Warteschlange zu stellen. Wenn der Download abgeschlossen ist, benachrichtigen wir den Benutzer, dass die Datei zur Verwendung verfügbar ist.
NSURLSessionDownloadTask
Lassen Sie uns zunächst eine Remote-Benachrichtigung verarbeiten und einen NSURLSessionDownloadTask
für den Hintergrundübertragungsdienst in die Warteschlange stellen. In backgroundURLSession
erstellen wir ein NURLSession
mit einer Hintergrundsitzungskonfiguration und fügen unseren Anwendungsdelegaten als Sitzungsdelegaten hinzu. Die Dokumentation rät davon ab, mehrere Sitzungen mit demselben Bezeichner zu instanziieren, daher verwenden wir dispatch_once
, um mögliche Probleme zu vermeiden:
- (NSURLSession *)backgroundURLSession{ static NSURLSession *session = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSString *identifier = @"io.objc.backgroundTransferExample"; NSURLSessionConfiguration* sessionConfig = ; session = ]; }); return session;}- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ NSLog(@"Received remote notification with userInfo %@", userInfo); NSNumber *contentID = userInfo; NSString *downloadURLString = ]; NSURL* downloadURL = ; NSURLRequest *request = ; NSURLSessionDownloadTask *task = downloadTaskWithRequest:request]; task.taskDescription = ]; ; completionHandler(UIBackgroundFetchResultNewData);}
Wir erstellen eine Download-Aufgabe mit der Klassenmethode NSURLSession
, konfigurieren ihre Anforderung und stellen eine Beschreibung zur späteren Verwendung bereit. Sie müssen daran denken, aufzurufen, um die Aufgabe tatsächlich zu starten, da alle Sitzungsaufgaben im angehaltenen Zustand beginnen.
Jetzt müssen wir die NSURLSessionDownloadDelegate
-Methoden implementieren, um Rückrufe zu erhalten, wenn der Download abgeschlossen ist. Möglicherweise müssen Sie auch die Methoden NSURLSessionDelegate
oder NSURLSessionTaskDelegate
implementieren, wenn Sie die Authentifizierung oder andere Ereignisse im Sitzungslebenszyklus verarbeiten müssen. Sie sollten Apples Dokumentlebenszyklus einer URL-Sitzung mit benutzerdefinierten Delegaten konsultieren, in dem der vollständige Lebenszyklus für alle Arten von Sitzungsaufgaben erläutert wird.
Keine der NSURLSessionDownloadDelegate
Delegatmethoden ist optional, obwohl die einzige Methode, bei der wir in diesem Beispiel Maßnahmen ergreifen müssen, ist. Wenn der Download der Aufgabe abgeschlossen ist, erhalten Sie eine temporäre URL für die Datei auf der Festplatte. Sie müssen die Datei in den Speicher Ihrer App verschieben oder kopieren, da sie aus dem temporären Speicher entfernt wird, wenn Sie von dieser Delegierungsmethode zurückkehren.
#Pragma Mark - NSURLSessionDownloadDelegate- (void) URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ NSLog(@"downloadTask:%@ didFinishDownloadingToURL:%@", downloadTask.taskDescription, location); // Copy file to your app's storage with NSFileManager // ... // Notify your UI}- (void) URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{}- (void) URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{}
Wenn Ihre App nach Abschluss der Hintergrundsitzungsaufgabe noch im Vordergrund ausgeführt wird, reicht der obige Code aus. In den meisten Fällen wird Ihre App jedoch nicht ausgeführt oder im Hintergrund angehalten. In diesen Fällen müssen Sie zwei Methoden für Anwendungsdelegierte implementieren, damit das System Ihre Anwendung aktivieren kann. Im Gegensatz zu früheren Delegatenrückrufen wird der Anwendungsdelegierte zweimal aufgerufen, da Ihre Sitzungs- und Aufgabendelegierten möglicherweise mehrere Nachrichten erhalten. Die App-Delegate-Methode application: handleEventsForBackgroundURLSession:
wird aufgerufen, bevor diese NSURLSession
Delegate-Nachrichten gesendet werden, und URLSessionDidFinishEventsForBackgroundURLSession
wird danach aufgerufen. In der ersteren Methode speichern Sie einen Hintergrund completionHandler
, und in der letzteren rufen Sie ihn auf, um Ihre Benutzeroberfläche zu aktualisieren:
- (void) application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{ // You must re-establish a reference to the background session, // or NSURLSessionDownloadDelegate and NSURLSessionDelegate methods will not be called // as no delegate is attached to the session. See backgroundURLSession above. NSURLSession *backgroundSession = ; NSLog(@"Rejoining session with identifier %@ %@", identifier, backgroundSession); // Store the completion handler to update your UI after processing session events ;}- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{ NSLog(@"Background URL session %@ finished events.\n", session); if (session.configuration.identifier) { // Call the handler we stored in -application:handleEventsForBackgroundURLSession: ; }}- (void)addCompletionHandler:(CompletionHandlerType)handler forSession:(NSString *)identifier{ if () { NSLog(@"Error: Got multiple handlers for a single session identifier. This should not happen.\n"); } ;}- (void)callCompletionHandlerForSession: (NSString *)identifier{ CompletionHandlerType handler = ; if (handler) { ; NSLog(@"Calling completion handler for session %@", identifier); handler(); }}
Dieser zweistufige Vorgang ist erforderlich, um die Benutzeroberfläche Ihrer App zu aktualisieren, wenn Sie sich nach Abschluss der Hintergrundübertragung noch nicht im Vordergrund befinden. Wenn die App nach Abschluss der Hintergrundübertragung überhaupt nicht ausgeführt wird, wird sie von iOS im Hintergrund gestartet, und die vorhergehenden Anwendungs- und Sitzungsdelegatmethoden werden nach application:didFinishLaunchingWithOptions:
aufgerufen.
Konfiguration und Einschränkung
Wir haben kurz auf die Leistungsfähigkeit von Hintergrundübertragungen eingegangen, aber Sie sollten die Dokumentation lesen und sich die NSURLSessionConfiguration
Optionen ansehen, die Ihren Anwendungsfall am besten unterstützen. Beispiel: NSURLSessionTasks
unterstützt Ressourcen-Timeouts über die timeoutIntervalForResource
-Eigenschaft von NSURLSessionConfiguration
. Sie können dies verwenden, um anzugeben, wie lange Sie zulassen möchten, dass eine Übertragung abgeschlossen wird, bevor Sie vollständig aufgeben. Sie können dies verwenden, wenn Ihr Inhalt nur für eine begrenzte Zeit verfügbar ist oder wenn das Herunterladen oder Hochladen der Ressource innerhalb des angegebenen TimeInterval darauf hinweist, dass der Benutzer nicht über ausreichende WLAN-Bandbreite verfügt.
Zusätzlich zu Download-Aufgaben unterstützt NSURLSession
Upload-Aufgaben vollständig, sodass Sie möglicherweise ein Video im Hintergrund auf Ihren Server hochladen und Ihrem Benutzer versichern, dass er die App nicht mehr wie in iOS 6 ausführen muss. Eine nette Geste wäre, die Eigenschaft sessionSendsLaunchEvents
Ihres NSURLSessionConfiguration
auf NO
zu setzen, wenn Ihre App nach Abschluss der Übertragung nicht im Hintergrund gestartet werden muss. Die effiziente Nutzung der Systemressourcen hält sowohl iOS als auch den Benutzer zufrieden.
Schließlich gibt es einige Einschränkungen bei der Verwendung von Hintergrundsitzungen. Da ein Delegat erforderlich ist, können Sie die einfachen blockbasierten Rückrufmethoden für NSURLSession
nicht verwenden. Das Starten Ihrer App im Hintergrund ist relativ teuer, daher werden immer HTTP-Weiterleitungen verwendet. Der Hintergrundübertragungsdienst unterstützt nur HTTP und HTTPS und Sie können keine benutzerdefinierten Protokolle verwenden. Das System optimiert Übertragungen basierend auf den verfügbaren Ressourcen und Sie können Ihre Übertragung nicht jederzeit im Hintergrund erzwingen.
Beachten Sie auch, dass NSURLSessionDataTasks
in Hintergrundsitzungen überhaupt nicht unterstützt werden und Sie diese Aufgaben nur für kurzlebige, kleine Anforderungen und nicht für Downloads oder Uploads verwenden sollten.
Zusammenfassung
Die leistungsstarken neuen Multitasking- und Netzwerk-APIs in iOS 7 eröffnen eine ganze Reihe von Möglichkeiten für neue und bestehende Apps. Betrachten Sie die Anwendungsfälle in Ihrer App, die von Out-of-Process-Netzwerkübertragungen und frischen Daten profitieren können, und nutzen Sie diese fantastischen neuen APIs optimal. Implementieren Sie im Allgemeinen Hintergrundübertragungen, als ob Ihre Anwendung im Vordergrund ausgeführt wird, und führen Sie entsprechende UI-Updates durch, und der größte Teil der Arbeit ist bereits für Sie erledigt.
-
Verwenden Sie die entsprechende neue API für den Inhalt Ihrer App.
-
Seien Sie effizient und rufen Sie die Vervollständigungshandler so früh wie möglich auf.
-
Completion-Handler aktualisieren den UI-Snapshot Ihrer App.
Weiterführende Literatur
-
WWDC 2013 Session „Was ist neu bei Multitasking“
-
WWDC 2013 Session „Was ist neu in Foundation Networking“
-
URL Loading System Programming Guide