iOS Background Execution – traduction de la documentation apple

La documentation Apple qui traite de ce sujet se trouve ici : https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Voici le texte traduit en Français :

Background Execution

Lorsque l’utilisateur n’utilise pas activement votre application, le système la place en arrière-plan. Pour de nombreuses applications, l’état d’arrière-plan n’est qu’un bref arrêt avant de suspendre l’application. Suspendre les applications est un moyen d’améliorer la durée de vie de la batterie. Il permet également au système de consacrer des ressources système importantes à la nouvelle application de premier plan qui a attiré l’attention de l’utilisateur.

La plupart des applications peuvent passer à l’état suspendu assez facilement, mais il existe également des raisons légitimes pour que les applications continuent de fonctionner en arrière-plan.

Voici quelques exemples :

  • Une application de randonnée peut vouloir suivre la position de l’utilisateur au fil du temps afin qu’il puisse afficher ce parcours superposé au-dessus d’une carte de randonnée.
  • Une application audio peut avoir besoin de continuer à jouer de la musique sur l’écran verrouillé.
  • D’autres applications peuvent vouloir télécharger du contenu en arrière-plan afin de minimiser le délai de présentation de ce contenu à l’utilisateur.

Lorsque vous estimez qu’il est nécessaire de maintenir votre application en arrière-plan, iOS vous aide à le faire efficacement et sans épuiser les ressources du système ou la batterie de l’utilisateur. Les techniques offertes par iOS tombent dans trois catégories:

  • Les applications qui démarrent une tâche courte au premier plan peuvent demander du temps pour terminer cette tâche lorsque l’application passe en arrière-plan.
  • Les applications qui lancent des téléchargements au premier plan peuvent transférer la gestion de ces téléchargements au système, permettant ainsi à l’application d’être suspendue ou arrêtée pendant la durée du téléchargement.
  • Les applications devant s’exécuter en arrière-plan pour prendre en charge des types de tâches spécifiques peuvent déclarer leur prise en charge pour un ou plusieurs modes d’exécution en arrière-plan.

Essayez toujours d’éviter de travailler en arrière-plan, sauf si cela améliore l’expérience globale de l’utilisateur. Une application peut être déplacée en arrière-plan, car l’utilisateur a lancé une application différente ou parce qu’il a verrouillé l’appareil et ne l’utilise pas pour le moment. Dans les deux cas, l’utilisateur indique que votre application n’a pas besoin de faire de travail significatif à l’heure actuelle. Continuer à fonctionner dans de telles conditions ne fera que vider la batterie de l’appareil et pourrait amener l’utilisateur à forcer la fermeture de votre application. Soyez donc conscient du travail que vous faites en arrière-plan et évitez-le quand vous le pouvez.

Exécuter des tâches de longueur finie

Les applications déplacées en arrière-plan sont supposées se mettre au repos le plus rapidement possible pour pouvoir être suspendues par le système. Si votre application est au milieu d’une tâche et qu’elle a besoin d’un peu plus de temps, elle peut appeler la méthode beginBackgroundTaskWithName: expirationHandler: ou beginBackgroundTaskWithExpirationHandler: de l’objet UIApplication pour demander un délai d’exécution supplémentaire. L’appel de l’une de ces méthodes retarde temporairement la suspension de votre application, ce qui lui laisse un peu plus de temps pour terminer son travail. Une fois ces travaux terminés, votre application doit appeler la méthode endBackgroundTask: pour que le système sache qu’elle est terminée et peut être suspendue.

Chaque appel à la méthode beginBackgroundTaskWithName: expirationHandler: ou beginBackgroundTaskWithExpirationHandler: génère un jeton unique à associer à la tâche correspondante. Lorsque votre application termine une tâche, elle doit appeler la méthode endBackgroundTask: avec le jeton correspondant pour que le système sache que la tâche est terminée. Si vous n’appelez pas la méthode endBackgroundTask: pour une tâche en arrière-plan, votre application sera terminée. Si vous avez fourni un gestionnaire d’expiration lors du démarrage de la tâche, le système appelle ce gestionnaire et vous donne une dernière chance de terminer la tâche et d’éviter la fin.

Vous n’avez pas besoin d’attendre que votre application passe en arrière-plan pour désigner des tâches en arrière-plan. Une conception plus utile consiste à appeler la méthode beginBackgroundTaskWithName: expirationHandler: ou beginBackgroundTaskWithExpirationHandler: avant de démarrer une tâche et à appeler la méthode endBackgroundTask: dès que vous avez terminé. Vous pouvez même suivre ce modèle pendant que votre application s’exécute au premier plan.

Le Listing 3-1 montre comment démarrer une tâche longue lorsque votre application passe en arrière-plan. Dans cet exemple, la demande de démarrage d’une tâche en arrière-plan inclut un gestionnaire d’expiration au cas où la tâche prendrait trop de temps. La tâche elle-même est ensuite soumise à une file d’attribution pour une exécution asynchrone afin que la méthode applicationDidEnterBackground: puisse être retournée normalement. L’utilisation de blocs simplifie le code nécessaire pour conserver des références à des variables importantes, telles que l’identificateur de tâche en arrière-plan. La variable bgTask est une variable membre de la classe qui stocke un pointeur sur l’identificateur de tâche en arrière-plan actuel et est initialisée avant son utilisation dans cette méthode.

