Background Fetch, Remote Notifications und Background Transfer Service

Systemressourcen bei der App-Entwicklung für iOS schonen

Listing 1 - Prüfung der Hintergrunddienste

// Kontrolle, ob auf dem Gerät die Hintergrunddienste genutzt werden können.

if ([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusAvailable) {

NSLog(@"Hintergrunddienste können in der App genutzt werden.");

}

else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusRestricted)

{

NSLog(@"Hintergrunddienste stehen nicht zur Verfügung. Z.B. durch Einschränkung in Konfigurationsprofilen oder anderen Einschränkungen.");

}

else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusDenied)

{

NSLog(@"Der Benutzer hat die Hintergrunddienste explizit deaktiviert.");

}

Standardmäßig ist der Ausführungsintervall mit dem "UIApplicationBackgroundFetchIntervalNever mode" belegt, dies bedeutet, dass keinerlei Hintergrundaktivitäten vorgesehen sind. Dies kann durch eine Anpassung des Entwicklers innerhalb der Standardmethode eines Projektes application:didFinishLaunchingWithOptions angepasst werden.

Listing 2 - Minimales Intervall zur Hintergrundaktualisierung definieren

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; return YES;}

Als Wert kann entweder "UIApplicationBackgroundFetchIntervalMinimum" (Listing 2) übergeben werden, um das "kürzest mögliche" Intervall anzufordern oder aber ein per NSTimeInterval individueller Zeitwert.

iOS 8 wird versuchen die Zeitintervalle entsprechend einzuhalten, jedoch das Ganze an der Verfügbarkeit der Systemressourcen optimieren. Ferner versucht iOS 8 die Zeitintervalle unterschiedlichere Apps aufeinander abzustimmen.

Als letzter Integrationsschritt muss der neue EventHandler "application:performFetchWithCompletionHandler" verwendet werden.

Dieser Event wird bei Hintergrundaktivität aufgerufen und startet den Code zum Laden und Verarbeiten der geladenen Daten. Zur (Fehler-)Fallverarbeitung muss der Entwickler innerhalb dieses Events dem Betriebssystem mitteilen, dass entweder

  • keine Daten zum Download / Verarbeitung vorlagen ("completionHandler(UIBackgroundFetchResultNoData);"),

  • Daten geladen und verarbeitet werden konnten ("completionHandler(UIBackgroundFetchResultNewData);") oder

  • dass ein Fehlerfall ("completionHandler(UIBackgroundFetchResultFailed);") aufgetreten ist.

Stehen neue Daten zur Verfügung, muss der Entwickler ferner das Interface für den Anwender updaten. Hierbei erzeugt iOS 8 automatisch einen neuen App-Screenshot (für den Taskmanager) wodurch eine "Art" echtes Multitasking für den Anwender simuliert wird. Die aktuellen Daten stehen dem Anwender nun sofort nach Aufruf der App zur Verfügung.

Der Autor empfiehlt für den Einsatz im Firmenumfeld, die Erstellung der Screenshots zu unterdrücken, zu löschen oder durch ein Standardhintergrundbild zu ersetzen. Anderenfalls könnten Unbefugte beim Durchwischen des Taskmanagers vertrauliche Informationen einsehen.

Es gibt jedoch eine wichtige Tatsache zu beachten. Die Ausführung innerhalb des Events inkl. des abschließenden Aufrufs des "completionHandler" ist auf maximal 30 Sekunden beschränkt. Braucht die Anwendung länger als 30 Sekunden, wird diese bis zum nächsten Intervall wieder "schlafen" gelegt. Werden größere Downloads benötigt, muss der Entwickler die Background Transfer Service API in der App verwenden.