8 min de lectura

Privacy manifest en iOS: cómo crear PrivacyInfo.xcprivacy y corregir ITMS-91053 e ITMS-91061

¿Te llegó un correo de Apple con ITMS-91053 o ITMS-91061? Te explicamos qué es el privacy manifest (PrivacyInfo.xcprivacy), cuándo lo necesita tu app, cómo crearlo en Xcode, qué códigos de motivo usar y cómo corregir cada error en apps nativas, Flutter, React Native y Capacitor.

Portada: Manifiesto de privacidad, corrige ITMS-91053 e ITMS-91061 en iOS, con tarjeta Privacy manifest que muestra el archivo PrivacyInfo.xcprivacy y las filas UserDefaults CA92.1, espacio en disco E

Subiste tu build, todo parecía bien y a los minutos llega un correo de Apple con un código raro: ITMS-91053: Missing API declaration o ITMS-91061: Missing privacy manifest. Mientras no los resuelvas, App Store Connect puede no aceptar tu envío a revisión. Los dos tienen que ver con el privacy manifest en iOS, el archivo PrivacyInfo.xcprivacy. En esta guía verás qué es, cuándo lo necesitas, cómo crearlo en Xcode, qué códigos de motivo usar y cómo corregir cada error sin copiar declaraciones a ciegas.

Qué es el privacy manifest en iOS

El privacy manifest (manifiesto de privacidad) es una lista de propiedades llamada exactamente PrivacyInfo.xcprivacy. Lo pueden incluir tanto tu app como los SDK de terceros que usa (frameworks, XCFrameworks o paquetes Swift). Según la documentación de Apple, registra dos cosas:

  • Los datos que recopila tu app o el SDK, y para qué los usa.
  • Las APIs de motivo obligatorio (required reason APIs) que usa en iOS, iPadOS, tvOS, visionOS y watchOS, con el motivo aprobado para cada una.

Al archivar la app, Xcode combina los manifiestos de tu app y de tus SDK en un informe de privacidad. Te sirve para llenar con precisión la sección App Privacy (las etiquetas de privacidad) de App Store Connect. No sustituye tu política de privacidad: son cosas distintas, y las dos hacen falta. Si aún no la tienes, revisa qué pide Apple en nuestra guía de política de privacidad para App Store.

Fechas clave: por qué ahora te llegan estos correos

Apple fue endureciendo el requisito por etapas:

FechaQué cambió
WWDC 2023Apple presenta los privacy manifests y las firmas de SDK
1 de mayo de 2024App Store Connect deja de aceptar apps que usan APIs de motivo obligatorio sin declararlas en su manifiesto
12 de noviembre de 2024Las apps enviadas a revisión deben tener manifiestos válidos (sin claves ni valores inesperados)
12 de febrero de 2025Las apps nuevas, o las actualizaciones que añaden un SDK de la lista de Apple, deben incluir el manifiesto de ese SDK (y su firma si es binario)

Por eso es común que una app que llevaba tiempo sin actualizarse falle justo al subir una versión nueva.

Cuándo necesita tu app un PrivacyInfo.xcprivacy

Necesitas un manifiesto en tu app si tu propio código usa alguna de estas cinco categorías de APIs de motivo obligatorio:

  • UserDefaults (NSPrivacyAccessedAPICategoryUserDefaults).
  • Marcas de tiempo de archivos (NSPrivacyAccessedAPICategoryFileTimestamp), por ejemplo stat o getattrlist.
  • Tiempo desde el arranque del sistema (NSPrivacyAccessedAPICategorySystemBootTime), por ejemplo mach_absolute_time().
  • Espacio en disco (NSPrivacyAccessedAPICategoryDiskSpace), por ejemplo statfs.
  • Teclados activos (NSPrivacyAccessedAPICategoryActiveKeyboards).

UserDefaults es casi universal, así que muchas apps nativas terminan necesitando uno.

Cada SDK debe traer su propio manifiesto. Apple lo dice claro: el manifiesto de tu app no tiene que cubrir lo que hacen los SDK que enlazas, y un SDK no puede apoyarse en el de la app. Apple publica una lista de SDK muy usados que deben traer manifiesto y firma: Firebase, Alamofire, AFNetworking, Lottie, OneSignal, Flutter y varios plugins (path_provider, shared_preferences_ios, url_launcher, image_picker_ios, webview_flutter_wkwebview), Capacitor, Cordova, hermes (React Native) y UnityFramework, entre otros.

Cómo crear el privacy manifest en Xcode paso a paso

  1. En Xcode, elige File > New > File.
  2. Baja hasta la sección Resource y selecciona App Privacy File. Pulsa Next.
  3. Marca el target de tu app en la lista de targets y pulsa Create. El archivo se llamará PrivacyInfo.xcprivacy; no le cambies el nombre.
  4. Abre el archivo y añade las claves que apliquen. Para ver los nombres reales, usa Editor > Raw Keys and Values:
    • NSPrivacyTracking: true solo si usas datos para rastreo según App Tracking Transparency.
    • NSPrivacyTrackingDomains: dominios de rastreo (solo si el anterior es true).
    • NSPrivacyCollectedDataTypes: tipos de datos que recopilas y su propósito.
    • NSPrivacyAccessedAPITypes: categorías de APIs de motivo obligatorio y sus motivos.
  5. Comprueba que el archivo quede en Copy Bundle Resources. En iOS debe terminar en la raíz del .app (MiApp.app/PrivacyInfo.xcprivacy).

