Sobes.tech
Middle

Comment assurer la continuité du fonctionnement de l'application en arrière-plan?

sobes.tech IA

Réponse de l'IA

Pour assurer le fonctionnement de l’application en arrière-plan, différents mécanismes iOS sont utilisés, en fonction du type de tâche :

  • Modes en arrière-plan : Ce sont des modes système prédéfinis permettant d’effectuer certaines opérations en arrière-plan. Les plus courants :

    • audio : Lecture ou enregistrement audio.
    • location : Suivi de la localisation.
    • voip : Utilisation de VoIP.
    • fetch : Téléchargement périodique de contenu nouveau.
    • processing : Exécution de tâches intensives.
    • remote-notification : Traitement des notifications push.

    Pour activer ces modes, il faut ajouter les clés correspondantes dans Info.plist ou utiliser Capabilities dans Xcode.

  • Tâche en arrière-plan : Permet d’obtenir une période limitée pour terminer la tâche en cours après que l’application passe en arrière-plan.

    var backgroundTask: UIBackgroundTaskIdentifier = .invalid
    
    func registerBackgroundTask() {
        backgroundTask = UIApplication.shared.beginBackgroundTask {
            // Gestion de l’expiration
            self.endBackgroundTask()
        }
        // Exécuter la tâche en arrière-plan
        // ...
    }
    
    func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = .invalid
    }
    
  • Fetch en arrière-plan : Permet au système de lancer périodiquement l’application en arrière-plan pour vérifier et télécharger du contenu nouveau.

    // Dans AppDelegate, dans didFinishLaunchingWithOptions
    UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum)
    
    // Dans didFinishLaunchingWithOptions ou dans une méthode séparée
    func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        // Effectuer un chargement de données asynchrone
        // À la fin, appeler completionHandler avec le résultat approprié :
        // .newData, .noData, .failed
        completionHandler(.newData)
    }
    
  • Traitement en arrière-plan : Conçu pour effectuer des tâches intensives qui peuvent prendre du temps. Utilisé avec BGTaskScheduler.

    import BackgroundTasks
    
    let taskID = "com.yourapp.mytask"
    
    func registerBackgroundTasks() {
        BGTaskScheduler.shared.register(forTaskWithIdentifier: taskID, using: nil) { task in
            // Effectuer la tâche
            self.handleBackgroundTask(task: task as! BGProcessingTask)
        }
    }
    
    func handleBackgroundTask(task: BGProcessingTask) {
        // Effectuer une tâche longue
        // Marquer la tâche comme terminée
        task.setTaskCompleted(success: true)
    }
    
    // Planifier la tâche
    func scheduleBackgroundProcessingTask() {
        let request = BGProcessingTaskRequest(identifier: taskID)
        // Configurer les exigences de l’environnement d’exécution (par ex., connectivité réseau, charge de la batterie)
        request.requiresNetworkConnectivity = true
    
        do {
            try BGTaskScheduler.shared.submit(request)
        } catch {
            print("Impossible de planifier la tâche : \(error)")
        }
    }
    
  • Notifications push : Les pushes silencieux peuvent être utilisés pour activer l’application en arrière-plan et charger du contenu nouveau.

  • Work Manager (Android) équivalent pour iOS (indirect) : BGTaskScheduler est l’équivalent de Android Work Manager, permettant de planifier des tâches en arrière-plan en tenant compte des ressources et des contraintes du système.

Le choix d’un mécanisme spécifique dépend du type de tâche à effectuer en arrière-plan. L’utilisation d’un mécanisme inapproprié peut entraîner le rejet de l’application lors de la revue sur l’App Store et la terminaison rapide des processus en arrière-plan par le système. Il est également important de respecter les ressources système : batterie, mémoire et CPU.