BGTaskScheduler é um framework da Apple para agendar e executar tarefas em segundo plano em aplicativos iOS 13 e posteriores. Ele substituiu os obsoletos Background Fetch e performFetch, fornecendo uma API unificada para trabalhar com operações em segundo plano. De acordo com Apple Developer Documentation, 2026, o framework inclui dois tipos de tarefas: BGProcessingTask para operações longas e BGAppRefreshTask para atualizações curtas de conteúdo.
Principais pontos
BGTaskScheduler é um framework de sistema da Apple introduzido no iOS 13 que gerencia centralizadamente a execução de tarefas em segundo plano. Antes do seu surgimento, os desenvolvedores usavam UIApplication backgroundTasks, performFetch e manipulação de eventos no appDelegate, o que levava à fragmentação de código e comportamento imprevisível.
O framework funciona com base no princípio de agendamento diferido: o aplicativo registra tarefas com identificadores únicos, e o iOS determina o momento ideal para executá-las. O sistema leva em conta o nível da bateria, a atividade do usuário, o estado da rede e outros fatores.
As principais capacidades incluem trabalhar tanto com operações curtas quanto longas em segundo plano. Ao contrário do AlarmManager no Android, o BGTaskScheduler não garante um horário exato de execução — o sistema reserva-se o direito de atrasar uma tarefa se as condições não forem favoráveis.
BGTaskScheduler usa uma arquitetura baseada em handlers. O aplicativo registra um handler para cada tipo de tarefa, e o sistema o chama quando chega o momento adequado. O framework em si não executa a tarefa diretamente — ele apenas notifica o aplicativo de que é hora de executá-la.
O registro começa declarando o identificador da tarefa no Info.plist através do array BGTaskSchedulerPermittedIdentifiers. Em seguida, no código do aplicativo, o método registerHandler(forTaskWithIdentifier:) é chamado com um closure como handler.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// chamado ao encerrar forçadamente
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Após o registro, o aplicativo deve solicitar explicitamente a execução da tarefa através de submitTaskRequest. A solicitação contém o identificador da tarefa e a data mais próxima possível de início. O sistema salva a solicitação e a processa quando considera as condições adequadas.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Erro de agendamento: \(error)")
}
BGTaskScheduler fornece dois tipos principais de tarefas, cada um projetado para seu próprio caso de uso. Escolher o tipo correto afeta diretamente a probabilidade de execução bem-sucedida da tarefa pelo sistema.
BGAppRefreshTask é projetada para atualizações curtas de conteúdo em segundo plano: carregar novos dados, sincronizar com o servidor, atualizar widgets. O tempo de execução é limitado a 30 segundos, após os quais o sistema encerra a tarefa forçadamente. Este tipo de tarefa é executado com mais frequência que o BGProcessingTask e tem prioridade mais alta.
BGProcessingTask é projetada para operações mais longas: processar arquivos de mídia, indexar Core Data, criar backups. A tarefa pode ser executada por vários minutos, mas o sistema a inicia com menos frequência e apenas em condições favoráveis — conectado à energia, Wi-Fi estável e baixa carga no dispositivo.
| Parâmetro | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Limite de tempo | 30 segundos | vários minutos |
| Frequência de início | alta | baixa |
| Condições | qualquer | energia + Wi-Fi |
| Requer energia | não | recomendado |
| Exemplo | atualizar feed | processar vídeo |
O registro correto é um requisito obrigatório para o funcionamento do BGTaskScheduler. Se uma tarefa não estiver registrada no Info.plist, o sistema ignorará qualquer solicitação para executá-la.
O arquivo Info.plist deve incluir o array BGTaskSchedulerPermittedIdentifiers com uma lista de identificadores de string. Cada identificador deve ser único dentro do aplicativo. A Apple recomenda usar a notação reversa de domínio.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Para agendar uma tarefa, use o método submitTaskRequest. Se uma tarefa não for mais necessária, ela pode ser cancelada via cancelTaskRequest ou cancelAllTaskRequests. O sistema também cancela tarefas automaticamente quando o aplicativo é excluído ou os dados são redefinidos.
BGTaskScheduler oferece a capacidade de rastrear o estado das tarefas agendadas através de getPendingTaskRequests. Este método retorna uma lista de todas as solicitações ativas com informações sobre seu tipo, identificador e earliestBeginDate. Para cada solicitação, você pode verificar se ela já foi concluída ou cancelada e decidir sobre o reagendamento.
É importante notar que o sistema não fornece um callback direto sobre o sucesso de uma tarefa em segundo plano — o próprio handler deve informar o resultado através das propriedades da tarefa. setTaskCompleted permite marcar uma tarefa como concluída com sucesso, após o que o sistema pode iniciar a próxima tarefa agendada deste tipo. Se uma tarefa não chamar setTaskCompleted, o sistema a considera concluída por tempo limite ou encerramento forçado.
Para diagnóstico, recomenda-se usar OSLog no handler e visualizar os logs através do Console.app no Mac. A Apple também fornece a ferramenta MetricKit para analisar o desempenho de tarefas em segundo plano — ela coleta dados sobre tempo de execução, consumo de energia e frequência de início que podem ser usados para otimização.
// Cancelar tarefa específica
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Cancelar todas as tarefas
BGTaskScheduler.shared.cancelAllTaskRequests()
// Verificar tarefas agendadas
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("Agendadas \(requests.count) tarefas")
}
BGTaskScheduler impõe limitações rigorosas ao trabalho em segundo plano. O sistema pode atrasar uma tarefa indefinidamente se as condições não forem favoráveis. Os desenvolvedores devem entender que o framework não é projetado para tarefas em tempo real.
As principais limitações incluem: o sistema não garante a execução da tarefa no horário especificado, o número máximo de tarefas simultâneas é limitado e o consumo de energia é estritamente controlado. Executar várias tarefas em sequência pode resultar em sua fusão ou cancelamento.
Para aumentar a probabilidade de execução, recomenda-se definir earliestBeginDate não antes de 1 hora para BGProcessingTask e 15 minutos para BGAppRefreshTask. Também é importante lidar com expirationHandler — se uma tarefa não cumprir seu limite de tempo, o sistema chama este handler para um encerramento adequado. O reagendamento deve ser feito dentro do próprio handler para manter um ciclo contínuo de trabalho em segundo plano.
Outra limitação importante diz respeito às solicitações de rede. O BGTaskScheduler não garante uma conexão de rede ativa durante a execução da tarefa. O aplicativo deve verificar independentemente a disponibilidade da rede através do NWPathMonitor e adiar o processamento se a conexão estiver ausente. Isso difere do Android JobScheduler, que pode ativar uma tarefa apenas quando conectado a um tipo específico de rede. Na prática, os desenvolvedores frequentemente combinam BGTaskScheduler com sessões URL em segundo plano do NSURLSession para carregamento confiável de dados.
A partir do macOS Catalina, o BGTaskScheduler também está disponível no Mac. Isso permite criar tarefas em segundo plano multiplataforma para aplicativos UIKit executados no Apple Silicon. No watchOS, o framework tem funcionalidade limitada — apenas BGAppRefreshTask curtas estão disponíveis para atualizar complicações e sincronizar dados com o iPhone. Os desenvolvedores devem considerar as diferenças de plataforma ao planejar a arquitetura em segundo plano.
A Apple fornece várias ferramentas para depurar o BGTaskScheduler. O comando e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] no lldb inicia forçadamente uma tarefa em segundo plano, ignorando as limitações do sistema. O Xcode possui um sinalizador Simulate Background Fetch no menu Debug que simula uma atualização curta em segundo plano. O MetricKit é usado para análise de desempenho — ele coleta informações sobre frequência de início, duração da execução e consumo de energia de cada tarefa. Esses dados ajudam a otimizar a frequência de agendamento e escolher o tipo de tarefa correto.
Na prática, o BGTaskScheduler é adequado para atualizar dados de widgets, sincronização iCloud, processar notificações push com conteúdo e indexar para busca Spotlight. Não é adequado para análises em tempo real, aplicativos de chat ou qualquer tarefa que exija execução imediata.
Para um estudo aprofundado do BGTaskScheduler, a Apple recomenda a documentação oficial da WWDC: a sessão "Advances in Background Tasks" (2020) cobre a migração de APIs obsoletas, e "Background Tasks in Practice" (2021) contém casos de uso reais. A seção Energy Efficiency Guide também é útil, descrevendo como o framework se encaixa na estratégia geral de economia de energia da Apple. Exemplos de código estão disponíveis no repositório oficial da Apple Developer no GitHub com projetos completos para iOS e macOS.
Perguntas frequentes
O Background Fetch era limitado a uma tarefa em segundo plano por aplicativo e não tinha mecanismo de prioridades. O BGTaskScheduler suporta múltiplas tarefas com diferentes tipos, fornece uma API unificada e gerenciamento automático de energia.
A Apple não define um limite explícito para o número de identificadores registrados, mas na prática recomenda-se usar não mais que 5–10 tarefas. Um número maior reduz a probabilidade de cada tarefa específica ser executada devido à competição por recursos do sistema.
Para depuração, use o comando e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] no lldb. Ele inicia forçadamente uma tarefa, ignorando as limitações do sistema. O sinalizador Xcode Simulate Background Fetch no menu Debug também está disponível.
Sim, o BGTaskScheduler pode iniciar um processo mesmo se o aplicativo foi fechado forçadamente pelo usuário. No entanto, o sistema pode aplicar atrasos adicionais, e nem todos os tipos de tarefa garantem execução neste cenário.
O sistema chama o expirationHandler, sinalizando à tarefa que ela precisa terminar. Se o aplicativo ignorar este sinal e continuar funcionando, o iOS encerra o processo forçadamente. Depois disso, o sistema pode reduzir a prioridade de todas as tarefas em segundo plano do aplicativo.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também