Listing 3-1 Démarrer une tâche en arrière-plan au moment de quitter

func applicationDidEnterBackground(_ application: UIApplication) {

    bgTask = application.beginBackgroundTask(withName: « MyTask », expirationHandler: {

        // Clean up any unfinished task business by marking where you

        // stopped or ending the task outright.

        application.endBackgroundTask(bgTask)

        bgTask = UIBackgroundTaskIdentifier.invalid

    })

    

    // Start the long-running task and return immediately.

    DispatchQueue.global(qos: .default).async(execute: {

        

        // Do the work associated with the task, preferably in chunks.

        

        application.endBackgroundTask(bgTask)

        bgTask = UIBackgroundTaskIdentifier.invalid

    })

}

Remarque: indiquez toujours un gestionnaire d’expiration lors du démarrage d’une tâche. Toutefois, si vous souhaitez savoir combien de temps il reste à votre application pour s’exécuter, obtenez la valeur de la propriété backgroundTimeRemaining de UIApplication.

Dans vos propres gestionnaires d’expiration, vous pouvez inclure le code supplémentaire nécessaire pour clôturer votre tâche. Toutefois, l’exécution du code que vous incluez ne doit pas prendre trop de temps car, au moment où votre gestionnaire d’expiration est appelé, votre application est déjà très proche de sa limite de temps. Pour cette raison, n’effectuez qu’un nettoyage minimal de vos informations d’état et terminez la tâche.

Télécharger du contenu en arrière-plan

Lors du téléchargement de fichiers, les applications doivent utiliser un objet NSURLSession pour démarrer les téléchargements, de sorte que le système puisse prendre le contrôle du processus de téléchargement en cas de suspension ou de fin de l’application. Lorsque vous configurez un objet NSURLSession pour les transferts en arrière-plan, le système gère ces transferts dans un processus séparé et rend compte de l’état à votre application de la manière habituelle. Si votre application est arrêtée alors que les transferts sont en cours, le système poursuit les transferts en arrière-plan et lance votre application (le cas échéant) à la fin des transferts ou lorsqu’une ou plusieurs tâches nécessitent l’attention de votre application.

Pour prendre en charge les transferts en arrière-plan, vous devez configurer votre objet NSURLSession de manière appropriée. Pour configurer la session, vous devez d’abord créer un objet NSURLSessionConfiguration et définir plusieurs propriétés sur des valeurs appropriées. Vous transmettez ensuite cet objet de configuration à la méthode d’initialisation appropriée de NSURLSession lors de la création de votre session.

Le processus de création d’un objet de configuration prenant en charge les téléchargements en arrière-plan est le suivant:

  • Si votre application commence les transferts alors qu’elle est au premier plan, il est recommandé de définir également la propriété discrétionnaire de l’objet de configuration sur YES.
  • Configurez les autres propriétés de l’objet de configuration selon vos besoins. Utilisez l’objet de configuration pour créer votre objet NSURLSession.

Une fois configuré, votre objet NSURLSession transfère de manière transparente les tâches de téléchargement vers le système aux moments appropriés.

  • Si les tâches se terminent alors que votre application est toujours en cours d’exécution (au premier plan ou en arrière-plan), l’objet de session avertit son délégué de la manière habituelle.
  • Si les tâches ne sont pas encore terminées et que le système met fin à votre application, le système continue automatiquement à gérer les tâches en arrière-plan.
  • Si l’utilisateur met fin à votre application, le système annule les tâches en attente.

Lorsque toutes les tâches associées à une session en arrière-plan sont terminées, le système relance une application terminée (en supposant que la propriété sessionSendsLaunchEvents était définie sur YES et que l’utilisateur n’avait pas forcé la fermeture de l’application) et appelait l’application du délégué de l’application: handleEventsForBackgroundURLSession: completionHandler : méthode. (Le système peut également relancer l’application pour gérer les problèmes d’authentification ou d’autres événements liés aux tâches qui requièrent l’attention de votre application). Dans votre implémentation de cette méthode de délégation, utilisez l’identificateur fourni pour créer un nouvel objet NSURLSessionConfiguration et NSURLSession avec la même configuration qu’avant. Le système reconnecte votre nouvel objet de session aux tâches précédentes et en indique l’état au délégué de l’objet de session.

Mise en œuvre de tâches de longue durée

Pour les tâches nécessitant plus de temps d’exécution, vous devez demander des autorisations spécifiques pour les exécuter en arrière-plan sans les suspendre. Sous iOS, seuls des types d’application spécifiques sont autorisés à s’exécuter en arrière-plan:

  • Applications qui lisent du contenu audible à l’utilisateur en arrière-plan, telle qu’une application de lecteur de musique
  • Applications qui enregistrent du contenu audio en arrière-plan
  • Applications qui tiennent les utilisateurs informés de leur position à tout moment, telle qu’une application de navigation
  • Applications prenant en charge le protocole de voix sur IP (VoIP)
  • Applications nécessitant de télécharger et de traiter régulièrement du nouveau contenu
  • Applications recevant des mises à jour régulières d’accessoires externes

Les applications qui implémentent ces services doivent déclarer les services qu’elles prennent en charge et utiliser les infrastructures système pour implémenter les aspects pertinents de ces services. La déclaration des services permet au système de savoir quels services vous utilisez, mais dans certains cas, ce sont les infrastructures système qui empêchent réellement votre application d’être suspendue.

