Background Fetch é um mecanismo do iOS que ativa periodicamente o aplicativo em segundo plano para baixar conteúdo novo. O sistema analisa o comportamento do usuário e seleciona as janelas ideais para atualização. De acordo com a Apple, 2026, o aplicativo tem de 30 a 120 segundos para realizar a operação, após o que o sistema suspende ou encerra o processo.
Pontos principais
Background Fetch é uma API do iOS que permite ao aplicativo receber dados atualizados periodicamente em segundo plano. Foi introduzido pela primeira vez no iOS 7 juntamente com o mecanismo Background App Refresh. O principal objetivo é que o conteúdo esteja atualizado quando o usuário abrir o aplicativo, sem necessidade de esperar o carregamento.
As notificações push são iniciadas pelo servidor — este envia um sinal para o dispositivo e o sistema decide se deve ativar o aplicativo. O Background Fetch é iniciado pelo próprio iOS com base nos padrões de uso do dispositivo. Push é mais adequado para mensagens urgentes, enquanto Fetch é para atualizações programadas de conteúdo (notícias, feed de redes sociais).
Background Fetch é um dos vários mecanismos de execução em segundo plano no iOS. BGAppRefreshTask (iOS 13+) realiza a mesma tarefa mas com agendamento mais flexível. Background Modes (áudio, localização) são para operações contínuas. Silent Push são atualizações iniciadas pelo servidor. Fetch continua relevante para projetos que suportam iOS 12 e versões anteriores.
iOS utiliza um algoritmo de aprendizagem automática para determinar o momento ideal para ativar o aplicativo. O sistema analisa quando o usuário normalmente abre o aplicativo, quanto tempo o utiliza e com que frequência retorna. Com base nestes dados, o iOS calcula as janelas para Background Fetch.
Quando o sistema decide ativar o aplicativo, chama o método application(_:performFetchWithCompletionHandler:) no AppDelegate. O aplicativo deve carregar uma quantidade mínima de dados novos e chamar o completion handler com um de três estados: .newData (dados carregados), .noData (sem dados novos) ou .failed (erro). O estado afeta a frequência de futuras ativações.
O estado .newData informa ao sistema que a atualização foi útil — o iOS pode aumentar a frequência de ativações. .noData indica que não há dados — a frequência permanece a mesma ou diminui. .failed sinaliza um problema — o sistema reduz a frequência para economizar bateria. A ênfase deve ser num estado honesto, não em forçar .newData.
| Estado | Significado | Impacto |
|---|---|---|
| .newData | Dados carregados com sucesso | A frequência pode aumentar |
| .noData | A verificação não trouxe dados novos | A frequência permanece a mesma |
| .failed | Erro de rede ou servidor | A frequência diminui |
Para ativar o Background Fetch são necessários dois passos: ativar a capability no Xcode e definir o intervalo mínimo no código. A capability encontra-se em Target — Signing & Capabilities — Background Modes — marcar a caixa Background Fetch. Sem este passo, o sistema não ativará o aplicativo.
O método UIApplication.shared.setMinimumBackgroundFetchInterval define o tempo mínimo em segundos entre chamadas Fetch. O valor UIApplication.backgroundFetchIntervalMinimum (aproximadamente 15 minutos) indica ao sistema para ativar o aplicativo com a maior frequência possível de forma energeticamente eficiente. Definir o intervalo em application(_:didFinishLaunchingWithOptions:) é uma prática padrão.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
Ao ativar o Background Fetch no Xcode, este atualiza automaticamente o Info.plist — adiciona a chave UIBackgroundModes com o valor fetch. Este é um passo obrigatório: sem ele, o aplicativo não receberá a chamada performFetchWithCompletionHandler. Pode verificar através de P list Source ou Build Settings.
Vejamos uma implementação completa de Background Fetch para um aplicativo de notícias. A implementação inclui carregamento de dados, cache e chamada do completion handler. O código é executado no AppDelegate — o único local onde o sistema chama fetch.
func application(
_ application: UIApplication,
performFetchWithCompletionHandler handler: @escaping (UIBackgroundFetchResult) -> Void
) {
let url = URL(string: "https://api.example.com/latest")!
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
handler(.failed)
return
}
do {
let articles = try JSONDecoder().decode([Article].self, from: data)
cacheArticles(articles)
handler(articles.isEmpty ? .noData : .newData)
} catch {
handler(.failed)
}
}.resume()
}
Após carregar os dados através de Background Fetch, é necessário guardá-los no armazenamento local — CoreData, UserDefaults ou File Manager. Quando o aplicativo abrir, os dados já devem estar disponíveis. Utilize CoreData com um contexto em segundo plano para escrita segura em termos de threads. Após guardar, atualize a interface do usuário na thread principal.
func cacheArticles(_ articles: [Article]) {
let container = NSPersistentContainer(name: "AppModel")
container.performBackgroundTask { context in
articles.forEach { article in
let entity = ArticleEntity(context: context)
entity.id = Int64(article.id)
entity.title = article.title
entity.body = article.body
}
try? context.save()
}
}
Para testes, utilize o Simulador — selecione Debug — Simulate Background Fetch no Xcode. Num dispositivo físico, é necessário aguardar que o sistema decida executar fetch. Para acelerar, pode definir o intervalo mínimo para 1 minuto, mas o sistema pode ignorá-lo quando a bateria está baixa.
Background Fetch tem várias limitações importantes a considerar ao projetar a arquitetura do aplicativo. A principal é que o sistema controla completamente a frequência das chamadas e o desenvolvedor não pode garanti-la. Mesmo com um intervalo mínimo definido, o sistema pode não chamar fetch durante horas.
O sistema aloca tempo limitado para o aplicativo executar a tarefa — normalmente até 30 segundos. Se o aplicativo não chamar o completion handler dentro desse tempo, o sistema encerra forçadamente o processo e reduz a frequência de futuras ativações. Todos os pedidos de rede devem ser compactos — não mais de 1-2 por chamada.
O iOS tem em conta o nível de bateria ao agendar Background Fetch. Quando a carga está abaixo de 20%, a frequência de ativações diminui. Quando o Modo de baixo consumo está ativado, o sistema pode desativar completamente as atualizações em segundo plano para todas as aplicações. O usuário também pode desativar o Background App Refresh para uma aplicação específica nas definições.
URLSession iniciada a partir de Background Fetch funciona em modo padrão — sem suporte para sessões em segundo plano. Para descargas grandes, utilize URLSession com configuração em segundo plano. O sistema continuará a descarga mesmo após o fim do fetch, mas o progresso não será rastreado até a próxima ativação.
A partir do iOS 13, a Apple recomenda o BGTaskScheduler como substituto do Background Fetch. O BGTaskScheduler proporciona um agendamento mais flexível, dois tipos de tarefas (refresh e processing) e registo de tarefas com identificadores. A migração inclui vários passos e é recomendada para todos os projetos novos.
O primeiro passo é definir os identificadores de tarefas no Info.plist através da chave BGTaskSchedulerPermittedIdentifiers. O segundo é registar as tarefas no AppDelegate através de BGTaskScheduler.shared.register. O terceiro é substituir a chamada performFetchWithCompletionHandler pelo handler passado ao register. O quarto é chamar submit para agendar a tarefa.
// Antes (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// Após migração (BGTaskScheduler)
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.example.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
let request = BGAppRefreshTaskRequest(
identifier: "com.example.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
O BGTaskScheduler proporciona mais controlo: BGProcessingTask para operações longas (até 10 minutos), condições de execução através de requiresNetworkConnectivity e requiresExternalPower, e um expiration handler para finalização controlada. O sistema também analisa o uso do aplicativo, mas o desenvolvedor pode definir requisitos mais precisos.
Se o aplicativo suportar iOS 12 e versões anteriores, o Background Fetch continua a ser a única opção para atualizações periódicas. O BGTaskScheduler está disponível apenas a partir do iOS 13+. Neste caso, utilize um wrapper: verifique a disponibilidade através de if #available(iOS 13, *) e chame a API correspondente.
Perguntas frequentes
A frequência exata não está documentada e depende do comportamento do usuário. O sistema analisa com que frequência o usuário abre o aplicativo e ajusta a frequência conforme necessário. Em média, com uso ativo, o fetch pode ser chamado 1–3 vezes por hora. Com uso pouco frequente — 1–2 vezes por dia.
Verifique três condições: a capability Background Fetch está ativada no Xcode, o minimumBackgroundFetchInterval está definido e o usuário não desativou o Background App Refresh para o aplicativo nas definições. Verifique também que o dispositivo não está em Modo de baixo consumo e o nível de bateria está acima de 20%.
Background Fetch é a API antiga (iOS 7), BGAppRefreshTask é a nova API (iOS 13+). BGAppRefreshTask oferece mais controlo: expiration handler, capacidade de reagendamento e verificação de estado. Background Fetch é mais simples de implementar mas menos flexível. A Apple recomenda usar BGAppRefreshTask para novos projetos.
Não é recomendado. Background Fetch tem limite de tempo (até 30 segundos). Para descargas grandes, utilize URLSession com configuração em segundo plano — o sistema continuará a descarga mesmo após o fim do fetch. Uma alternativa é BGProcessingTask (iOS 13+), que permite até 10 minutos e condições de carregamento.
Sim, cada ativação consome energia para ligar o processador, inicializar a pilha de rede e carregar dados. O iOS otimiza a frequência para minimizar o impacto. Com uma implementação correta — carregar apenas dados novos, chamada rápida do completion handler — o impacto na bateria é mínimo.
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