Background Fetch, Remote Notifications und Background Transfer Service
Systemressourcen bei der App-Entwicklung für iOS schonen
Background Transfer Service
Wenn eine App größere Datenmengen über das Internet beziehen muss, empfiehlt es sich für Entwickler den Background Transfer Service zu nutzen. Dieser ermöglicht es Entwicklern das 30-Sekunden-Zeitfenster zu umgehen und umfangreiche Datenmengen im Hintergrund zu beziehen. Diese API stellt eine Systemwarteschlange (Queue) für Dateidownloads zur Verfügung. Diese Warteschlange wird von iOS 8 sehr robust verwaltet und bleibt auch nach Neustarts des Systems erhalten und ggf. weiter abgearbeitet.
Die Nutzung erfolgt über die Klasse NSURLSession. Diese Klasse ermöglicht den Dateitransfer über die Protokolle HTTP/HTTPS. Die NSURLSession stellt einen stark konfigurierbaren Container mit fein granularer Konfigurierbarkeit (z.B Unterstützung von "Privat Browsing) dar.
Die kleinste Einheit der NSURLSession stellt das Task Objekt (NSURLSessionTask) dar. Dabei handelt es sich um die Ausprägungen NSURLSessionDataTask, NSURLSessionUploadTask-, NSURLSessionDownloadTask. Die hierüber verwalteten Aktionen unterliegen keiner Zeitlimitierung.
Die NSURLSessionDataTask Klasse wird verwendet, um Daten von einem Server zu beziehen. Der grundsätzliche Unterschied zu Upload- und Download-Tasks liegt hierbei in der direkten "in Memory" Bereitstellung der Daten für die auftraggebende App - dies erfolgt ohne Umweg über das Dateisystem.
Die Klassen NSURLSessionUploadTask und NSURLSessionDownloadTask stellen eine Unterklasse der NSURLSessionDataTask dar. Im Gegensatz zum NSURLSessionDataTask lassen sich Upload- und Download-Vorgänge pausieren.
Nach der erfolgreichen Abarbeitung der Task Objekte in der Warteschlange wird dies der jeweiligen App, über den EventHandler ("application:handleEventsForBackgroundURLSession:completionHandler:") mitgeteilt. Innerhalb dieser Methode muss der Entwickler für die permanente Speicherung der empfangenen Daten sorgen, diese je nach Anwendungsfall verarbeiten und ggf. das Benutzerinterface aktualisieren (Listing 3).
Listing 3 - Daten permanent speichern
/**
* Unsere NSURLSession hat einen Download abgeschlossen und die Protokollmethode wird aufgerufen.
* Quelle: SimpleBackgroundTransfer Example von Apple.
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask
*)downloadTask didFinishDownloadingToURL:(NSURL *)downloadURL
{
// Download wurde fertiggestellt - wir erzeugen einen NSFileManager zum Speichern
NSFileManager *fileManager = [NSFileManager defaultManager];
// Wir ermitteln den Ort für die Ablage der heruntergeladenen Daten
NSArray *URLs = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSURL *documentsDirectory = [URLs objectAtIndex:0];
NSURL *originalURL = [[downloadTask originalRequest] URL];
NSURL *destinationURL = [documentsDirectory URLByAppendingPathComponent:[originalURL lastPathComponent]];
NSError *errorCopy;
// Wir entfernen ggf. schon vorhandene Daten
[fileManager removeItemAtURL:destinationURL error:NULL];
BOOL success = [fileManager copyItemAtURL:downloadURL toURL:destinationURL error:&errorCopy];
if (success)
{
// Das Speichern ist erfolgt, nun können wir z.B. darauf reagieren und die Anzeige aktualisieren oder die Daten verarbeiten.
});
}
else
{
// Es ist ein Fehler aufgetreten, den wir nun individuell auswerten können.
}
}
Für eine pragmatische Nutzung der APIs empfiehlt der Autor eine sinnvolle Kombination dieser.
Die zeitlimitierten Dienste eigenen sich vornehmlich für kurze und einfache Statusaktualisierungen sowie Initialisierungen von Apps - ggf. um einen Datentransfer und z.B. die Background Transfer Services anzustoßen.
Bei Apps im Unternehmensumfeld müssen Entwickler zudem bedenken, dass diese bei der Nutzung von NSURLSession dafür Sorge tragen müssen, dass die Möglichkeiten zur separierten und privaten Speicherung der Downloaddaten, die NSURLSession bereitstellt, zum Einsatz kommen. Das soll ein Kompromittieren der Nutzdaten während des Herunterladens unterbinden.