Déclaration des tâches d’arrière-plan prises en charge par votre application

La prise en charge de certains types d’exécution en arrière-plan doit être déclarée à l’avance par l’application qui les utilise. Dans Xcode 5 et versions ultérieures, vous déclarez les modes d’arrière-plan que votre application prend en charge à partir de l’onglet Capacités des paramètres de votre projet. L’activation de l’option Modes d’arrière-plan ajoute la clé UIBackgroundModes au fichier Info.plist de votre application. La sélection d’une ou plusieurs cases à cocher ajoute les valeurs de mode d’arrière-plan correspondantes à cette clé. Le tableau 3-1 répertorie les modes d’arrière-plan que vous pouvez spécifier et les valeurs attribuées par Xcode à la clé UIBackgroundModes dans le fichier Info.plist de votre application.

Tableau 3-1 Modes d’arrière-plan pour les applications

Xcode background mode UIBackgroundModes value Description
Audio and AirPlay audio

L’application lit le contenu audible pour l’utilisateur ou enregistre l’audio en arrière-plan. (Ce contenu inclut la diffusion de contenu audio ou vidéo en utilisant AirPlay.) L’utilisateur doit autoriser les applications à utiliser le microphone avant la première utilisation. Pour plus d’informations, voir Supporting User Privacy.

Location updates location

L’application permet aux utilisateurs de rester informés de leur emplacement, même en cours d’exécution en arrière-plan.

Voice over IP voip

L’application offre à l’utilisateur la possibilité de passer des appels téléphoniques via une connexion Internet.

Newsstand downloads newsstand-content

L’application offre à l’utilisateur la possibilité de passer des appels téléphoniques via une connexion Internet.

External accessory communication external-accessory L’application fonctionne avec un accessoire matériel qui doit fournir des mises à jour régulièrement à travers le cadre d’accessoires externes.
Uses Bluetooth LE accessories bluetooth-central

L’application fonctionne avec un accessoire Bluetooth qui doit fournir des mises à jour régulièrement à travers le cadre Bluetooth central.

Acts as a Bluetooth LE accessory bluetooth-peripheral

L’application prend en charge la communication Bluetooth en mode périphérique via le framework Bluetooth principal. L’utilisation de ce mode nécessite l’autorisation de l’utilisateur. pour plus d’informations, voir Supporting User Privacy.

Background fetch fetch

L’application télécharge et traite régulièrement de petites quantités de contenu du réseau.

Remote notifications remote-notification

L’application souhaite commencer à télécharger du contenu lorsqu’une notification push arrive. Utilisez cette notification pour réduire le délai d’affichage du contenu lié à la notification push.

Chacun des modes précédents indique au système que votre application doit être réveillée ou lancée aux moments appropriés pour répondre aux événements pertinents. Par exemple, une application qui commence à lire de la musique puis se déplace vers l’arrière-plan a toujours besoin de temps d’exécution pour remplir les tampons de sortie audio. L’activation du mode audio indique aux structures système qu’elles doivent continuer à effectuer les rappels nécessaires vers l’application à des intervalles appropriés. Si l’application ne sélectionne pas ce mode, tout son en cours de lecture ou d’enregistrement par l’application s’arrête lorsque l’application passe en arrière-plan.

Suivi de la position de l’utilisateur

Il existe plusieurs façons de suivre l’emplacement de l’utilisateur en arrière-plan, dont la plupart n’exigent pas que votre application s’exécute en permanence en arrière-plan:

  • Le service de localisation des modifications importantes (recommandé)
  • Services de localisation exclusifs
  • Services de localisation en arrière-plan

Le service de localisation à changements significatifs est vivement recommandé pour les applications ne nécessitant pas de données de localisation haute précision. Avec ce service, les mises à jour d’emplacement ne sont générées que lorsque l’emplacement de l’utilisateur change de manière significative. ainsi, il est idéal pour les applications sociales ou les applications qui fournissent à l’utilisateur des informations non critiques et pertinentes pour la localisation. Si l’application est suspendue lorsqu’une mise à jour est effectuée, le système la réveille en arrière-plan pour gérer la mise à jour. Si l’application démarre ce service et est ensuite terminée, le système relance automatiquement l’application lorsqu’un nouvel emplacement devient disponible. Ce service est disponible dans iOS 4 et versions ultérieures et uniquement sur les appareils contenant une radio cellulaire.

Les services de localisation de premier plan et d’arrière-plan utilisent tous deux le service Core Location d’emplacement standard pour extraire des données de localisation. La seule différence est que les services de localisation de premier plan uniquement arrêtent de fournir des mises à jour si l’application est suspendue, ce qui est susceptible de se produire si l’application ne prend pas en charge d’autres services ou tâches en arrière-plan. Les services de localisation exclusifs sont destinés aux applications nécessitant uniquement des données de localisation lorsqu’elles sont au premier plan.

Vous activez la prise en charge de l’emplacement à partir de la section Modes d’arrière-plan de l’onglet Capacités de votre projet Xcode. (Vous pouvez également activer cette prise en charge en incluant la clé UIBackgroundModes avec la valeur d’emplacement dans le fichier Info.plist de votre application.) L’activation de ce mode n’empêche pas le système de suspendre l’application, mais indique au système de réveiller le système. app chaque fois qu’il y a de nouvelles données d’emplacement à livrer. Ainsi, cette clé permet effectivement à l’application de s’exécuter en arrière-plan pour traiter les mises à jour d’emplacement chaque fois qu’elles se produisent.

