Partager via


Transfert en arrière-plan et NSURLSession dans Xamarin.iOS

Un transfert en arrière-plan est lancé en configurant une tâche de chargement ou de téléchargement en arrière-plan NSURLSession et en file d’attente. Si les tâches se terminent pendant que l’application est en arrière-plan, suspendue ou arrêtée, iOS informe l’application en appelant le gestionnaire d’achèvement dans AppDelegate de l’application. Le diagramme suivant illustre ceci en action :

Un transfert en arrière-plan est lancé en configurant une session NSURLSession en arrière-plan et en file d’attente des tâches de chargement ou de téléchargement

Configuration d’une session en arrière-plan

Pour créer une session en arrière-plan, créez-la NSUrlSession et configurez-la à l’aide d’un NSUrlSessionConfiguration objet.

L’objet de configuration détermine ce que la session peut faire et les types de tâches qu’elle peut exécuter. Les sessions configurées à l’aide de la méthode s’exécutent dans un processus distinct et effectuent des transferts discrétionnaires (WiFi) pour préserver la CreateBackgroundSessionConfiguration durée de vie des données et de la batterie. L’exemple de code suivant illustre la configuration appropriée d’une session de transfert en arrière-plan à l’aide de la CreateBackgroundSessionConfiguration méthode et d’un identificateur de chaîne unique :

public partial class SimpleBackgroundTransferViewController : UIViewController
{
  NSUrlSession session = null;

  NSUrlSessionConfiguration configuration =
      NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration ("com.SimpleBackgroundTransfer.BackgroundSession");
  session = NSUrlSession.FromConfiguration
      (configuration, new MySessionDelegate(), new NSOperationQueue());

}

Outre un objet de configuration, une session nécessite également un délégué de session et une file d’attente. La file d’attente détermine l’ordre dans lequel les tâches se terminent. Le délégué de session chaperonne le processus de transfert et gère l’authentification, la mise en cache et d’autres problèmes liés à la session.

Utilisation des tâches et des délégués

Maintenant que nous avons configuré une session en arrière-plan, nous allons lancer des tâches pour gérer le transfert. Nous pouvons suivre ces tâches à l’aide d’une NSUrlSessionDelegate instance appelée délégué de session. Le délégué de session est responsable du réveil d’une application arrêtée ou suspendue en arrière-plan pour gérer l’authentification, les erreurs ou la fin du transfert.

Il NSUrlSessionDelegate fournit les méthodes de base suivantes pour case activée’état de transfert :

  • DidFinishEventsForBackgroundSession : cette méthode est appelée lorsque toutes les tâches ont terminé et que le transfert est terminé.
  • DidReceiveChallenge : appelé pour demander des informations d’identification lorsque l’autorisation est requise.
  • DidBecomeInvalidWithError : appelé si la valeur NSURLSession devient invalidée.

Les sessions en arrière-plan nécessitent des délégués plus spécialisés en fonction des types de tâches en cours d’exécution. Les sessions en arrière-plan sont limitées à deux types de tâches :

  • Charger des tâches : les tâches de type NSUrlSessionUploadTask utilisent l’interface INSUrlSessionTaskDelegate , qui implémente INSUrlSessionDelegate. Cela fournit des méthodes supplémentaires pour suivre la progression du chargement, gérer la redirection HTTP, etc.
  • Télécharger les tâches : les tâches de type NSUrlSessionDownloadTask utilisent l’interface INSUrlSessionDownloadDelegate , qui implémente INSUrlSessionDelegate et INSUrlSessionTaskDelegate. Cela fournit toutes les méthodes de chargement des tâches, ainsi que les méthodes spécifiques au téléchargement pour suivre la progression du téléchargement et déterminer quand une tâche de téléchargement a repris ou terminé.

Le code suivant définit une tâche qui peut être utilisée pour télécharger une image à partir d’une URL. La tâche est démarrée en appelant CreateDownloadTask la session en arrière-plan et en transmettant la demande d’URL :

