Partager via


Mise à jour d’une application Xamarin.iOS en arrière-plan

L’actualisation en arrière-plan est le processus consistant à réveiller une application qui est suspendue ou qui n’est pas en cours d’exécution et à la mettre à jour avec un nouveau contenu. iOS fournit trois options pour actualiser le contenu en arrière-plan :

  1. Service Analyse des régions et changements d’emplacement significatifs : les API prenant en charge la localisation déclenchent des mises à jour en arrière-plan en fonction des modifications apportées à l’emplacement de l’utilisateur. Ces API peuvent être utilisées à la discrétion pour actualiser le contenu dans les applications iOS 6 non basées sur l’emplacement, où d’autres options ne sont pas disponibles.
  2. Récupération en arrière-plan (iOS 7+) : approche temporelle de l’actualisation du contenu non critique qui se met à jour fréquemment .
  3. Notifications à distance (iOS 7+) : les applications qui reçoivent des notifications Push peuvent utiliser les notifications pour déclencher des actualisations de contenu en arrière-plan. Cette méthode peut être utilisée pour mettre à jour avec du contenu important et respectant le temps qui se met à jour de manière sporadique .

Les sections suivantes couvrent les principes de base de ces options.

Surveillance des régions et changements importants d’emplacement

iOS fournit deux API prenant en charge l’emplacement avec des fonctionnalités d’arrière-plan :

  1. La surveillance des régions consiste à configurer des régions avec des limites et à réveiller l’appareil lorsque l’utilisateur entre ou sort d’une région. Les régions sont circulaires et peuvent être de taille variable. Lorsque l’utilisateur franchit une limite de région, l’appareil se réveille pour gérer l’événement, généralement en lançant une notification ou en lançant une tâche. La surveillance régionale nécessite le GPS et augmente l’utilisation de la batterie et des données.
  2. Le service de modifications de localisation significatives est une option plus simple et économe en énergie disponible pour les appareils dotés de radios cellulaires. Une application à l’écoute des modifications importantes de l’emplacement est avertie lorsque l’appareil bascule des tours de cellule. Ce service peut être utilisé pour réveiller une application suspendue ou arrêtée, et offre la possibilité de case activée pour le nouveau contenu en arrière-plan. L’activité en arrière-plan est limitée à environ 10 secondes, sauf si elle est associée à une tâche en arrière-plan .

Une application n’a pas besoin de l’emplacement UIBackgroundMode pour utiliser ces API prenant en charge l’emplacement. Étant donné qu’iOS ne suit pas les types de tâches qui peuvent s’exécuter lorsque l’appareil est réveillé par les modifications apportées à l’emplacement de l’utilisateur, ces API permettent de contourner la mise à jour du contenu en arrière-plan sur iOS 6. N’oubliez pas que le déclenchement de mises à jour en arrière-plan avec des API basées sur la localisation s’appuie sur les ressources de l’appareil et peut perturber les utilisateurs qui ne comprennent pas pourquoi une application a besoin d’accéder à leur emplacement. Faites preuve de discrétion lors de l’implémentation de l’analyse des régions ou des modifications importantes de l’emplacement pour le traitement en arrière-plan dans les applications qui n’utilisent pas déjà les API d’emplacement.

Les applications qui utilisent la surveillance de l’emplacement pour le traitement en arrière-plan exposent une faille dans iOS 6 : si les besoins d’une application ne s’inscrivent pas dans une catégorie nécessaire en arrière-plan, les options de mise en arrière-plan sont limitées. Avec l’introduction de deux nouvelles API, la récupération en arrière-plan et les notifications à distance, iOS 7 (et versions ultérieures) offre des possibilités de création d’informations d’arrière-plan à davantage d’applications. Les deux sections suivantes présentent ces nouvelles API.

Récupération en arrière-plan (iOS 7 et versions ultérieures)

Dans iOS 6, une application entrant au premier plan a besoin de temps pour charger le nouveau contenu, présentant brièvement aux utilisateurs le contenu qu’ils ont déjà vu. La récupération en arrière-plan permet aux applications de charger de nouvelles données avant qu’un utilisateur ne lance l’application et de fournir à l’utilisateur le contenu le plus à jour.

Pour implémenter la récupération en arrière-plan, modifiez Info.plist et case activée les zones Activer les modes d’arrière-plan et La récupération en arrière-plan case activée :

Modifiez la liste Info.plist et case activée les zones Activer les modes d’arrière-plan et les zones d’extraction en arrière-plan case activée