Important: vous êtes encouragé à utiliser les services standard avec parcimonie ou à utiliser plutôt le service de changement de localisation significatif. Les services de localisation nécessitent l’utilisation active du matériel radio embarqué d’un périphérique iOS. L’exécution de ce matériel en continu peut consommer une quantité importante d’énergie. Si votre application n’a pas besoin de fournir des informations de localisation précises et continues à l’utilisateur, il est préférable de minimiser l’utilisation des services de localisation.

Pour plus d’informations sur l’utilisation de chacun des différents services de localisation de votre application, voir Guide de programmation des sites et des cartes.

Jouer et enregistrer du son en arrière-plan

Une application qui lit ou enregistre de l’audio en continu (même si l’application est exécutée en arrière-plan) peut s’inscrire pour effectuer ces tâches en arrière-plan. Vous activez la prise en charge audio à partir de la section Modes d’arrière-plan de l’onglet Capacités de votre projet Xcode. (Vous pouvez également activer cette prise en charge en incluant la clé UIBackgroundModes avec la valeur audio dans le fichier Info.plist de votre application.) Les applications lisant du contenu audio en arrière-plan doivent lire du contenu audible et non le silence.

Voici des exemples typiques d’applications audio en arrière-plan:

  • Applications de lecteur de musique
  • Applications d’enregistrement audio
  • Applications prenant en charge la lecture audio ou vidéo via AirPlay
  • Applications VoIP

Lorsque la clé UIBackgroundModes contient la valeur audio, les infrastructures multimédia du système empêchent automatiquement l’application correspondante d’être suspendue lorsqu’elle passe en arrière-plan. Tant qu’elle lit un contenu audio ou vidéo ou enregistre un contenu audio, l’application continue de s’exécuter en arrière-plan. Cependant, si l’enregistrement ou la lecture s’arrête, le système suspend l’application.

Vous pouvez utiliser n’importe quel framework audio système pour travailler avec du contenu audio en arrière-plan, et le processus d’utilisation de ces frameworks reste inchangé. (Pour la lecture de vidéos via AirPlay, vous pouvez utiliser votre infrastructure Media Player ou AV Foundation pour la présenter.) Comme votre application n’est pas suspendue lors de la lecture de fichiers multimédias, les rappels fonctionnent normalement lorsque votre application est en arrière-plan. Toutefois, dans vos rappels, vous ne devez effectuer que le travail nécessaire pour fournir des données à la lecture. Par exemple, une application de diffusion audio en continu aurait besoin de télécharger les données de flux de musique de son serveur et d’extraire les échantillons audio actuels pour la lecture. Les applications ne doivent pas effectuer de tâches superflues non liées à la lecture.

Étant donné que plusieurs applications peuvent prendre en charge l’audio, le système détermine quelle application est autorisée à lire ou à enregistrer de l’audio à un moment donné. L’application de premier plan est toujours prioritaire pour les opérations audio. Il est possible que plusieurs applications en arrière-plan soient autorisées à lire de l’audio. De telles déterminations sont basées sur la configuration des objets de session audio de chaque application. Vous devez toujours configurer de manière appropriée l’objet de session audio de votre application et travailler soigneusement avec les infrastructures système pour gérer les interruptions et d’autres types de notifications liées à l’audio. Pour plus d’informations sur la configuration des objets de session audio pour l’exécution en arrière-plan, reportez-vous au Guide de programmation de session audio.

Mise en œuvre d’une application VoIP

Une application VoIP (Voice over Internet Protocol) permet à l’utilisateur de passer des appels téléphoniques en utilisant une connexion Internet au lieu du service cellulaire de l’appareil. Une telle application doit maintenir une connexion réseau persistante à son service associé afin de pouvoir recevoir les appels entrants et d’autres données pertinentes. Plutôt que de laisser les applications VoIP en veille tout le temps, le système leur permet d’être suspendues et offre la possibilité de surveiller leurs sockets. Lorsque le trafic entrant est détecté, le système réveille l’application VoIP et lui redonne le contrôle de ses sockets.

Pour configurer une application VoIP, vous devez procéder comme suit:

  • Activez la prise en charge de la voix sur IP à partir de la section Modes d’arrière-plan de l’onglet Fonctions de votre projet Xcode. (Vous pouvez également activer cette prise en charge en incluant la clé UIBackgroundModes avec la valeur voip dans le fichier Info.plist de votre application.)
  • Configurez l’un des sockets de l’application pour l’utilisation de la VoIP.
  • Avant de passer en arrière-plan, appelez la méthode setKeepAliveTimeout: handler: pour installer un gestionnaire à exécuter périodiquement. Votre application peut utiliser ce gestionnaire pour maintenir sa connexion de service.
  • Configurez votre session audio pour gérer les transitions vers et depuis une utilisation active.