const string DownloadURLString = "http://xamarin.com/images/xamarin.png"; // or other hosted file
public NSUrlSessionDownloadTask downloadTask;

NSUrl downloadURL = NSUrl.FromString (DownloadURLString);
NSUrlRequest request = NSUrlRequest.FromUrl (downloadURL);
downloadTask = session.CreateDownloadTask (request);

Ensuite, créez un délégué de téléchargement de session pour suivre toutes les tâches de téléchargement dans cette session. La classe de délégué doit hériter et NSObject implémenter l’interface requise :

public class MySessionDelegate : NSObject, INSUrlSessionDownloadDelegate
{
  public void DidWriteData (NSUrlSession session, NSUrlSessionDownloadTask downloadTask, long bytesWritten, long totalBytesWritten, long totalBytesExpectedToWrite)
  {
    Console.WriteLine (string.Format ("DownloadTask: {0}  progress: {1}", downloadTask, progress));
    InvokeOnMainThread( () => {
      // update UI with progress bar, if desired
    });
  }
  ...
}

Pour connaître la progression d’une tâche de téléchargement, remplacez la méthode pour suivre la DidWriteData progression et même mettre à jour l’interface utilisateur. Les mises à jour de l’interface utilisateur s’affichent immédiatement si l’application est au premier plan ou attend l’utilisateur la prochaine fois qu’il ouvre l’application.

L’API de délégué de session fournit un large kit de ressources pour interagir avec les tâches. Pour obtenir la liste complète des méthodes de délégué de session, reportez-vous à la documentation de l’API NSUrlSessionDelegate .

Important

Les sessions en arrière-plan sont démarrées sur un thread d’arrière-plan. Les appels à mettre à jour l’interface utilisateur doivent donc être exécutés explicitement sur le thread d’interface utilisateur en appelant InvokeOnMainThread pour éviter la fin de l’application iOS.

Gestion de l’achèvement du transfert

La dernière étape consiste à informer l’application quand toutes les tâches associées à la session ont été effectuées et à gérer le nouveau contenu.

Dans le AppDelegate, abonnez-vous à l’événement HandleEventsForBackgroundUrl . Lorsque l’application entre en arrière-plan et qu’une session de transfert est en cours d’exécution, cette méthode est appelée et le système nous transmet un gestionnaire d’achèvement :

public System.Action backgroundSessionCompletionHandler;

public void HandleEventsForBackgroundUrl (UIApplication application, string sessionIdentifier, System.Action completionHandler)
{
  this.backgroundSessionCompletionHandler = completionHandler;
}

Utilisez le gestionnaire d’achèvement pour informer iOS lorsque notre application a terminé le traitement.

Rappelez-vous qu’une session peut générer plusieurs tâches pour traiter un transfert. Une fois la dernière tâche terminée, une application suspendue ou arrêtée est relancée en arrière-plan. Ensuite, l’application se connecte à l’aide de l’identificateur NSURLSession de session unique et appelle DidFinishEventsForBackgroundSession le délégué de session. Cette méthode est l’opportunité de l’application de gérer de nouveaux contenus, notamment la mise à jour de l’interface utilisateur pour refléter les résultats du transfert :

public void DidFinishEventsForBackgroundSession (NSUrlSession session) {
  // Handle new information, update UI, etc.
}

Une fois le nouveau contenu géré, appelez le gestionnaire d’achèvement pour informer le système qu’il est sûr de prendre une instantané de l’application et de revenir en veille :

public void DidFinishEventsForBackgroundSession (NSUrlSession session) {
  var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

  // Handle new information, update UI, etc.

  // call completion handler when you're done
  if (appDelegate.backgroundSessionCompletionHandler != null) {
    NSAction handler = appDelegate.backgroundSessionCompletionHandler;
    appDelegate.backgroundSessionCompletionHandler = null;
    handler.Invoke ();
  }
}

Cette procédure pas à pas a abordé les étapes de base pour implémenter le service de transfert en arrière-plan dans iOS 7 et versions ultérieures.