On-Demand Resources es la tecnología de Apple para la carga diferida del contenido de la aplicación. En lugar de incluir todos los recursos en el paquete de instalación, los desarrolladores los alojan en los servidores de App Store y los solicitan según sea necesario. Según Apple ODR Guide, esto reduce el tamaño de la instalación inicial y permite añadir nuevo contenido sin actualizar la versión de la aplicación.
Puntos clave
On-Demand Resources (ODR) es un sistema de gestión de contenido integrado en iOS, tvOS y macOS. Permite al desarrollador dividir los recursos de la aplicación en obligatorios (incluidos en el paquete de instalación) y bajo demanda (almacenados en App Store y descargados cuando sea necesario).
El sistema ODR opera con tres entidades clave: etiquetas, paquetes de recursos y solicitudes. Una etiqueta es un identificador de cadena que agrupa un conjunto de archivos. Un paquete de recursos es un conjunto de datos asociado a una etiqueta. Una solicitud es una llamada programática a NSBundleResourceRequest que inicia la carga del paquete.
La carga de recursos pasa por varias etapas: inicialización de la solicitud con las etiquetas especificadas, verificación de disponibilidad en el almacenamiento local, descarga desde los servidores de Apple si está ausente, notificación a la aplicación cuando esté lista y liberación del recurso después de su uso. El sistema gestiona automáticamente el almacenamiento en caché y la eliminación de recursos no utilizados.
| Etapa | Acción del sistema | Tiempo de ejecución |
|---|---|---|
| Inicialización | Creación de NSBundleResourceRequest con una etiqueta | Instantáneo |
| Verificación de caché | Búsqueda del recurso en el almacenamiento local | 0.1–0.5 s |
| Descarga | Descarga desde CDN de Apple | Depende del tamaño |
| Notificación | Llamada al completion handler o delegado | Instantáneo |
| Liberación | Marcar el recurso como eliminable por el sistema | A solicitud de iOS |
El mecanismo ODR se basa en un servicio en segundo plano que gestiona las solicitudes de recursos desde el almacenamiento en la nube de App Store. Cuando la aplicación solicita una etiqueta, el sistema verifica si el recurso existe en la caché local. Si no es así, comienza la descarga a través de una sesión URL en segundo plano con soporte de reanudación para conexiones interrumpidas.
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()
}
}
El método conditionallyBeginAccessingResources verifica la disponibilidad del recurso en la caché sin carga inmediata. Si el indicador de disponibilidad es positivo, la aplicación continúa sin demora. Si el recurso está ausente, beginAccessingResources inicia la descarga con indicación de progreso a través de la propiedad progress.
iOS gestiona las prioridades de carga de recursos ODR según la actividad actual de la aplicación. Cuando la aplicación está en primer plano, la carga se realiza con alta prioridad. En segundo plano, iOS puede retrasar la carga o pausarla cuando la batería esté baja.
Los recursos ODR pueden incluir imágenes, videos, archivos de audio, sprites, datos de niveles y cualquier otro archivo no crítico para el inicio de la aplicación. Cada recurso está vinculado a una o más etiquetas que determinan su pertenencia a un bloque funcional.
En Xcode, las etiquetas se configuran a través del inspector Resource Tags en la pestaña Target Membership. El desarrollador especifica para cada archivo del proyecto si se incluye en el paquete principal o se carga por etiqueta. Un archivo puede pertenecer a varias etiquetas, lo que permite reutilizar recursos en diferentes secciones de la aplicación.
<!-- Ejemplo de configuración de Resource Tags en Info.plist -->
<key>NSBundleResourceRequestTags</key>
<dict>
<key>level-3</key>
<array>
<string>levels/level3.scnassets</string>
<string>textures/level3_tex.png</string>
</array>
</dict>
Apple distingue tres categorías de etiquetas ODR según el tiempo que un recurso debe permanecer en el dispositivo. Las etiquetas de instalación inicial se cargan con la aplicación y nunca son eliminadas por el sistema. El orden de precarga de etiquetas determina la secuencia de carga en segundo plano inmediatamente después de la instalación. Las etiquetas principales se solicitan bajo demanda y pueden ser eliminadas por iOS cuando falta espacio.
Además de las categorías, cada etiqueta puede tener una prioridad de descarga. Las etiquetas con prioridad alta se cargan antes que las de baja prioridad, incluso si se solicitaron después. Esto permite al desarrollador controlar el orden de aparición del contenido: primero los recursos críticos para la pantalla principal, luego los materiales adicionales para secciones profundas de la aplicación.
La configuración de ODR en Xcode incluye tres etapas: categorización de recursos por etiquetas, configuración de parámetros de descarga en Info.plist e implementación programática de solicitudes a través de NSBundleResourceRequest. La mayor parte del trabajo se realiza en el lado de la compilación.
// Verificación del estado y monitoreo del progreso de 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)% cargado")
}
}
}
El progreso de descarga se rastrea a través de la propiedad progress de la clase NSProgress con soporte de observación KVO. La aplicación puede mostrar un indicador de carga al usuario durante la descarga de recursos. Una vez completada la descarga, los recursos están disponibles en el paquete principal de la aplicación a través de los mecanismos estándar FileManager y NSDataAsset.
Las cuotas de ODR dependen de la versión de iOS. A partir de iOS 13, un dispositivo puede almacenar hasta 20 GB de recursos bajo demanda por cuenta. Este espacio se comparte entre todas las aplicaciones instaladas en el dispositivo: si una aplicación ocupa mucho espacio, queda menos para las demás.
El monitoreo del espacio utilizado se realiza a través de NSBundleResourceRequest. La aplicación puede verificar el almacenamiento ODR disponible y decidir qué recursos cargar primero en consecuencia. Se recomienda implementar un mecanismo de respaldo: si el almacenamiento ODR está lleno, usar recursos de calidad reducida del paquete principal.
Cuando se excede la cuota, el sistema elimina los recursos con etiquetas bajo demanda en orden de menor uso reciente, comenzando por los más antiguos. El administrador de recursos en el código de la aplicación puede rastrear el uso actual del almacenamiento ODR a través de la propiedad NSBundleResourceRequest.Los desarrolladores deben considerar que iOS puede decidir eliminar los recursos bajo demanda en cualquier momento: la aplicación debe manejar correctamente las situaciones en las que un recurso previamente cargado de repente no está disponible. Se recomienda interceptar los errores de acceso a recursos y volver a solicitarlos a través de beginAccessingResources. Para los recursos críticos sin los cuales la aplicación no puede funcionar, use etiquetas de instalación inicial que no son eliminadas por el sistema.
On-Demand Resources brindan al desarrollador una herramienta flexible para gestionar el tamaño de la aplicación, pero imponen una serie de limitaciones relacionadas con la disponibilidad de la red y las políticas de almacenamiento de iOS.
La principal ventaja de ODR es una reducción radical del tamaño de la instalación inicial. Los juegos con varios niveles, las aplicaciones con contenido de video o grandes conjuntos de imágenes pueden cargar contenido por partes. El usuario obtiene acceso a la funcionalidad básica de inmediato, mientras que los recursos adicionales se descargan en segundo plano.
ODR requiere una conexión constante a internet para cargar recursos en el primer acceso. Los usuarios en áreas con mala cobertura pueden experimentar retrasos y errores de descarga. Además, Apple no garantiza que los recursos descargados permanezcan en el dispositivo: cuando falta espacio, iOS puede eliminar las etiquetas bajo demanda sin previo aviso.
Preguntas frecuentes
ODR permite añadir y modificar recursos sin publicar una nueva versión en App Store. Simplemente actualice los archivos en el servidor de Apple a través de Xcode y asígnelos a las mismas etiquetas. En la próxima solicitud, la aplicación recibirá la versión más reciente del recurso. Esto es útil para contenido estacional, promociones temporales y pruebas A/B de nuevas imágenes y diseños.
El sistema elimina los recursos con etiqueta bajo demanda cuando necesita liberar espacio para otras aplicaciones. Los recursos de etiquetas de instalación inicial no se eliminan. El orden de eliminación se determina mediante el algoritmo LRU (Least Recently Used): los primeros en eliminarse son los recursos a los que no se ha accedido durante más tiempo.
Desde iOS 13, el límite total de almacenamiento ODR es de 20 GB por usuario de Apple ID. El tamaño de una sola etiqueta no debe exceder 512 MB para un rendimiento óptimo de descarga. Cuando se supera el límite, las solicitudes fallan con NSBundleResourceRequestLowDiskSpaceError.
Sí, después de la descarga, el recurso se guarda en la caché local y está disponible en modo sin conexión sin necesidad de conexión a internet. Los problemas solo surgen si iOS ha eliminado el recurso por falta de espacio y el usuario intenta acceder a él sin red.
ODR está integrado con la infraestructura de App Store: los recursos se alojan en la CDN de Apple, son gestionados por el sistema de caché y no requieren que el desarrollador configure su propio servidor. URLSession requiere infraestructura de servidor, control de versiones y gestión manual de la caché. ODR también maneja automáticamente la reanudación de descargas en caso de interrupción de la conexión.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también