L’inclusion de la valeur voip dans la clé UIBackgroundModes indique au système qu’elle doit permettre à l’application de s’exécuter en arrière-plan, selon les besoins, pour gérer ses sockets réseau. Une application avec cette clé est également relancée en arrière-plan immédiatement après le démarrage du système pour garantir que les services VoIP sont toujours disponibles. La plupart des applications VoIP doivent également être configurées en tant qu’applications audio en arrière-plan pour diffuser l’audio en arrière-plan. Par conséquent, vous devez inclure les valeurs audio et voip dans la clé UIBackgroundModes. Si vous ne le faites pas, votre application ne pourra ni lire ni enregistrer de l’audio tant qu’elle est en arrière-plan. Pour plus d’informations sur la clé UIBackgroundModes, consultez Référence de la clé de liste de propriétés d’informations. Pour plus d’informations sur les étapes à suivre pour mettre en œuvre une application VoIP, voir Conseils pour le développement d’une application VoIP.

Récupérer de petites quantités de contenu de manière opportuniste

Les applications qui doivent vérifier périodiquement le nouveau contenu peuvent demander au système de les réactiver afin qu’elles puissent lancer une opération d’extraction pour ce contenu. Pour prendre en charge ce mode, activez l’option Extraction en arrière-plan dans la section Modes en arrière-plan de l’onglet Capacités de votre projet Xcode. (Vous pouvez également activer cette prise en charge en incluant la clé UIBackgroundModes avec la valeur fetch dans le fichier Info.plist de votre application.) L’activation de ce mode ne garantit pas que le système donnera à votre application le temps d’effectuer des extractions en arrière-plan. Le système doit équilibrer le besoin de votre application de récupérer du contenu avec les besoins d’autres applications et du système lui-même. Après avoir évalué ces informations, le système laisse le temps aux applications lorsqu’il existe de bonnes occasions de le faire.

Lorsqu’une bonne opportunité se présente, le système réveille ou lance votre application en arrière-plan et appelle la méthode de délégation de l’application: performFetchWithCompletionHandler. Utilisez cette méthode pour rechercher un nouveau contenu et lancer une opération de téléchargement si le contenu est disponible. Dès que vous avez terminé de télécharger le nouveau contenu, vous devez exécuter le bloc de gestionnaire d’achèvement fourni, en transmettant un résultat indiquant si le contenu était disponible. L’exécution de ce bloc indique au système qu’il peut ramener votre application à l’état suspendu et évaluer son utilisation. Les applications qui téléchargent rapidement de petites quantités de contenu et reflètent avec précision le moment où elles ont pu être téléchargées sont plus susceptibles de recevoir une heure d’exécution future que les applications dont le téléchargement nécessite du temps ou dont le contenu de revendication était disponible ne téléchargez rien.

Lors du téléchargement de tout contenu, il est recommandé d’utiliser la classe NSURLSession pour lancer et gérer vos téléchargements. Pour plus d’informations sur l’utilisation de cette classe pour gérer les tâches de téléchargement, consultez le Guide de programmation du système de chargement d’URL.


Utilisation de notifications push pour lancer un téléchargement

Si votre serveur envoie des notifications push à l’appareil d’un utilisateur lorsqu’un nouveau contenu est disponible pour votre application, vous pouvez demander au système de l’exécuter en arrière-plan afin de pouvoir commencer à télécharger le nouveau contenu immédiatement. Le but de ce mode d’arrière-plan est de minimiser le temps qui s’écoule entre le moment où un utilisateur voit une notification push et le moment où votre application est capable d’afficher le contenu associé. Les applications sont généralement réveillées à peu près au même moment où l’utilisateur voit la notification, mais cela vous laisse tout de même plus de temps que vous n’auriez pu le faire autrement.

Pour prendre en charge ce mode d’arrière-plan, activez l’option Notifications à distance dans la section Modes d’arrière-plan de l’onglet Capacités de votre projet Xcode. (Vous pouvez également activer cette prise en charge en incluant la clé UIBackgroundModes avec la valeur de notification à distance dans le fichier Info.plist de votre application.)

Pour qu’une notification push déclenche une opération de téléchargement, la charge utile de la notification doit inclure la clé content-available avec la valeur 1. Lorsque cette clé est présente, le système réveille l’application en arrière-plan (ou la lance en arrière-plan) et appelle l’application du délégué de l’application: didReceiveRemoteNotification: fetchCompletionHandler: method. Votre implémentation de cette méthode doit télécharger le contenu pertinent et l’intégrer à votre application.

Lors du téléchargement de tout contenu, il est recommandé d’utiliser la classe NSURLSession pour lancer et gérer vos téléchargements. Pour plus d’informations sur l’utilisation de cette classe pour gérer les tâches de téléchargement, consultez le Guide de programmation du système de chargement d’URL.

Téléchargement du contenu du kiosque à journaux en arrière-plan

Une application de kiosque à journaux téléchargeant de nouveaux numéros de magazines ou de journaux peut s’inscrire pour effectuer ces téléchargements en arrière-plan. Vous activez la prise en charge des téléchargements en kiosque à partir de la section Modes d’arrière-plan de l’onglet Capacités de votre projet Xcode. (Vous pouvez également activer cette prise en charge en incluant la clé UIBackgroundModes avec la valeur de contenu de kiosque dans le fichier Info.plist de votre application.) Lorsque cette clé est présente, le système lance votre application, si elle n’est pas déjà en cours, afin qu’elle puisse lancer le téléchargement du nouveau numéro.

