Privacy Manifest (PrivacyInfo.xcprivacy) es un archivo que todas las aplicaciones y SDK de terceros deben incluir en la compilación de iOS a partir de la primavera de 2024. Apple exige declarar las razones del uso de API protegidas (Required Reason API) y los tipos de datos recopilados. Según la Documentación para desarrolladores de Apple, cada binario dentro de la aplicación — destino principal, frameworks, dependencias de Swift Package Manager — debe contener su propio Privacy Manifest.
Puntos clave
Privacy Manifest es un archivo PrivacyInfo.xcprivacy en formato property list (XML) que declara qué tipos de datos recopila la aplicación y por qué utiliza ciertas API. Apple introdujo los manifiestos como parte de una iniciativa para aumentar la transparencia de la privacidad, similar a Privacy Nutrition Label, pero a nivel de código y binario.
El propósito principal del manifiesto es documentar el uso de las llamadas Required Reason API. Estas son categorías de API que pueden utilizarse para la toma de huella digital del dispositivo (fingerprinting), por lo que cada uso debe ir acompañado de una declaración de un motivo específico de la lista aprobada por Apple.
A partir del 1 de mayo de 2024, Apple rechaza las compilaciones que no contengan Privacy Manifest. Esto se aplica tanto a los destinos principales de la aplicación como a todos los SDK y dependencias integrados. Según WWDC 2023, el manifiesto es obligatorio para todas las aplicaciones distribuidas a través de App Store.
El manifiesto debe estar presente en cada binario, no solo en la aplicación principal, sino también en cada framework y biblioteca estática. Si un SDK de terceros no proporcionó un manifiesto, el desarrollador debe agregarlo manualmente o contactar al proveedor del SDK para obtener una actualización.
Antes de los manifiestos, los desarrolladores podían utilizar extensas API del sistema (acceso al sistema de archivos, fecha/hora, registros del sistema) sin una explicación transparente del propósito de uso. Esto creaba un riesgo de fuga de datos a través de SDK de terceros que podían recopilar información sin el conocimiento del desarrollador.
Según Mysk Inc. (2023), muchos SDK populares utilizaban API para la toma de huella digital del dispositivo sin necesidad explícita — por ejemplo, leyendo el tiempo de actividad para determinar la zona horaria o escaneando directorios para recopilar metadatos. Privacy Manifest obliga a declarar cada una de esas acciones.
Además de Required Reason API, el manifiesto incluye la sección NSPrivacyTracking — un indicador que señala si la aplicación usa rastreo (requiere ATT), y NSPrivacyCollectedDataTypes — una lista de tipos de datos recopilados en formato Privacy Nutrition Label.
Privacy Nutrition Label es una representación para el usuario en la página de la aplicación en App Store, que muestra qué datos recopila la aplicación. Privacy Manifest es un archivo técnico dentro del binario que Apple verifica automáticamente. Si los datos en el manifiesto no coinciden con las etiquetas en App Store Connect, Apple rechaza la compilación.
Por lo tanto, el manifiesto es la fuente de verdad para el sistema de verificación de Apple. Las etiquetas de privacidad se generan automáticamente a partir de él, pero el desarrollador debe mantener ambas representaciones actualizadas. Cambiar el manifiesto después de la publicación requiere enviar una nueva compilación para revisión.
El archivo PrivacyInfo.xcprivacy utiliza el formato property list con un tipo raíz Dictionary. Las principales claves de nivel superior son: NSPrivacyTracking (Boolean), NSPrivacyTrackingDomains (Array), NSPrivacyCollectedDataTypes (Array), NSPrivacyAccessedAPITypes (Array).
La clave NSPrivacyTracking — un valor booleano que indica si la aplicación aplica rastreo (requiere ATT). Si es true, también debe especificar NSUserTrackingUsageDescription en Info.plist. La clave NSPrivacyTrackingDomains — un array de dominios donde se aplica el rastreo.
La clave NSPrivacyCollectedDataTypes — un array de diccionarios, cada uno describe un tipo de datos recopilados: categoría (NSPrivacyCollectedDataType), vinculación (NSPrivacyCollectedDataLinked), propósito (NSPrivacyCollectedDataTypePurposes). Los propósitos incluyen: publicidad de terceros, análisis, desarrollo de producto y personalización de contenido.
La clave NSPrivacyAccessedAPITypes — un array de diccionarios para cada categoría de Required Reason API: categoría (NSPrivacyAccessedAPITypeReasons) — un motivo específico de la lista aprobada por Apple, y NSPrivacyAccessedAPIType — el identificador de la categoría de API.
<!-- PrivacyInfo.xcprivacy -->
<?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>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
Los tipos de datos se dividen en varias categorías: información de contacto (nombre, correo electrónico, teléfono), finanzas (datos de pago), identificadores (IDFA, ID de usuario), datos de uso (registros, clics), diagnóstico (registros de fallos) y contenido del usuario (fotos, videos, archivos). Cada categoría se marca adicionalmente como «vinculada al usuario» o «no vinculada».
Vinculada significa que los datos están relacionados con la cuenta del usuario; no vinculada significa que los datos están agregados o anonimizados. Esta marca afecta cómo Apple muestra la etiqueta de privacidad: los datos vinculados se marcan en amarillo, los no vinculados en verde.
Apple ha identificado varias categorías de API, cada uso de las cuales debe ir acompañado de un motivo específico de la lista aprobada. Un motivo es un código único, por ejemplo C617.1 o 35F9.1, que se corresponde con un propósito específico permitido por Apple.
La categoría NSPrivacyAccessedAPICategoryFileTimestamp incluye API para acceder a marcas de tiempo de archivos (creationDate, modificationDate). Motivos: C617.1 (sincronización de archivos), 3B52.1 (copia de seguridad), 0A2A.1 (antifraude).
La categoría NSPrivacyAccessedAPICategoryDiskSpace incluye API para verificar el espacio libre en disco (NSFileManager. Verificaciones (NSFileManager). Motivos: E174.1 (gestión de caché), 85F4.1 (descarga de contenido), B728.1 (diagnóstico).
La categoría NSPrivacyAccessedAPICategorySystemBootTime incluye API de acceso al tiempo de inicio del sistema (uptime). Solo un motivo: 35F9.1 (medición del tiempo de sesión para análisis). Cualquier otro uso se considera fingerprinting.
Cada categoría tiene de 1 a 5 motivos aprobados. El desarrollador debe elegir el motivo que mejor se corresponda con el uso real de la API. Proporcionar un motivo inexacto puede conllevar el rechazo de la compilación o la suspensión de la cuenta.
A partir del 1 de mayo de 2024, todos los SDK de terceros — tanto binarios como de código abierto — deben incluir un Privacy Manifest en su paquete. Apple verifica los manifiestos de todas las dependencias, y si al menos un SDK no tiene manifiesto, la compilación será rechazada.
Los SDK principales (Firebase, Adjust, AppsFlyer, Facebook SDK) ya han actualizado sus paquetes. Si su proyecto utiliza un SDK poco conocido, verifique su versión y, si es necesario, actualícelo o contacte al desarrollador. Una solución temporal es agregar un manifiesto para el SDK manualmente en el proyecto, pero no se recomienda debido a discrepancias durante las actualizaciones.
Puede crear PrivacyInfo.xcprivacy a través de la plantilla integrada en Xcode 15+ o manualmente. Consideremos ambas opciones.
Xcode 15 incluye una plantilla Privacy Manifest: File → New → File → Resource → Privacy Manifest. Xcode crea un archivo con la estructura básica y completa NSPrivacyTracking y arrays vacíos para API y datos. Después de la creación, debe especificar manualmente los motivos para cada Required Reason API utilizada.
La plantilla agrega automáticamente el archivo al destino principal. Si el proyecto tiene múltiples destinos (Extensions, Watch app), debe agregar el manifiesto a cada uno. Xcode no verifica la presencia del manifiesto en las dependencias en tiempo de compilación, solo en la etapa de archivado.
// AppDelegate: verificación del manifiesto en etapa de desarrollo
import Foundation
func validatePrivacyManifest() {
guard let path = Bundle.main.path(
forResource: "PrivacyInfo", ofType: "xcprivacy"
) else {
print("PrivacyInfo.xcprivacy no encontrado")
return
}
guard let dict = NSDictionary(contentsOfFile: path)
else { return }
print("Privacy manifest loaded: \(dict.count) keys")
}
Puede crear PrivacyInfo.xcprivacy manualmente como un archivo XML property list común. Para ello, cree un archivo con el nombre PrivacyInfo.xcprivacy, escriba el encabezado plist estándar y agregue un diccionario raíz con las claves necesarias. Asegúrese de que el archivo esté agregado al destino (Target Membership).
El método manual es útil cuando necesita agregar un manifiesto a una biblioteca estática o dependencia de Package Manager sin usar la interfaz de Xcode. Después de la compilación, verifique que el archivo esté incluido en el binario mediante el comando nm o el archivado.
Antes de enviar la compilación a App Store, debe verificar que Privacy Manifest sea correcto y completo. Apple proporciona varias herramientas de validación.
Al archivar un proyecto (Product → Archive), Xcode realiza la validación del manifiesto. Si se encuentra un error — manifiesto faltante, motivo incorrecto, categoría vacía — el archivado falla con un error. El registro de errores se muestra en el Issue navigator, indicando el SDK problemático y la categoría de API.
Se realiza una validación adicional en App Store Connect al cargar la compilación. Si la validación falla, la compilación es rechazada con un correo electrónico automático que contiene el identificador de la API problemática y la corrección recomendada.
Para automatizar la validación, use scripts que analicen el binario en busca de uso de Required Reason API. Apple proporciona la herramienta libtool y scripts de verificación de símbolos, pero la comunidad ha desarrollado utilidades más convenientes.
# Búsqueda de uso de API FileTimestamp en el binario
nm MyApp.app/MyApp | grep "NSFileCreationDate"
# Verificación de presencia de PrivacyInfo.xcprivacy en la aplicación
find MyApp.app -name "*.xcprivacy"
El error más común es la falta de un manifiesto en uno de los SDK. Incluso si el destino principal contiene un manifiesto, Apple verifica cada binario individualmente. El segundo más común es un código de motivo incorrecto: usar un motivo para una categoría de API con una API de otra categoría.
El tercer error es la declaración excesiva de API que en realidad no se utilizan. Los desarrolladores agregan todos los motivos posibles «por si acaso», lo que alerta a los revisores de Apple. Agregue solo las categorías que realmente se utilizan. Use el analizador estático de Xcode para verificar.
Preguntas frecuentes
A partir del 1 de mayo de 2024, Apple rechaza cualquier compilación sin manifiesto. El error ocurre en la etapa de carga en App Store Connect. Las aplicaciones antiguas no se bloquean, pero las actualizaciones requieren la inclusión obligatoria del manifiesto.
Sí, el manifiesto es obligatorio para todas las plataformas Apple: iOS, iPadOS, macOS, tvOS, watchOS y visionOS. Los requisitos de Required Reason API son uniformes en todas las plataformas, aunque los conjuntos de API pueden diferir ligeramente.
Si el SDK no proporcionó un manifiesto, cree un archivo PrivacyInfo.xcprivacy separado y agréguelo al grupo del SDK en el proyecto. Especifique los motivos para las API que utiliza este SDK según la documentación del SDK.
Sí. Durante la verificación automática, Apple compara los motivos declarados con las llamadas reales a la API. La discrepancia conduce al rechazo. Durante la revisión manual, el revisor puede solicitar aclaraciones.
Sí, Apple verifica los manifiestos de todas las dependencias, incluido SPM. Los proveedores de paquetes deben incluir PrivacyInfo.xcprivacy en sus repositorios. Xcode advierte sobre manifiestos faltantes durante el archivado.
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