Sobes.tech
Middle

Como garantir a continuação do funcionamento da aplicação em segundo plano?

sobes.tech IA

Resposta da IA

Para garantir o funcionamento da aplicação em segundo plano, são utilizados vários mecanismos do iOS, dependendo do tipo de tarefa:

  • Modos em segundo plano: São modos predefinidos do sistema que permitem realizar certas operações em segundo plano. Os mais comuns:

    • audio: Reprodução ou gravação de áudio.
    • location: Rastreamento de localização.
    • voip: Uso de VoIP.
    • fetch: Carregamento periódico de conteúdo novo.
    • processing: Execução de tarefas intensivas.
    • remote-notification: Processamento de notificações push.

    Para ativar os modos em segundo plano, é necessário adicionar as chaves correspondentes em Info.plist ou usar Capabilities no Xcode.

  • Tarefa em segundo plano: Permite obter um período limitado de tempo para concluir a tarefa atual após a aplicação passar para segundo plano.

    var backgroundTask: UIBackgroundTaskIdentifier = .invalid
    
    func registerBackgroundTask() {
        backgroundTask = UIApplication.shared.beginBackgroundTask {
            // Gerir o vencimento
            self.endBackgroundTask()
        }
        // Executar tarefa em segundo plano
        // ...
    }
    
    func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTask)
        backgroundTask = .invalid
    }
    
  • Fetch em segundo plano: Permite que o sistema inicie periodicamente a aplicação em segundo plano para verificar e descarregar conteúdo novo.

    // No AppDelegate, em didFinishLaunchingWithOptions
    UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum)
    
    // Em didFinishLaunchingWithOptions ou num método separado
    func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        // Realizar carregamento de dados assíncrono
        // Ao terminar, chamar completionHandler com o resultado adequado:
        // .newData, .noData, .failed
        completionHandler(.newData)
    }
    
  • Processamento em segundo plano: Destinado a executar tarefas que consomem muitos recursos e podem levar muito tempo. Usado com BGTaskScheduler.

    import BackgroundTasks
    
    let taskID = "com.yourapp.mytask"
    
    func registerBackgroundTasks() {
        BGTaskScheduler.shared.register(forTaskWithIdentifier: taskID, using: nil) { task in
            // Executar tarefa
            self.handleBackgroundTask(task: task as! BGProcessingTask)
        }
    }
    
    func handleBackgroundTask(task: BGProcessingTask) {
        // Executar tarefa longa
        // Marcar a tarefa como concluída
        task.setTaskCompleted(success: true)
    }
    
    // Programar tarefa
    func scheduleBackgroundProcessingTask() {
        let request = BGProcessingTaskRequest(identifier: taskID)
        // Configurar requisitos do ambiente de execução (por exemplo, conectividade de rede, carga da bateria)
        request.requiresNetworkConnectivity = true
    
        do {
            try BGTaskScheduler.shared.submit(request)
        } catch {
            print("Não foi possível agendar a tarefa: \(error)")
        }
    }
    
  • Notificações push: Push silenciosos podem ser usados para ativar a aplicação em segundo plano e carregar novo conteúdo.

  • Work Manager (Android) equivalente para iOS (indireto): BGTaskScheduler é o equivalente ao Android Work Manager, permitindo planejar tarefas em segundo plano considerando recursos e restrições do sistema.

A escolha de um mecanismo específico depende do tipo de tarefa que precisa ser executada em segundo plano. O uso de um mecanismo inadequado pode levar à rejeição da aplicação na revisão na App Store e ao encerramento rápido dos processos em segundo plano pelo sistema. É também importante respeitar os recursos do sistema: bateria, memória e CPU.