Lorsque vous utilisez la structure du kit de support pour lancer un téléchargement, le système gère le processus de téléchargement de votre application. Le système continue de télécharger le fichier même si votre application est suspendue ou terminée. Une fois l’opération de téléchargement terminée, le système transfère le fichier dans le sandbox de votre application et en informe votre application. Si l’application n’est pas en cours d’exécution, cette notification la réveille et lui permet de traiter le fichier récemment téléchargé. S’il y a des erreurs pendant le processus de téléchargement, votre application est également réveillée pour les gérer.

Pour plus d’informations sur la procédure de téléchargement de contenu à l’aide de la structure du kit de publication, consultez Référence du cadre du kit de publication.

 

Communication avec un accessoire externe

Les applications qui fonctionnent avec des accessoires externes peuvent demander à être réveillé si l’accessoire fournit une mise à jour lorsque l’application est suspendue. Cette assistance est importante pour certains types d’accessoires fournissant des données à intervalles réguliers, tels que les moniteurs de fréquence cardiaque. Vous activez la prise en charge de la communication d’accessoire externe à partir de la section Modes d’arrière-plan de l’onglet Capacités de votre projet Xcode. (Vous pouvez également activer cette prise en charge en incluant la clé UIBackgroundModes avec la valeur d’accessoire externe dans le fichier Info.plist de votre application.) Lorsque vous activez ce mode, l’infrastructure d’accessoires externe ne ferme pas les sessions actives avec des accessoires. (Sous iOS 4 et les versions antérieures, ces sessions sont automatiquement fermées lorsque l’application est suspendue.) Lorsque de nouvelles données arrivent de l’accessoire, le framework réveille votre application afin qu’elle puisse traiter ces données. Le système réveille également l’application pour traiter les notifications de connexion et de déconnexion d’accessoire.

Toute application prenant en charge le traitement en arrière-plan des mises à jour d’accessoires doit suivre quelques consignes de base:

  • Les applications doivent fournir une interface permettant à l’utilisateur de démarrer et d’arrêter la livraison des événements de mise à jour des accessoires. Cette interface doit ensuite ouvrir ou fermer la session accessoire, le cas échéant.
  • Après avoir été réveillé, l’application dispose d’environ 10 secondes pour traiter les données. Idéalement, il devrait traiter les données aussi rapidement que possible et se permettre d’être à nouveau suspendu. Toutefois, si plus de temps est nécessaire, l’application peut utiliser la méthode beginBackgroundTaskWithExpirationHandler: pour demander un délai supplémentaire. il ne devrait le faire que lorsque cela est absolument nécessaire.

Obtenir l’attention de l’utilisateur en arrière-plan

Les notifications sont un moyen pour une application suspendue, en arrière-plan ou non exécutée d’attirer l’attention de l’utilisateur. Les applications peuvent utiliser les notifications locales pour afficher des alertes, émettre des sons, attribuer un badge à l’icône de l’application ou une combinaison des trois. Par exemple, une application de réveil peut utiliser les notifications locales pour émettre un son d’alarme et afficher une alerte pour désactiver l’alarme. Lorsqu’une notification est transmise à l’utilisateur, celui-ci doit décider si les informations lui permettent de ramener l’application au premier plan. (Si l’application est déjà en cours d’exécution au premier plan, les notifications locales sont transmises silencieusement à l’application et non à l’utilisateur.)

Pour planifier l’envoi d’une notification locale, créez une instance de la classe UILocalNotification, configurez les paramètres de notification et programmez-la à l’aide des méthodes de la classe UIApplication. L’objet de notification local contient des informations sur le type de notification à remettre (son, alerte ou badge) et l’heure (le cas échéant) à laquelle elle doit être livrée. Les méthodes de la classe UIApplication fournissent des options permettant d’envoyer des notifications immédiatement ou à l’heure programmée.

Le Listing 3-2 montre un exemple qui planifie une alarme unique en utilisant une date et une heure définies par l’utilisateur. Cet exemple configure une seule alarme à la fois et annule la précédente avant de programmer une nouvelle. (Vos propres applications ne peuvent pas avoir plus de 128 notifications locales actives à la fois, chacune d’elles pouvant être configurée pour se répéter à un intervalle spécifié.) L’alarme elle-même consiste en une boîte d’alerte et un fichier audio qui est joué si l’application ne fonctionne pas ou est en arrière-plan lorsque l’alarme se déclenche. Si l’application est active et s’exécute donc au premier plan, l’application de la méthode suivante: application:didReceiveLocalNotification: du délégué de l’application est appelée.

Listing 3-2 Planifier une notification d’alarme

func applicationDidEnterBackground(_ application: UIApplication) {

    bgTask = application.beginBackgroundTask(withName: « MyTask », expirationHandler: {

        // Clean up any unfinished task business by marking where you

        // stopped or ending the task outright.

        application.endBackgroundTask(bgTask)

        bgTask = UIBackgroundTaskIdentifier.invalid

    })

    

    // Start the long-running task and return immediately.

    DispatchQueue.global(qos: .default).async(execute: {

        

        // Do the work associated with the task, preferably in chunks.

        

        application.endBackgroundTask(bgTask)

        bgTask = UIBackgroundTaskIdentifier.invalid

    })

}

 

