ITMS-91053 "Missing API declaration": cómo añadir un privacy manifest a tu app web empaquetada para iOS
ITMS-91053 no es un veredicto de App Review. Es App Store Connect avisándote de que el código nativo de tu compilación usa una API que Apple quiere ver justificada en un privacy manifest (PrivacyInfo.xcprivacy). La solución es una pequeña lista de propiedades con códigos de motivo honestos, o una versión más reciente del SDK; tu app web no cambia en absoluto.
Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.
Garantía de aprobación – o te devolvemos el dinero en 14 días
Sin programar
Pago único, actualizaciones gratuitas
Soporte humano 24/7
Hecho en Alemania desde 2014 · ISO 27001
9:41
Tu app
Tu appYa en tu bolsillo
App Store · Google Play Aprobada
Qué significa el correo
Apple mantiene una lista de "required reason APIs" (APIs que exigen indicar un motivo): llamadas al sistema que sirven para funciones normales de una app, pero que también podrían usarse para identificar un dispositivo mediante fingerprinting. Hay cinco categorías: marcas de tiempo de archivos, tiempo de arranque del sistema, espacio en disco, teclados activos y user defaults. Cualquier app o SDK que las use debe explicar el motivo en un privacy manifest, eligiendo entre un conjunto fijo de motivos aprobados.
El correo indica dos cosas: el archivo cuyo código usa la API (el ejecutable principal de tu app o un framework dentro de la carpeta Frameworks) y las categorías de API, escritas como NSPrivacyAccessedAPICategoryUserDefaults. A principios de 2024 estos correos eran simples recordatorios; según la documentación de Apple sobre las required reason APIs, desde el 1 de mayo de 2024 no se aceptan subidas sin estas declaraciones. Por eso los hilos antiguos de los foros dicen que es "solo un aviso" y el tuyo no lo es.
Una app web empaquetada lo provoca a través del envoltorio nativo, nunca a través de tu JavaScript. Toda app de iOS guarda ajustes en user defaults, almacena archivos en caché y mide tiempos, y los SDK de push, anuncios y analítica hacen lo mismo. Los momentos típicos en que aparece: añadiste un SDK, dejaste que Cursor o Claude Code escribieran Swift personalizado, o volviste a compilar un proyecto antiguo con un Xcode actual.
Cuatro errores de subida que suelen llegar juntos
Código
Qué dice App Store Connect (resumido)
Solución
ITMS-91053 Missing API declaration
El código del archivo indicado usa una required reason API y ningún privacy manifest de ese bundle declara un motivo para ella.
Añade la categoría y un motivo aprobado al manifest del bundle que contiene el código. Si el archivo es un framework de terceros, actualiza el SDK.
ITMS-91061 Missing privacy manifest
Un SDK de la lista de SDK de uso común de Apple está en la compilación sin su propio privacy manifest.
Actualiza ese SDK a una versión que incluya un manifest. La lista incluye componentes de Firebase, OneSignal y los frameworks del SDK de Facebook, entre muchos otros.
ITMS-91065 Missing signature
Un SDK de la lista está incluido como dependencia binaria sin la firma de código del proveedor.
Usa la versión firmada del proveedor. No edites archivos dentro de un framework: eso rompe la firma.
ITMS-91056 Invalid privacy manifest
Existe un archivo PrivacyInfo.xcprivacy, pero tiene una clave, un valor o una estructura incorrectos.
Ábrelo en el editor de listas de propiedades de Xcode, compara las claves con el ejemplo de abajo y elimina erratas o códigos de motivo inventados.
Las cinco categorías y el motivo honesto para una app WebView
Elige solo motivos que describan lo que el código hace de verdad. La lista de motivos de Apple asocia condiciones a cada uno, por ejemplo que los datos nunca salgan del dispositivo.
Categoría en el correo
Motivos aprobados (Apple)
Elección habitual para una app de WebViewGold
NSPrivacyAccessedAPICategoryUserDefaults
CA92.1 datos que solo esta app lee y escribe; 1C8F.1 compartidos dentro de tu App Group; C56D.1 envoltorio de SDK (solo SDK); AC6B.1 configuración gestionada mediante MDM
CA92.1. Añade 1C8F.1 solo si la app comparte ajustes con una extensión a través de un App Group (extensión de servicio de notificaciones push, widget, extensión para compartir).
NSPrivacyAccessedAPICategoryFileTimestamp
C617.1 archivos dentro del contenedor de la app o del App Group; DDA9.1 marcas de tiempo que se muestran al usuario; 3B52.1 archivos que eligió el usuario; 0A2A.1 envoltorio de SDK (solo SDK)
C617.1 para cachés y archivos descargados en el contenedor de la app. 3B52.1 solo si el código lee metadatos de archivos que seleccionó el usuario.
NSPrivacyAccessedAPICategorySystemBootTime
35F9.1 tiempo transcurrido entre eventos y temporizadores dentro de la app; 8FFB.1 marcas de tiempo absolutas de eventos dentro de la app; 3D61.1 informe de errores opcional
35F9.1, el caso normal para temporizadores, tiempos de espera y mediciones de carga.
NSPrivacyAccessedAPICategoryDiskSpace
E174.1 comprobar el espacio antes de escribir archivos, con un comportamiento visible; 85F4.1 mostrar el espacio al usuario; 7D9E.1 informe de errores opcional; B728.1 apps de investigación de salud
E174.1 solo si la app comprueba de verdad el espacio libre antes de guardar descargas. Si no sabes explicar por qué, averigua qué código lo usa antes de declarar nada.
NSPrivacyAccessedAPICategoryActiveKeyboards
3EC4.1 apps de teclado personalizado; 54BD.1 interfaz adaptada al teclado activo
Poco habitual en una app WebView. Si el correo nombra tu propio target, busca Swift personalizado que haya añadido un agente de IA.
Con una buena versión optimizada de su aplicación web, puedes tener una impresionante aplicación móvil en un par de minutos. ¡Además del servicio al cliente es muy agradable y muy útil! ¡Puedo recomendar WebViewgold :-)
Julian Koch · Cofundador de Dueldonkey · CodeCanyon
Soluciona ITMS-91053 en un proyecto de WebViewGold
Veinte minutos en Xcode y después un nuevo número de compilación.
Lee qué archivo indica el correo
Si es el ejecutable de tu app (el nombre de tu .app), la declaración va en el manifest del target de la app. Si es una ruta como Frameworks/SomeSDK.framework, el SDK tiene que declararlo en su propio manifest, y tu archivo no puede arreglarlo.
Parte de la versión actual de WebViewGold
Las actualizaciones son gratuitas. Si tu proyecto es antiguo, descarga la versión actual, traslada los valores de Config.swift, los textos de Info.plist, los iconos y el splash, y comprueba si el error persiste antes de editar nada a mano. Las versiones nuevas pueden incluir versiones más recientes de los SDK; si tienes dudas, pregunta al soporte de WebViewGold qué versión necesitas.
Busca o crea PrivacyInfo.xcprivacy
Busca PrivacyInfo.xcprivacy en el navegador del proyecto. Si el target de la app ya tiene uno, amplíalo; nunca añadas un segundo manifest al mismo target. Si no hay ninguno, elige File, New, File from Template, selecciona App Privacy, conserva el nombre PrivacyInfo y marca el target principal de la app.
Añade un diccionario por categoría
Dentro de NSPrivacyAccessedAPITypes, añade una entrada con NSPrivacyAccessedAPIType igual a la categoría del correo y NSPrivacyAccessedAPITypeReasons con los códigos de motivo que sean ciertos para tu app. El ejemplo de abajo muestra la estructura.
Revisa cada extensión que mencione el correo
Apple espera un manifest en cada bundle cuyo ejecutable use la API. Si el correo nombra una extensión (una extensión de servicio de notificaciones, un widget, una extensión para compartir o un App Clip), dale a ese target su propio manifest con los motivos correspondientes.
Verifica, sube el número de compilación y envía
Archiva y, en el Organizer, haz control-clic en el archivo y elige Generate Privacy Report: Xcode combina todos los manifests en un PDF, así que puedes ver tus categorías en la lista. Aumenta el número de compilación, súbela y espera el correo de procesamiento antes de enviarla a revisión.
Un PrivacyInfo.xcprivacy mínimo para el target de la app
Dos categorías comunes a modo de ejemplo. Usa solo las categorías que indique tu correo y los motivos que se ajusten a tu app; conserva cualquier otra clave que ya tenga tu archivo.
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Las claves existentes como NSPrivacyTracking o NSPrivacyCollectedDataTypes se quedan como están -->
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
Mantén el manifest coherente con el resto de tu historia de privacidad
Declara motivos que coincidan con el comportamiento de la app. Un revisor o una comprobación automática que los compare con tus funciones espera que encajen.
NSPrivacyTracking forma parte de la misma historia que App Tracking Transparency. Si muestras anuncios personalizados de AdMob, lee ATT para apps web con anuncios antes de configurarlo.
El manifest no sustituye a las respuestas de App Privacy en App Store Connect. Rellénalas por separado; la guía de etiquetas de privacidad explica qué recopila una app web empaquetada.
Las cookies, el localStorage y el IndexedDB de tu app web se ejecutan dentro de WebKit, el framework propio de Apple. Declaras lo que hace el binario nativo, no lo que hace tu JavaScript.
Deja que un agente de IA prepare el cambio
Pega el correo ITMS completo donde se indica. Revisa el diff antes de compilar; el agente no debe inventar códigos de motivo. Más sobre configuraciones con agentes: configurar el proyecto de WebViewGold con Claude Code.
Prompt para Claude Code o Cursor, abierto en la carpeta del proyecto Xcode de WebViewGold
App Store Connect rechazó mi subida con el correo de abajo. Corrígelo en este proyecto iOS de WebViewGold.
1. Para cada entrada ITMS-91053, dime qué archivo nombra y si ese archivo es el target de mi app, una de mis extensiones o un framework de terceros.
2. Para mis propios targets: busca un PrivacyInfo.xcprivacy existente (no crees un segundo por target). Si no existe ninguno, crea uno que pertenezca solo a ese target.
3. Añade un diccionario NSPrivacyAccessedAPITypes por cada categoría que nombre el correo. Elige motivos solo de esta lista y justifica cada elección en una frase: UserDefaults CA92.1, 1C8F.1 (solo si se usa un App Group); FileTimestamp C617.1, DDA9.1, 3B52.1; SystemBootTime 35F9.1, 8FFB.1, 3D61.1; DiskSpace E174.1, 85F4.1, 7D9E.1; ActiveKeyboards 3EC4.1, 54BD.1. Si no encuentras código que justifique un motivo, detente y pregúntame.
4. Para frameworks de terceros: no los toques. Indica el SDK, la versión que hay en este proyecto y dime qué actualización incluiría su propio privacy manifest.
5. No cambies Config.swift, los textos de propósito de Info.plist ni ningún otro archivo.
Correo:
[pega aquí el correo ITMS completo]
Preguntas frecuentes
¿ITMS-91053 es un rechazo de App Review?
No. Es una comprobación automática que se hace al procesar la compilación, antes de que ninguna persona mire la app. La compilación no se acepta, así que App Review nunca la ve; en cuanto una compilación corregida se sube sin errores, la envías como siempre.
¿Puedo añadir todos los códigos de motivo por si acaso?
No. Cada motivo es una afirmación sobre cómo usa tu código la API y los datos, y algunos motivos están reservados para SDK o para tipos de app concretos, como la investigación de salud. Declara lo que es cierto y nada más.
¿Tengo que declarar el localStorage o las cookies que usa mi app web?
No. Tu app web se ejecuta dentro de WebKit, que es el framework del sistema de Apple. El manifest cubre el código nativo de tu binario y los SDK que incluyes con él.
Compilo con el Cloud Builder. ¿Qué hago con este correo?
En esa modalidad no editas ningún proyecto de Xcode. Envía el texto completo del correo al soporte de WebViewGold para que revisen la configuración de compilación, y no cambies tu app web; el manifest forma parte de la compilación nativa.
¿Necesito un nuevo número de compilación después de añadir el manifest?
Sí. El manifest vive dentro del bundle de la app, así que solo llega a Apple con una nueva subida. Aumenta el número de compilación, archiva y vuelve a subirla.
Tres formas de llevar tu app a las tiendas
El mismo resultado, con distinta cantidad de trabajo por tu parte. Las tres incluyen la garantía de aprobación y soporte humano 24/7.
Hazlo tú mismo
$109 por plataforma, pago único
La licencia de WebViewGold: un proyecto de Xcode o Android Studio listo para usar. Pega tu URL, define nombre e icono, activa funciones, compila y envía. Actualizaciones gratuitas para siempre.
Sin Mac, sin Xcode, sin Android Studio: configura en el navegador, compilamos ambas apps en la nube y las entregamos a App Store Connect y a Play Console.
Envíanos tu URL y tu icono. Nuestro equipo configura, compila y entrega tu app en 72 horas, en marca blanca y con los proyectos fuente. Ambas plataformas por $1,158.
Los reembolsos se conceden bajo las condiciones indicadas en nuestras FAQ: un rechazo por motivos ajenos al contenido por parte de Apple y/o Google, reclamado dentro de los 14 días posteriores a la compra.