measurement-and-instrumentation
Implementando tarefas de fundo para manter seu aplicativo Ios responsivo
Table of Contents
Por que as tarefas de fundo importam para a responsividade do aplicativo iOS
Os usuários esperam que os aplicativos iOS sintam que as transições instantâneas devem ser suaves, as interações devem ser imediatas e o conteúdo deve ser fresco no momento em que o aplicativo é aberto. Alcançar isso requer o trabalho de descarte que não precisa acontecer no primeiro plano. As tarefas de fundo permitem que seu aplicativo execute operações como sincronização de dados, pré-fetching de conteúdo ou limpeza sem bloquear a interface do usuário. Quando implementado corretamente, o aplicativo permanece responsivo em primeiro plano, a vida útil da bateria é preservada e os recursos do sistema são usados de forma eficiente.
A chave é usar o modo de execução de fundo certo para cada operação e obedecer às regras rigorosas do iOS sobre execução de fundo. O iOS foi projetado para priorizar o aplicativo atual do usuário e para matar processos de fundo quando as restrições de memória ou energia exigem. Portanto, entender o framework de Tarefas de Fundo introduzido no iOS 13 é essencial para a construção de um aplicativo moderno e bem comportado.
Compreender a Execução de Fundo no iOS
O iOS fornece vários mecanismos para o trabalho de fundo, cada um adequado para diferentes casos de uso. O framework BackgroundTasks é a abordagem recomendada para tarefas deferentes que não precisam acontecer em um momento preciso. Funciona com o sistema agendando tarefas em momentos ótimos, considerando fatores como conectividade de rede, nível de bateria e padrões de engajamento do usuário.
Existem outros modos de execução de fundo para cenários específicos:
- Antecedentes obter – uma oportunidade curta (aproximadamente 30 segundos) para baixar pequenas quantidades de conteúdo periodicamente.
- Processamento de fundo – uma janela mais longa (minutos) para tarefas mais pesadas, como a manutenção de banco de dados ou poda de ativos.
- Notificações remotas – acordando o aplicativo para processar cargas úteis com a bandeira .
- URLSession background transfers – carregar ou descarregar dados, mesmo que o aplicativo esteja suspenso ou encerrado.
- VoIP / áudio / localização – modos especializados que mantêm o aplicativo em funcionamento por períodos mais longos.
Para o trabalho de fundo de propósito geral que pode ser agendado sem urgência de face ao usuário, o BGTaskScheduler API é a melhor escolha. Ele consolida o agendamento, reduz o risco de ser morto pelo sistema, e melhora a vida útil da bateria em comparação com abordagens mais antigas como .
Componentes-chave do Quadro de Tarefas de Fundo
- BGProcessingTask – destinado a tarefas que levam um período de tempo notável, como realizar uma sincronização completa, limpar arquivos em cache ou atualizar um banco de dados local. O sistema dá a essas tarefas um orçamento de tempo maior (minutos) e agenda-as quando as condições são favoráveis (por exemplo, dispositivo no Wi-Fi e carregamento).
- BGAppRefreshTask – projetado para atualizações curtas, normalmente com duração de alguns segundos. Use-o quando o aplicativo precisa atualizar dados de UI ou buscar pequenas quantidades de conteúdo para que da próxima vez que o usuário abrir o aplicativo, ele mostre informações frescas. O sistema tenta executar essas tarefas antes que o usuário lance o aplicativo.
- BGTaskScheduler – o gestor central que regista identificadores, envia pedidos e controla o seu responsável quando a tarefa começa. Também lida com a expiração e o re-agendamento.
Ambos os tipos de tarefas compartilham um ciclo de vida semelhante: registrar, programar, manipular e remarcar. O sistema decide exatamente quando executar a tarefa; você só pode fornecer uma dica via . Este design respeita os recursos do dispositivo do usuário e impede que os aplicativos executem o erro em segundo plano.
Implementação de Tarefas de Antecedentes – Guia passo a passo
Para integrar tarefas de fundo no aplicativo iOS, você deve completar várias etapas: habilitar a capacidade, registrar identificadores de tarefas, agendar o trabalho, lidar com a execução e gerenciar a expiração. Abaixo, nós caminhamos por cada etapa com exemplos de código concretos.
1. Habilite a capacidade dos modos de fundo
No Xcode, navegue para a capacidade de ] Assinar e Capacidades e adicione a Modos de base[. Verifique pelo menos Processamento de base e/ou Busca de fundo[[] dependendo de quais tipos de tarefas você planeja usar. Para BGAppRefreshTask, verificar É necessário buscar de base[; para BGProcessingTask, É necessário processar de fundo.
2. Identificadores de Tarefas de Registro
Cada tarefa de fundo deve ter uma string identificadora única, normalmente em formato inverso-DNS (por exemplo, ]). Você registra esses identificadores no início do ciclo de lançamento da aplicação, como em .
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.myapp.refresh", using: nil) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.myapp.cleanup", using: nil) { task in
self.handleDatabaseCleanup(task: task as! BGProcessingTask)
}
return true
}
O fechamento captura o objeto de tarefa; dentro dele você chama seu próprio manipulador. Lembre-se de lançar a tarefa para o tipo de concreto apropriado.
3. Agendar Tarefas de Fundo
A submissão de pedidos deve acontecer quando o aplicativo vai para o fundo ou quando uma necessidade recorrente surge. O sugere que você gostaria que a tarefa fosse executada, mas o sistema pode atrasá-la ainda mais.
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(identifier: "com.example.myapp.refresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) // at least 15 minutes from now
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Could not schedule app refresh: \(error.localizedDescription)")
}
}
func scheduleDatabaseCleanup() {
let request = BGProcessingTaskRequest(identifier: "com.example.myapp.cleanup")
request.earliestBeginDate = Date(timeIntervalSinceNow: 60 * 60) // at least 1 hour
request.requiresNetworkConnectivity = true // only run when network is available
request.requiresExternalPower = true // only run when device is charging
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Could not schedule cleanup: \(error.localizedDescription)")
}
}
Chame estes métodos de agendamento em locais apropriados: por exemplo, após uma tarefa de fundo bem- sucedida (para remarcar a próxima execução) ou quando o usuário suspender a aplicação. Você também pode chamá-los em resposta às ações do usuário que indicam uma necessidade de atualizações periódicas.
4. Execução da tarefa de manipulação
Quando o sistema decide executar uma tarefa de fundo, ele invoca o manipulador que você registrou. Dentro do manipulador você deve:
- Defina um manipulador de expiração que cancela o trabalho em curso e marca a tarefa como incompleta se o tempo acabar.
- Execute o trabalho real (por exemplo, busca de rede, operações de banco de dados).
- Chamada uma vez terminado o trabalho (ou após falha).
- Agendar a próxima ocorrência da tarefa (a menos que a tarefa se destinem a ser pontual).
func handleAppRefresh(task: BGAppRefreshTask) {
// Reschedule the next refresh immediately.
scheduleAppRefresh()
// Set an expiration handler that will be called if the system needs to reclaim time.
task.expirationHandler = {
// Cancel any ongoing operations, clean up resources.
// Do NOT call setTaskCompleted here; the system will mark it as expired.
}
// Perform background work (e.g., fetch new data from server).
fetchLatestData { success in
// After the work completes (or errors), inform the scheduler.
task.setTaskCompleted(success: success)
}
}
Para um BGProcessingTask, o padrão é idêntico, mas o orçamento de tempo é maior. Você também pode executar operações mais pesadas como compactar uma loja de dados ou redimensionar imagens.
5. Testando Tarefas de Fundo
As tarefas de fundo são notoriamente complicadas de testar porque o sistema decide quando executá- las. Use as seguintes técnicas para simular a execução:
- Use o depurador Xcode: inicie o aplicativo, então pause e use o comando (via lldb ou uma opção de menu "Simular Busca de Fundo" no simulador).
- Para BGProcessingTask, use a chamada imediatamente após o registro, e coloque o aplicativo em segundo plano. O sistema pode executá-lo em poucos minutos.
- Use a abordagem em uma compilação de depuração: chame e resubmeta para ativar os logs de agendamento.
- Monitore a execução da tarefa definindo pontos de interrupção no seu manipulador e verificando se há logs no console.
Melhores práticas para implementação robusta de tarefas de fundo
Seguindo estas diretrizes, ajudará seu aplicativo a permanecer responsivo, conservar bateria e passar revisão App Store.
Tarefas Idempotentes de Desenho
As tarefas de fundo podem ser interrompidas a qualquer momento. Certifique-se de que o seu trabalho é idempotente – executá- lo várias vezes produz o mesmo resultado que executá- lo uma vez. Por exemplo, use a lógica upsert em vez de inserir- somente. Acompanhe o que foi processado usando timestamps ou offsets para que o progresso parcial seja seguro.
Respeite o Expirador
O manipulador de expiração é a sua última oportunidade de parar graciosamente o trabalho. Em nenhuma circunstância você deve ignorá- lo. Se o sistema forçar o término, todo o trabalho inacabado é perdido. No manipulador, cancelar quaisquer tarefas de rede em curso, liberar bloqueios e salvar o estado de checkpoint para que a próxima execução possa retomar.
Não Exceder o Calendário
Solicitar tarefas de fundo apenas quando você realmente precisa de atualizações de conteúdo ou manutenção. Cada submissão consome recursos do sistema para contabilidade. O excesso de tempo pode levar ao sistema estrangulando seu aplicativo ou rejeitando tarefas. Uma boa cadência para BGAppRefreshTask é a cada 15-30 minutos no máximo; BGProcessingTask pode ser executada diariamente ou semanalmente.
Usar as Restrições sabiamente
BGProcessingTaskRequest oferece e . Defina-os apenas quando necessário. Se sua tarefa puder ser executada offline, omita o requisito de rede – o sistema terá mais flexibilidade de agendamento e poderá ser executado mais cedo. Da mesma forma, exigindo que a energia externa atrase a tarefa até que o dispositivo seja conectado, o que é apropriado apenas para o trabalho pesado de CPU/IO.
Manter a Luz de Trabalho na tarefa BGAppRefresh
Estas tarefas têm alguns segundos de tempo de wall-clock antes de expirar. Busque apenas o que é necessário para atualizar seu estado de UI. Operações pesadas como migração de banco de dados ou grandes downloads pertencem ao BGProcessingTask.
Teste em Dispositivos Verdadeiros
O simulador não reproduz totalmente o comportamento de programação de tarefas de fundo. Teste em um dispositivo físico com diferentes condições de bateria, rede e carregamento. Use o Energy Log no Xcode Organizer para ver como seu aplicativo afeta a duração da bateria.
Manipular erros e re- agendar
Se uma tarefa de fundo falhar (por exemplo, erro de rede), você ainda deve remarcar para uma hora posterior. Use backoff exponencial ou um intervalo de repetição fixo. Não continue chamando sem remarcar, porque o sistema pode parar de conceder execução inteiramente.
Pistas e solução de problemas comuns
Aqui estão as questões frequentes encontradas ao implementar tarefas de fundo e como resolvê-las.
Tarefa Nunca Funciona
Razões possíveis:
- Capacidade em falta – verifique se os Modos de Fundo estão habilitados.
- Erro de identificação – garantir que a string usada em corresponde à do Info.plist ou em .
- A tarefa não é resubmetida – depois de uma tarefa terminar (ou falhar), você deve agendar novamente para futuras execuções.
- Atrasos do sistema – iOS pode adiar a execução de fundo se o dispositivo estiver sob carga pesada, com pouca bateria ou no modo de baixa potência. Verifique o estado do dispositivo.
Para depurar, habilitar o loging: set loging through em uma compilação de depuração. Em seguida, observe o console para mensagens sobre agendamento e execução.
Tarefa Expira Freqüentemente
Se sua tarefa atinge frequentemente o manipulador de expiração, isso significa que você está tentando fazer muito no tempo permitido. A análise com instrumentos (Perfil de tempo) pode revelar gargalos. Mova operações pesadas para BGProcessingTask, ou quebre o trabalho em pedaços menores e trace o progresso.
Avisos de Memória ou Quedas
As tarefas de fundo são executadas num ambiente restrito. Alocar e negociar objetos grandes cuidadosamente. Use pools de liberação automática para loops que criam muitos objetos temporários. Se a aplicação falhar, verifique os registros de falhas para terminação de memória baixa. Considere ] como um lugar para liberar dados em cache.
Técnicas Avançadas e Considerações do Mundo Real
Para aplicativos que precisam equilibrar a responsividade com o trabalho de fundo, considere combinar tarefas de fundo com outros recursos iOS.
Combinando tarefas de fundo com notificações de envio
Para atualizações com sensibilidade temporal, use notificações remotas com a tecla . Isto desperta a aplicação em segundo plano para uma janela de execução curta (semelhante à BGAppRefreshTask). Para atualizações desproporcionais, recorra a tarefas de fundo programadas. Esta abordagem híbrida garante conteúdo fresco, respeitando a duração da bateria.
Sincronização com o CloudKit ou os dados principais
Ao executar a sincronização de fundo com o CloudKit, use os métodos de busca de fundo ao lado do BGAppRefreshTask. Para os dados principais, use o histórico persistente de rastreamento para que as importações de fundo não entrem em conflito com as leituras de primeiro plano.
Monitoramento do desempenho da tarefa
Use o Energy Log no Xcode (Window > Organizer > Crashes & Energy > select app > open Energy Log) para ver quantas vezes executam tarefas de fundo, sua duração e seu impacto na bateria. Objetivo manter o tempo de execução de cada tarefa abaixo do orçamento típico do sistema: ~30 segundos para BGAppRefreshTask, ~5 minutos para BGProcessingTask.
Referências externas
Para um estudo mais aprofundado, consulte estes recursos de autoridade:
- [[FLT: 0]] Documentação da Apple: Tarefas de Fundo
- WWDC 2019: Avanços na execução de fundo do aplicativo
- Guia da aplicação: Execução de fundo (Legado)
- [[FLT: 0]]Raywenderlich: Tutorial de Modos de Fundo
- Usando execução de base para melhorar a eficiência energética
Conclusão
Implementar tarefas de fundo com o BGTaskScheduler e BGProcessingTask[ / BGAppRefreshTask[ permite que você construa aplicativos iOS que se sintam rápidos e responsivos enquanto ainda executa o trabalho de fundo necessário. Seguindo a abordagem sistemática descrita acima – capacitando, registrando identificadores, programando sabiamente, manipulando a execução graciosamente e respeitando as restrições do sistema – você pode garantir que seu aplicativo equilibre a frescura com eficiência. Teste completamente em dispositivos físicos, monitore o impacto energético e itere na lógica de agendamento. Com design cuidadoso, as tarefas de fundo tornam-se uma parte perfeita da arquitetura do seu aplicativo, melhorando a experiência do usuário sem sacrificar o desempenho ou a vida da bateria.