On-Demand Resources é a tecnologia da Apple para carregamento diferido do conteúdo do aplicativo. Em vez de incluir todos os recursos no pacote de instalação, os desenvolvedores os hospedam nos servidores da App Store e os solicitam conforme necessário. De acordo com Apple ODR Guide, isso reduz o tamanho da instalação inicial e permite adicionar novo conteúdo sem atualizar a versão do aplicativo.
Pontos principais
On-Demand Resources (ODR) é um sistema de gerenciamento de conteúdo integrado ao iOS, tvOS e macOS. Ele permite que o desenvolvedor divida os recursos do aplicativo em obrigatórios (incluídos no pacote de instalação) e sob demanda (armazenados na App Store e baixados quando necessário).
O sistema ODR opera com três entidades principais: tags, pacotes de recursos e solicitações. Uma tag é um identificador de string que agrupa um conjunto de arquivos. Um pacote de recursos é um conjunto de dados associado a uma tag. Uma solicitação é uma chamada programática para NSBundleResourceRequest que inicia o carregamento do pacote.
O carregamento de recursos passa por várias etapas: inicialização da solicitação com as tags especificadas, verificação de disponibilidade no armazenamento local, download dos servidores da Apple se ausente, notificação ao aplicativo quando pronto e liberação do recurso após o uso. O sistema gerencia automaticamente o cache e a remoção de recursos não utilizados.
| Etapa | Ação do sistema | Tempo de execução |
|---|---|---|
| Inicialização | Criação de NSBundleResourceRequest com uma tag | Instantâneo |
| Verificação de cache | Busca do recurso no armazenamento local | 0.1–0.5 s |
| Download | Download da CDN da Apple | Depende do tamanho |
| Notificação | Chamada ao completion handler ou delegado | Instantâneo |
| Liberação | Marcação do recurso como removível pelo sistema | Sob solicitação do iOS |
O mecanismo ODR é baseado em um serviço em segundo plano que gerencia as solicitações de recursos do armazenamento em nuvem da App Store. Quando o aplicativo solicita uma tag, o sistema verifica se o recurso existe no cache local. Se não — ele inicia o download através de uma sessão URL em segundo plano com suporte a retomada para conexões interrompidas.
import Foundation
class ResourceManager {
let odrRequest = NSBundleResourceRequest(tags: ["level-3"])
func loadLevel3() {
odrRequest.conditionallyBeginAccessingResources { available in
if available {
self.startLevel3()
} else {
self.odrRequest.beginAccessingResources { error in
guard error == nil else { return }
self.startLevel3()
}
}
}
}
func releaseResources() {
odrRequest.endAccessingResources()
}
}
O método conditionallyBeginAccessingResources verifica a disponibilidade do recurso no cache sem carregamento imediato. Se o indicador de disponibilidade for positivo — o aplicativo continua sem atraso. Se o recurso estiver ausente, beginAccessingResources inicia o download com indicação de progresso através da propriedade progress.
O iOS gerencia as prioridades de carregamento de recursos ODR com base na atividade atual do aplicativo. Quando o aplicativo está em primeiro plano, o carregamento é realizado com alta prioridade. Em segundo plano, o iOS pode atrasar o carregamento ou pausá-lo quando a bateria estiver baixa.
Os recursos ODR podem incluir imagens, vídeos, arquivos de áudio, sprites, dados de níveis e qualquer outro arquivo não crítico para a inicialização do aplicativo. Cada recurso está vinculado a uma ou mais tags que determinam sua pertinência a um bloco funcional.
No Xcode, as tags são configuradas através do inspetor Resource Tags na aba Target Membership. O desenvolvedor especifica para cada arquivo do projeto se ele está incluído no pacote principal ou é carregado por tag. Um arquivo pode pertencer a várias tags, permitindo a reutilização de recursos em diferentes seções do aplicativo.
<!-- Exemplo de configuração de Resource Tags no Info.plist -->
<key>NSBundleResourceRequestTags</key>
<dict>
<key>level-3</key>
<array>
<string>levels/level3.scnassets</string>
<string>textures/level3_tex.png</string>
</array>
</dict>
A Apple distingue três categorias de tags ODR com base em quanto tempo um recurso deve permanecer no dispositivo. As tags de instalação inicial são carregadas com o aplicativo e nunca são excluídas pelo sistema. A ordem de pré-carregamento de tags determina a sequência de carregamento em segundo plano imediatamente após a instalação. As tags principais são solicitadas sob demanda e podem ser excluídas pelo iOS quando o espaço está baixo.
Além das categorias, cada tag pode ter uma prioridade de download. Tags com prioridade alta são carregadas antes das de baixa prioridade, mesmo se forem solicitadas depois. Isso permite ao desenvolvedor controlar a ordem de aparecimento do conteúdo: primeiro os recursos críticos para a tela principal, depois os materiais adicionais para seções profundas do aplicativo.
A configuração do ODR no Xcode inclui três etapas: categorização de recursos por tags, configuração de parâmetros de download no Info.plist e implementação programática de solicitações via NSBundleResourceRequest. A maior parte do trabalho é feita no lado da compilação.
// Verificação de status e monitoramento de progresso do ODR
func monitorODRProgress(tag: String) {
let request = NSBundleResourceRequest(tags: [tag])
let observer = request.progress.observe(\.fractionCompleted) { progress, _ in
DispatchQueue.main.async {
let percent = Int(progress.fractionCompleted * 100)
print("ODR: \(percent)% carregado")
}
}
}
O progresso do download é rastreado através da propriedade progress da classe NSProgress com suporte a observação KVO. O aplicativo pode exibir um indicador de carregamento ao usuário durante o download dos recursos. Após a conclusão do download, os recursos estão disponíveis no pacote principal do aplicativo através dos mecanismos padrão FileManager e NSDataAsset.
As cotas de ODR dependem da versão do iOS. A partir do iOS 13, um dispositivo pode armazenar até 20 GB de recursos sob demanda por conta. Este espaço é compartilhado entre todos os aplicativos instalados no dispositivo — se um aplicativo ocupar muito espaço, sobra menos para os outros.
O monitoramento do espaço usado é feito através do NSBundleResourceRequest. O aplicativo pode verificar o armazenamento ODR disponível e decidir quais recursos carregar primeiro de acordo. Recomenda-se implementar um mecanismo de fallback: se o armazenamento ODR estiver cheio, use recursos de qualidade reduzida do pacote principal.
Quando a cota é excedida, o sistema remove os recursos com tags sob demanda na ordem de menor uso recente, começando pelos mais antigos. O gerenciador de recursos no código do aplicativo pode rastrear o uso atual do armazenamento ODR através da propriedade NSBundleResourceRequest.Os desenvolvedores devem considerar que o iOS pode decidir excluir recursos sob demanda a qualquer momento — o aplicativo deve lidar corretamente com situações em que um recurso previamente carregado de repente se torna indisponível. Recomenda-se interceptar erros de acesso a recursos e solicitá-los novamente através de beginAccessingResources. Para recursos críticos sem os quais o aplicativo não pode funcionar, use tags de instalação inicial que não são removidas pelo sistema.
On-Demand Resources oferecem ao desenvolvedor uma ferramenta flexível para gerenciar o tamanho do aplicativo, mas impõem uma série de limitações relacionadas à disponibilidade de rede e às políticas de armazenamento do iOS.
A principal vantagem do ODR é a redução radical do tamanho da instalação inicial. Jogos com vários níveis, aplicativos com conteúdo de vídeo ou grandes conjuntos de imagens podem carregar conteúdo em partes. O usuário obtém acesso à funcionalidade básica imediatamente, enquanto os recursos adicionais são baixados em segundo plano.
O ODR requer uma conexão constante com a internet para carregar recursos no primeiro acesso. Usuários em áreas com cobertura fraca podem enfrentar atrasos e erros de download. Além disso, a Apple não garante que os recursos baixados permaneçam no dispositivo — quando o espaço está baixo, o iOS pode excluir tags sob demanda sem aviso prévio.
Perguntas frequentes
ODR permite adicionar e modificar recursos sem publicar uma nova versão na App Store. Basta atualizar os arquivos no servidor da Apple através do Xcode e atribuí-los às mesmas tags. Na próxima solicitação, o aplicativo receberá a versão mais recente do recurso. Isso é útil para conteúdo sazonal, promoções temporárias e testes A/B de novas imagens e layouts.
O sistema exclui recursos com tag sob demanda quando precisa liberar espaço para outros aplicativos. Os recursos de tags de instalação inicial não são excluídos. A ordem de exclusão é determinada pelo algoritmo LRU (Least Recently Used) — os primeiros a serem excluídos são os recursos que não foram acessados por mais tempo.
Desde o iOS 13, o limite total de armazenamento ODR é de 20 GB por usuário Apple ID. O tamanho de uma única tag não deve exceder 512 MB para um desempenho de download ideal. Quando o limite é excedido, as solicitações falham com NSBundleResourceRequestLowDiskSpaceError.
Sim, após o download, o recurso é salvo no cache local e está disponível em modo offline sem conexão com a internet. Os problemas só surgem se o iOS excluiu o recurso devido à falta de espaço e o usuário tenta acessá-lo sem rede.
ODR está integrado com a infraestrutura da App Store: os recursos são hospedados na CDN da Apple, gerenciados pelo sistema de cache e não exigem que o desenvolvedor configure seu próprio servidor. URLSession requer infraestrutura de servidor, controle de versão e gerenciamento manual de cache. ODR também lida automaticamente com a retomada de download em caso de interrupção da conexão.
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