Les fichiers audio utilisés avec les notifications locales ont les mêmes exigences que ceux utilisés pour les notifications push. Les fichiers son personnalisés doivent être situés dans le bundle principal de votre application et prendre en charge l’un des formats suivants: PCM linéaire, MA4, µ-Law ou a-Law. Vous pouvez également spécifier la constante UILocalNotificationDefaultSoundName pour lire le son d’alerte par défaut du périphérique. Lorsque la notification est envoyée et que le son est joué, le système déclenche également une vibration sur les périphériques qui la prennent en charge.

Vous pouvez annuler les notifications programmées ou obtenir une liste de notifications à l’aide des méthodes de la classe UIApplication. Pour plus d’informations sur ces méthodes, consultez Référence de la classe UIApplication. Pour plus d’informations sur la configuration des notifications locales, voir Guide de programmation des notifications locales et distantes.

 

Comprendre quand votre application est lancée en arrière-plan

Les applications prenant en charge l’exécution en arrière-plan peuvent être relancées par le système pour gérer les événements entrants. Si une application est fermée pour une raison autre que celle que l’utilisateur a forcée à quitter, le système lance l’application lorsque l’un des événements suivants se produit:

  • Pour les applications de localisation:
    • Le système reçoit une mise à jour de l’emplacement qui répond aux critères de livraison définis par l’application.
    • Le périphérique est entré ou sorti d’une région enregistrée. (Les régions peuvent être des régions géographiques ou des régions iBeacon.)
  • Pour les applications audio, l’infrastructure audio nécessite que l’application traite certaines données. (Les applications audio incluent celles qui lisent de l’audio ou utilisent le microphone.)
  • Pour les applications Bluetooth:
    • Une application jouant le rôle central reçoit les données d’un périphérique connecté.
    • Une application jouant le rôle de périphérique reçoit les commandes d’un central connecté.
  • Pour les applications de téléchargement en arrière-plan:
    • Une notification push arrive pour une application et la charge utile de la notification contient la clé content-available avec la valeur 1.
    • Le système réveille l’application à des moments opportuns pour commencer à télécharger du nouveau contenu.
    • Pour les applications téléchargeant du contenu en arrière-plan à l’aide de la classe NSURLSession, toutes les tâches associées à cet objet de session ont été terminées avec succès ou ont reçu une erreur.
    • Un téléchargement lancé par une application de kiosque à journaux se termine.

Dans la plupart des cas, le système ne relance pas les applications après leur fermeture forcée par l’utilisateur. Les applications de localisation constituent une exception. Elles sont relancées dans iOS 8 et versions ultérieures après avoir été forcées à quitter par l’utilisateur. Dans d’autres cas, l’utilisateur doit lancer l’application explicitement ou redémarrer l’appareil avant que l’application ne puisse être lancée automatiquement en arrière-plan par le système. Lorsque la protection par mot de passe est activée sur le périphérique, le système ne lance pas d’application en arrière-plan avant le premier déverrouillage du périphérique par l’utilisateur.


Être une application de fond responsable

