Background Fetch, Remote Notifications und Background Transfer Service

Systemressourcen bei der App-Entwicklung für iOS schonen

09.04.2015
Von   
Mark Zimmermann leitet hauptberuflich das Center of Excellence (CoE mobile) zur mobilen Lösungsentwicklung bei der EnBW Energie Baden-Württemberg AG in Karlsruhe. Er weist mehrere Jahre Erfahrung in den Bereichen Mobile Sicherheit, Mobile Lösungserstellung, Digitalisierung und Wearables auf. Der Autor versteht es, seine Themen aus unterschiedlichsten Blickwinkeln für unternehmensspezifische Herausforderungen darzustellen. Neben seiner hauptberuflichen Tätigkeiten ist er Autor zahlreicher Artikel in Fachmagazinen.

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.