IOS 7: tâches de fonds

mercredi 12 mars 2014

Une des nouveautés de IOS7, est bien sûr la gestion multitâches en background.
Bien sûr, Apple a limité ces fonctionnalités de tâches de fonds pour protéger l’utilisateur de consommation abusive de batterie et du processeur de l’appareil.
Apple fournit aux développeurs des moyens pour exécuter des tâches de fonds limitées avant d’être suspendu.
En outre, il est possible d’exécuter des tâches de fonds longues suivant certaines lignes directrices d’Apple, tels que les mises à jour de localisation et fond sonore.
Depuis IOS4, Apple prend en charge le multitâche et permet d’exécuter des tâches de fonds finies limitées en temps lorsque l’application passe en arrière plan.
L’état d’arrière plan dans l’application Delegate est un état intermédiaire avant la suspension de l’application.

Depuis IOS7, le background Fetch est ouvert aux développeurs, cette fonctionnalité permet de récupérer des données lorsque l’application passe en arrière-plan.  Pour le mettre en place, il suffit de l’activer dans votre projet: background fetch
Une fois la fonctionnalité activée, vous trouverez dans les Réglages>Général>Actualisation en arrière plan de votre appareil,votre application avec la possibilité de l’activé ou désactivé.
Au niveau du code, il ne reste plus qu’à spécifier les données à rafraîchir et la fréquence à laquelle l’application souhaite fonctionner. Il faut donc définir la méthode performFetchWithCompletionHandler qui sera appelée pour rafraîchir les données:

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{

}
Dans l’ Appdelegate.m ,il suffit d’utiliser la méthode
setMinimumBackgroundFetchInterval:
sur votre
UIApplication
. La valeur par défaut est
UIApplicationBackgroundFetchIntervalNever
, il vous faudra donc spécifier un autre intervalle. Si vous souhaitez être activé aussi souvent que possible, il est conseillé d’utiliser la constante
UIApplicationBackgroundFetchIntervalMinimum
.

Voici un lien vers un tutoriel qui explique le transfert en background

Attention:  il faut bien se rendre compte que c’est une valeur indicative, il n’est pas possible de savoir si et quand votre application va lancer cette tâche de fond. Apple a mis au point un algorithme qui détermine si et quand l’application est invoquée en fonction de l’utilisateur, ainsi que des précédentes sessions d’exécution pour économiser intelligemment les ressources en background (batterie / processeur). Par exemple, inutile de rafraîchir les données entre minuit et 6h du matin si vous dormez. Si vous utilisez cette application une fois par jour à 12h, l’idéal est de fetcher les nouvelles données une fois par jour à 11h55.
Comme il est difficile de prévoir quand cette fonction sera appelée, il est possible dans Xcode d’activer une option dans le Scheme de votre projet:
scheme background fetch

Pour iOS 7, Apple a fourni une nouvelle fonctionnalité pour permettre aux applications d’iOS de gérer des grands téléchargements et uploads. Il n’y a aucune restriction de temps, et les demandes peuvent être mises dans une file d’attente soit en mode premier plan ou arrière-plan. iOS gère la plupart des aspects du transfert et réveille l’application pour traiter des détails particuliers, comme l’authentification et les erreurs. C’est la classe NSURLSession / NSURLSessionTasks qui gère la fonctionnalité précitée. NSURLSessionTasks permet à iOS de reprendre le traitement de votre téléchargement même après que l’application soit terminée ou passée en arrière plan. Il y a aussi des rappels que vous pouvez avoir besoin dans votre application lorsqu’elle est relancée  ou réveillée, vous pouvez vous reconnecter à une NSURLSession pour obtenir la réponse des données:  application : handleEventsForBackgroundURLSession : completionHandler :
Evidemment par défaut, les transferts se font de manière à ce que l’utilisateur soit le moins déranger, c’est-à-dire n’exécutera pas le transfert si la batterie est faible ou si le service de données cellulaires est indisponible. Si l’utilisateur quitte explicitement l’application en retirant le processus du multi tâche, le téléchargement ne reprendra que lorsque l’utilisateur relance l’application.


Dans les capabilities de votre projet (voir première image de l’article) il est aussi possible d’activer les remotes notifications dans Background Mode, ce qui permet de recevoir des notifications silencieuse d’un serveur APNS pour pouvoir exécuter des tâches de fonds même en arrière plan. Ces notifications n’ont pas besoin de définir un payload, sound et/ou badge. Mais ce qui est important de savoir c’est que ces notifications silencieuses sont limitées et la grande question est de savoir combien de notifications sont considérées comme acceptable avant que les notifications soient mises dans un spool. Il semblerait que quelques notifications par heure serait acceptable et livrés immédiatement sans quoi si le taux est élevé, elles seront stockés pour une livraison ultérieure.

Attention: Lors d’une mise en ligne sur l’Appstore mon application a été rejetée à cause des metadescriptions. Il faut savoir que dans la description de votre application vous devez spécifier que les tâches de fond risque d’augmenter la consommation de votre batterie! Il faut donc rajouter dans la description de votre application sur itunesconnect une phrase du type: « Continued use of GPS running in the background can dramatically decrease battery life. « 

Voici un lien vers un tutoriel qui explique le transfert en background

Tags: background mode , IOS 7 , Notifications , NSURLSession , NSURLSessionTasks