Ensuite, dans , AppDelegateremplacez la FinishedLaunching méthode pour définir l’intervalle d’extraction minimal. Dans cet exemple, nous laissons le système d’exploitation décider de la fréquence à laquelle extraire du nouveau contenu :

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
  UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval (UIApplication.BackgroundFetchIntervalMinimum);
  return true;
}

Enfin, effectuez l’extraction en remplaçant la PerformFetch méthode dans , AppDelegateet en transmettant un gestionnaire d’achèvement. Le gestionnaire de saisie semi-automatique est un délégué qui prend un UIBackgroundFetchResult:

public override void PerformFetch (UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
{
  // Check for new data, and display it
  ...
  
  // Inform system of fetch results
  completionHandler (UIBackgroundFetchResult.NewData);
}

Lorsque nous avons terminé la mise à jour du contenu, nous informons le système d’exploitation en appelant le gestionnaire de saisie semi-automatique avec le status approprié. iOS offre trois options pour le gestionnaire de saisie status :

  1. UIBackgroundFetchResult.NewData - Appelé lorsque le nouveau contenu a été extrait et que l’application a été mise à jour.
  2. UIBackgroundFetchResult.NoData - Appelé lorsque la récupération du nouveau contenu a été effectuée, mais qu’aucun contenu n’est disponible.
  3. UIBackgroundFetchResult.Failed - Utile pour la gestion des erreurs, elle est appelée lorsque la récupération n’a pas pu être effectuée.

Les applications utilisant la récupération en arrière-plan peuvent effectuer des appels pour mettre à jour l’interface utilisateur à partir de l’arrière-plan. Lorsque l’utilisateur ouvre l’application, l’interface utilisateur est à jour et affiche le nouveau contenu. Cela met également à jour le commutateur d’applications de l’application instantané, afin que l’utilisateur puisse voir quand l’application a un nouveau contenu.

Important

Une fois PerformFetch appelée, l’application dispose d’environ 30 secondes pour lancer le téléchargement du nouveau contenu et appeler le bloc du gestionnaire d’achèvement. Si cela prend trop de temps, l’application est arrêtée. Envisagez d’utiliser la récupération en arrière-plan avec le service de transfert en arrière-plan lors du téléchargement d’un média ou d’autres fichiers volumineux.

BackgroundFetchInterval

Dans l’exemple de code ci-dessus, nous laissons le système d’exploitation décider de la fréquence d’extraction du nouveau contenu en définissant l’intervalle d’extraction minimal sur BackgroundFetchIntervalMinimum. iOS offre trois options pour l’intervalle de récupération :

  1. BackgroundFetchIntervalNever - Indiquez au système de ne jamais extraire de nouveau contenu. Utilisez cette option pour désactiver l’extraction dans certaines situations, par exemple lorsque l’utilisateur n’est pas connecté. Il s’agit de la valeur par défaut pour l’intervalle d’extraction.
  2. BackgroundFetchIntervalMinimum - Laissez le système décider de la fréquence d’extraction en fonction des modèles utilisateur, de l’autonomie de la batterie, de l’utilisation des données et des besoins d’autres applications.
  3. BackgroundFetchIntervalCustom - Si vous savez à quelle fréquence le contenu d’une application est mis à jour, vous pouvez spécifier un intervalle de « veille » après chaque extraction, pendant lequel l’application sera empêchée d’extraire du nouveau contenu. Une fois cet intervalle écoulé, le système détermine quand extraire le contenu.

BackgroundFetchIntervalCustom Et BackgroundFetchIntervalMinimum s’appuient sur le système pour planifier des extractions. Cet intervalle est dynamique, s’adaptant aux besoins de l’appareil ainsi qu’aux habitudes de l’utilisateur individuel. Par exemple, si un utilisateur vérifie une application tous les matins et qu’un autre vérifie toutes les heures, iOS s’assure que le contenu est à jour pour les deux utilisateurs chaque fois qu’ils ouvrent l’application.

La récupération en arrière-plan doit être utilisée pour les applications qui se mettent à jour fréquemment avec du contenu non critique. Pour les applications avec des mises à jour critiques, les notifications à distance doivent être utilisées. Les notifications à distance sont basées sur la récupération en arrière-plan et partagent le même gestionnaire d’achèvement. Nous allons maintenant nous plonger dans notifications à distance.

Notifications à distance (iOS 7 et versions ultérieures)

Les notifications Push sont des messages JSON envoyés d’un fournisseur à un appareil par le biais du service De notification Push (APN) Apple.

Dans iOS 6, une notification Push entrante indique au système d’avertir l’utilisateur que quelque chose d’intéressant s’est produit dans une application. En cliquant sur la notification, l’application sort de l’état suspendu ou arrêté, et l’application commence à mettre à jour le contenu. iOS 7 (et versions ultérieures) étend les notifications Push ordinaires en donnant aux applications la possibilité de mettre à jour le contenu en arrière-plan avant d’en informer l’utilisateur, afin que l’utilisateur puisse ouvrir l’application et recevoir immédiatement un nouveau contenu.

Pour implémenter des notifications à distance, modifiez Info.plist et case activée les zones Activer les modes d’arrière-plan et notifications distantes case activée :

Mode en arrière-plan défini sur Activer les modes d’arrière-plan et les notifications distantes

Ensuite, définissez l’indicateur content-available sur la notification Push elle-même sur 1. Cela permet à l’application de savoir comment extraire du nouveau contenu avant d’afficher l’alerte :

'aps' {
  'content-available': 1,
  'alert': 'Something new has happened in your app!''
}

Dans AppDelegate, remplacez la DidReceiveRemoteNotification méthode pour case activée la charge utile de notification pour le contenu disponible et appelez le bloc de gestionnaire d’achèvement approprié :

public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
  if([content-available]) {
    // fetch content
    completionHandler (UIBackgroundFetchResult.NewData);
  }
}