L’application de premier plan a toujours la priorité sur les applications d’arrière-plan en ce qui concerne l’utilisation des ressources système et du matériel. Les applications exécutées en arrière-plan doivent être préparées à cette différence et ajuster leur comportement lorsqu’elles s’exécutent en arrière-plan. En particulier, les applications qui passent à l’arrière-plan doivent suivre les instructions suivantes:

  • Ne passez aucun appel OpenGL ES à partir de votre code. Vous ne devez pas créer d’objet EAGLContext ni émettre de commande de dessin OpenGL ES d’aucune sorte lors de l’exécution en arrière-plan. L’utilisation de ces appels entraîne la mort immédiate de votre application. Les applications doivent également s’assurer que toutes les commandes soumises précédemment sont terminées avant de passer en arrière-plan. Pour plus d’informations sur la gestion d’OpenGL ES lors du passage à l’arrière-plan, voir Implémentation d’une application OpenGL ES multitâche dans le Guide de programmation OpenGL ES.
  • Annulez tous les services liés à Bonjour avant d’être suspendu. Lorsque votre application passe en arrière-plan, et avant d’être suspendue, elle doit se désinscrire de Bonjour et fermer les sockets d’écoute associés à tous les services réseau. Une application suspendue ne peut de toute façon pas répondre aux demandes de service entrantes. La fermeture de ces services les empêche de paraître disponibles alors qu’ils ne le sont pas. Si vous ne fermez pas les services Bonjour vous-même, le système ferme automatiquement ces services lorsque votre application est suspendue.
  • Soyez prêt à gérer les échecs de connexion dans vos sockets réseau. Le système peut rompre les connexions de socket lorsque votre application est suspendue pour un certain nombre de raisons. Tant que votre code basé sur le socket est préparé à d’autres types de défaillances réseau, telles qu’une perte de signal ou une transition de réseau, cela ne doit pas entraîner de problèmes inhabituels. Lorsque votre application reprend, si elle rencontre un échec lors de l’utilisation d’un socket, rétablissez simplement la connexion.
  • Enregistrez l’état de votre application avant de passer à l’arrière-plan. Lorsque la mémoire est insuffisante, les applications en arrière-plan peuvent être purgées de la mémoire pour libérer de l’espace. Les applications suspendues sont d’abord purgées, et aucun préavis n’est donné à l’application avant qu’elle ne soit purgée. Par conséquent, les applications doivent tirer parti du mécanisme de préservation de l’état dans iOS 6 et versions ultérieures pour enregistrer leur état d’interface sur le disque. Pour plus d’informations sur la prise en charge de cette fonctionnalité, reportez-vous à la section Préservation de l’apparence visuelle de votre application au fil des lancements.
  • Supprimez les références fortes aux objets inutiles lors du déplacement en arrière-plan. Si votre application conserve un cache d’objets en mémoire (notamment des images) volumineux, supprimez toutes les références fortes à ces caches lors du déplacement en arrière-plan. Pour plus d’informations, voir Réduire votre empreinte mémoire.
  • Arrêtez d’utiliser les ressources système partagées avant d’être suspendu. Les applications qui interagissent avec des ressources système partagées telles que les bases de données de carnet d’adresses ou de calendriers doivent cesser d’utiliser ces ressources avant d’être suspendues. La priorité pour de telles ressources va toujours à l’application de premier plan. Lorsque votre application est suspendue, si elle découvre qu’elle utilise une ressource partagée, l’application est supprimée.
  • Évitez de mettre à jour vos fenêtres et vos vues. Les fenêtres et les vues de votre application n’étant pas visibles lorsque celle-ci est en arrière-plan, évitez de les mettre à jour. L’exception est dans les cas où vous devez mettre à jour le contenu d’une fenêtre avant de prendre un instantané de votre application.
  • Répondez pour vous connecter et déconnecter les notifications pour les accessoires externes. Pour les applications qui communiquent avec des accessoires externes, le système envoie automatiquement une notification de déconnexion lorsque l’application passe en arrière-plan. L’application doit s’inscrire pour cette notification et l’utiliser pour fermer la session d’accessoires en cours. Lorsque l’application revient au premier plan, une notification de connexion correspondante est envoyée, ce qui permet à l’application de se reconnecter. Pour plus d’informations sur la gestion des notifications de connexion et de déconnexion d’accessoire, voir Rubriques sur la programmation d’accessoires externes.
  • Nettoyez les ressources pour les alertes actives lors du déplacement en arrière-plan. Afin de préserver le contexte lors du basculement entre les applications, le système ne rejette pas automatiquement les feuilles d’action (UIActionSheet) ou les vues d’alerte (UIAlertView) lorsque votre application passe en arrière-plan. Il vous appartient de définir le comportement de nettoyage approprié avant de passer à l’arrière-plan. Par exemple, vous pouvez souhaiter annuler la vue d’action ou la vue d’alerte par programme ou enregistrer suffisamment d’informations contextuelles pour restaurer la vue ultérieurement (dans les cas où votre application est fermée).
  • Supprimez les informations sensibles des vues avant de passer à l’arrière-plan. Lorsqu’une application passe en arrière-plan, le système prend un instantané de la fenêtre principale de l’application, qu’il présente ensuite brièvement lors de la transition de votre application au premier plan. Avant de revenir de votre méthode applicationDidEnterBackground:, vous devez masquer ou masquer les mots de passe et autres informations personnelles sensibles susceptibles d’être capturées dans le cadre de l’instantané.
  • Effectuer un travail minimal lors de l’exécution en arrière-plan. Le temps d’exécution accordé aux applications en arrière-plan est plus limité que le temps imparti à l’application au premier plan. Les applications qui passent trop de temps à s’exécuter en arrière-plan peuvent être limitées par le système ou arrêtées.

Si vous implémentez une application audio en arrière-plan ou tout autre type d’application pouvant s’exécuter en arrière-plan, votre application répond aux messages entrants de la manière habituelle. En d’autres termes, le système peut notifier à votre application des avertissements de mémoire insuffisante lorsqu’ils se produisent. Et dans les cas où le système doit fermer des applications pour libérer encore plus de mémoire, l’appel appelle la méthode applicationWillTerminate: de son délégué pour effectuer les tâches finales avant de quitter.

Désactivation de l’exécution en arrière-plan

Si vous ne souhaitez pas que votre application soit exécutée en arrière-plan, vous pouvez explicitement désactiver cette dernière en ajoutant la clé UIApplicationExitsOnSuspend (avec la valeur YES) au fichier Info.plist de votre application. Lorsqu’une application se désiste, elle bascule entre les états inactif, inactif et inactif et ne passe jamais en arrière-plan ou en état suspendu. Lorsque l’utilisateur appuie sur le bouton Accueil pour quitter l’application, la méthode applicationWillTerminate: du délégué de l’application est appelée et l’application a environ 5 secondes pour nettoyer et quitter avant de se terminer et de revenir à l’état inactif.

Le fait de ne pas utiliser l’exécution en arrière-plan est fortement déconseillé, mais il peut être préférable dans certaines conditions. Plus précisément, si le codage pour l’exécution en arrière-plan ajoute une complexité significative à votre application, il peut être plus simple de mettre fin à l’application. En outre, si votre application consomme une grande quantité de mémoire et ne peut en libérer aucune, le système peut la tuer rapidement, de toute façon, pour laisser de la place à d’autres applications. Ainsi, opter pour la fin, au lieu de passer à l’arrière-plan, pourrait produire les mêmes résultats et vous faire gagner du temps et des efforts de développement.

Pour plus d’informations sur les clés que vous pouvez inclure dans le fichier Info.plist de votre application, voir Référence des clés de la liste de propriétés d’informations.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.