Un ejemplo mínimo para una app que solo guarda sus propias preferencias con UserDefaults:

<?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>
  <key>NSPrivacyTracking</key>
  <false/>
  <key>NSPrivacyAccessedAPITypes</key>
  <array>
    <dict>
      <key>NSPrivacyAccessedAPIType</key>
      <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <array>
        <string>CA92.1</string>
      </array>
    </dict>
  </array>
</dict>
</plist>

Úsalo solo como referencia: cada código es una declaración sobre lo que hace tu app.

Códigos de motivo más usados

CategoríaCódigoCuándo aplica (resumen de la documentación de Apple)
UserDefaultsCA92.1Leer y escribir datos que solo usa tu propia app
UserDefaults1C8F.1Compartir datos dentro del mismo App Group
Marcas de tiempoC617.1Metadatos de archivos dentro del contenedor de la app
Arranque del sistema35F9.1Medir tiempo entre eventos o manejar temporizadores
Espacio en discoE174.1Comprobar si hay espacio para escribir o borrar archivos

Los códigos que Apple reserva para SDK de terceros (como C56D.1 o 0A2A.1) no van en el manifiesto de tu app.

Cómo corregir ITMS-91053 (Missing API declaration)

Este correo dice que Apple detectó una categoría de API de motivo obligatorio sin motivo declarado.

  1. Lee la categoría que menciona el correo (por ejemplo, NSPrivacyAccessedAPICategoryUserDefaults).
  2. Actualiza tus dependencias primero. Muchas advertencias desaparecen cuando cada SDK trae su manifiesto.
  3. Si el uso está en tu propio código, añade esa categoría a tu PrivacyInfo.xcprivacy con el motivo que describe tu uso real.
  4. Vuelve a archivar y sube un build nuevo con un número de build mayor.

Cómo corregir ITMS-91061 (Missing privacy manifest)

Aquí el problema no es tu código: el correo nombra un framework (por ejemplo Frameworks/Flutter.framework/Flutter) de un SDK de la lista de Apple que no trae manifiesto.

  1. Identifica el SDK en la ruta del correo.
  2. Actualízalo a una versión que incluya PrivacyInfo.xcprivacy. En CocoaPods, revisa la versión resuelta en Podfile.lock después de pod update.
  3. Si el SDK está abandonado, reemplázalo o elimínalo. Copiar sus declaraciones a tu manifiesto no resuelve el requisito del SDK.
  4. Vuelve a archivar y sube.

Si tu app es Flutter, React Native o Capacitor

  • Flutter: ejecuta flutter upgrade y flutter pub upgrade, luego pod update en ios/. El equipo de Flutter explica que una versión de Flutter anterior a los manifiestos no puede pasar este requisito. Más detalles en nuestra guía para subir una app Flutter a App Store.
  • React Native / Expo y Capacitor: actualiza el framework y los plugins nativos. Capacitor documenta cómo crear el manifiesto de la app si usas plugins como Preferences, que usa UserDefaults.

Errores frecuentes y cómo validar el manifiesto

  • Manifiesto inválido. Si un valor tiene el tipo equivocado (por ejemplo, un texto donde va un booleano) o un código no coincide con su categoría, App Store Connect rechaza el envío. Valida el archivo en Terminal con plutil -lint PrivacyInfo.xcprivacy.
  • NSPrivacyTracking en false con dominios cargados. Si no rastreas, quita NSPrivacyTrackingDomains.
  • El archivo no está en el target. Si no se copia al bundle, para Apple no existe.
  • Copiar un manifiesto genérico. Declarar motivos que no usas es declarar algo falso.

Para revisar todo junto, archiva con Product > Archive, haz Control‑clic en el archivo en el Organizer y elige Generate Privacy Report. Si generas el .ipa desde la terminal, nuestra guía para generar un IPA en Xcode te ayuda a repetir el proceso.

Si el build sigue sin aparecer después de subirlo, revisa por qué un build no aparece en TestFlight.

Preguntas frecuentes

¿Qué es PrivacyInfo.xcprivacy?

Es el archivo del privacy manifest. Declara qué datos recopila tu app o SDK y por qué usa ciertas APIs sensibles.

¿Es obligatorio el privacy manifest?

Sí, si tu app usa APIs de motivo obligatorio (desde mayo de 2024) o incluye un SDK de la lista de Apple (desde febrero de 2025 para apps nuevas y para actualizaciones que añaden ese SDK).

¿Dónde se pone el privacy manifest en iOS?

En los recursos del target. Xcode lo copia a la raíz del bundle de la app.

¿Hay un generador de privacy manifest?

Existen herramientas de terceros, pero ninguna sabe por qué tu app usa cada API. Revisa siempre los códigos en la documentación de Apple.

¿El privacy manifest reemplaza la política de privacidad?

No. Sigues necesitando una URL de política de privacidad y llenar App Privacy en App Store Connect.

Prepara tu envío con AppConsol

El manifiesto es uno de los últimos obstáculos técnicos antes de enviar. Lo demás lo puedes dejar listo gratis con AppConsol: tu política de privacidad en minutos y las capturas con el generador de screenshots para iOS. Así, cuando el build pase, tu ficha ya estará lista.

Sigue aprendiendo