Les notifications à distance doivent être utilisées pour les mises à jour peu fréquentes avec du contenu essentiel pour les fonctionnalités de l’application. Pour plus d’informations sur les notifications à distance, consultez le guide Notifications Push Xamarin dans iOS .

Important

Étant donné que le mécanisme de mise à jour des notifications à distance est basé sur la récupération en arrière-plan, l’application doit lancer le téléchargement du nouveau contenu et appeler le bloc du gestionnaire d’achèvement dans les 30 secondes suivant la réception de la notification, sinon iOS met fin à l’application. Envisagez d’associer des notifications à distance avec le service de transfert en arrière-plan lors du téléchargement de fichiers multimédias ou d’autres fichiers volumineux en arrière-plan.

Notifications distantes en mode silencieux

Les notifications à distance sont un moyen simple de notifier les applications des mises à jour et de commencer à extraire du nouveau contenu, mais il existe des cas où nous n’avons pas besoin d’informer l’utilisateur que quelque chose a changé. Par exemple, si un utilisateur marque un fichier pour la synchronisation, nous n’avons pas besoin de l’avertir chaque fois que le fichier est mis à jour. La synchronisation de fichiers n’est pas un événement surprenant et ne nécessite pas l’attention immédiate de l’utilisateur. Les utilisateurs s’attendent simplement à ce que le fichier soit à jour lorsqu’ils l’ouvrent.

Dans des cas comme celui ci-dessus, iOS permet d’envoyer des notifications Push en mode silencieux, c’est-à-dire sans alerte. Pour transformer une notification régulière en notification silencieuse, supprimez simplement l’alerte de la charge utile de notification :

'aps' {
  'content-available': 1
}

Limites du débit

La plus grande différence entre les notifications normales et silencieuses du point de vue du développeur est que les pushs silencieux sont limités au taux. Les APN retardent la remise des pushs silencieux à l’appareil si le taux d’envoi devient trop élevé. Cela permet de s’assurer que les applications ne vident pas les ressources de l’appareil avec trop de notifications silencieuses.

Toutefois, les APN permettent aux notifications silencieuses de « piggyback » à côté d’une notification à distance ou d’une réponse de maintien en vie normale. Étant donné que les notifications régulières ne sont pas limitées au débit, elles peuvent être utilisées pour envoyer à l’appareil des notifications en mode silencieux stockées à partir des APN, comme illustré par le diagramme suivant :

Les notifications régulières peuvent être utilisées pour envoyer des notifications silencieuses stockées à partir des APN vers l’appareil, comme illustré dans ce diagramme

Important

Apple encourage les développeurs à envoyer des notifications Push en mode silencieux chaque fois que l’application en a besoin et à laisser les APN planifier leur livraison.

Dans cette section, nous avons couvert les différentes options d’actualisation du contenu en arrière-plan afin d’exécuter des tâches qui ne correspondent pas à une catégorie d’arrière-plan nécessaire. Voyons maintenant certaines de ces API en action.

Suivant : Partie 4 - Procédures pas à pas de mise en arrière-plan iOS