Privacidad y declaraciones
Propósito
Respuestas de privacidad veraces y coherentes en ambas tiendas, respaldadas por evidencia del código. La mayoría de los rechazos por privacidad se deben a inconsistencias: la política dice una cosa, la aplicación hace otra, el formulario dice una tercera.
Requisitos previos
- Acceso al código fuente (aplicación y backend) y a los archivos de bloqueo (
pubspec.lock,Podfile.lock, dependencias de Gradle,package.json). - La política de privacidad y los términos actuales.
- Conocimiento de cada endpoint del backend y servicio de terceros que recibe datos del usuario.
1. Construir el inventario de datos (a partir del código, no de la memoria)
Ejecute scripts/scan-sdks.mjs en la raíz del repositorio. Enumera los SDK conocidos de los archivos de bloqueo con las categorías de datos que suelen tocar, y busca el uso de API de motivo requerido, cadenas de permisos, ID de publicidad y API de seguimiento. Luego complete el inventario leyendo la capa de red y el backend:
| Dato | Fuente (pantalla / SDK) | ¿Enviado fuera del dispositivo? ¿A quién? | ¿Vinculado al usuario? | Propósito | Retención | ¿Opcional? |
|---|
Reglas:
- "Procesado solo en el dispositivo" significa que nunca se envía, incluso a su propio servidor. Si se sincroniza con su backend, se recopila.
- Sus procesadores (alojamiento, proveedor de IA que actúa según sus instrucciones, SDK de pago) aún "recopilan"; si cuentan como "compartidos" difiere según la tienda (abajo).
- Los informes de fallos anónimos y los recuentos de uso aún se recopilan (Diagnósticos / Datos de uso), generalmente "no vinculados".
Guarde el inventario como docs/privacy-inventory.md. Cada respuesta a continuación cita una fila.
2. Privacidad de la aplicación Apple (App Store Connect > Privacidad de la aplicación)
- Asigne cada fila del inventario a las categorías de Apple (Información de contacto, Salud y estado físico, Contenido del usuario, Identificadores, Compras, Datos de uso, Diagnósticos…), propósitos, vinculados vs no vinculados, y seguimiento.
- Seguimiento = vincular sus datos con datos de terceros para publicidad dirigida o medición de anuncios, o compartir con corredores de datos. Sin SDK de anuncios ni corredor de datos generalmente significa "Sin seguimiento" y sin solicitud de ATT.
- La divulgación opcional aplica solo cuando se cumplen todas las condiciones de Apple (poco frecuente, opcional, iniciado por el usuario cada vez, no es seguimiento/publicidad). Rara vez aplica a las funciones de la aplicación.
- Documentos: Detalles de privacidad de la aplicación.
3. Seguridad de datos de Google Play (Política > Contenido de la aplicación > Seguridad de datos)
- Mismo inventario, taxonomía de Play (Información personal, Salud y estado físico, Fotos y videos, Mensajes, Actividad de la aplicación, Información y rendimiento de la aplicación, ID del dispositivo u otros, Información financiera…).
- Compartir excluye las transferencias a proveedores de servicios que procesan en su nombre; un SDK que crea perfiles de anuncios entre clientes está compartiendo.
- Efímero: procesado solo en memoria, no almacenado, solo para la solicitud en tiempo real (por ejemplo, una foto analizada y descartada).
- Use Exportar a CSV / Importar desde CSV: mantenga el CSV en el repositorio (
store/data-safety.csv) para que los cambios se revisen como código. La importación sobrescribe todas las respuestas. - Documentos: Seguridad de datos.
4. Otras declaraciones de Play
- Declaración de aplicaciones de salud: cada aplicación debe completarla, incluso sin funciones de salud. Documentos.
- Health Connect: una justificación por permiso; solicite solo los permisos que usa una función visible; una actividad de justificación (
ACTION_SHOW_PERMISSIONS_RATIONALE) que enlace a la política. Play puede solicitar una grabación de pantalla del flujo. - ID de publicidad: declare si lo usa. Si no hay SDK de anuncios/atribución, declare "No" y asegúrese de que ninguna dependencia agregue
com.google.android.gms.permission.AD_ID(verifique el manifiesto fusionado; elimínelo contools:node="remove"si se agregó). - Público objetivo, clasificación de contenido (IARC), anuncios, acceso a la aplicación, noticias, funciones financieras, gobierno: responda desde el inventario. Si alguna parte está detrás de inicio de sesión, proporcione credenciales de revisor en Acceso a la aplicación.
- Eliminación de cuenta: consulte la sección 8.
5. Manifiesto de privacidad (iOS)
- Agregue
PrivacyInfo.xcprivacyal destino de la aplicación (plantilla: templates/PrivacyInfo.xcprivacy). - Declare
NSPrivacyTracking,NSPrivacyTrackingDomains,NSPrivacyCollectedDataTypes(coherente con Privacidad de la aplicación) yNSPrivacyAccessedAPITypespara cada categoría de API de motivo requerido que el código propio de la aplicación usa: marca de tiempo de archivo, tiempo de inicio del sistema, espacio en disco, teclados activos, UserDefaults. Elija los códigos de motivo aprobados de la lista de Apple. Las aplicaciones Flutter usan UserDefaults a través de complementos comoshared_preferences— verifique que cada complemento incluya su propio manifiesto; agregue lo que usan su código y los complementos sin manifiestos. - Después de compilar, inspeccione el correo electrónico de App Store Connect / las advertencias de compilación en busca de motivos de manifiesto faltantes.
- Documentos: Archivos de manifiesto de privacidad, API de motivo requerido.
6. Cumplimiento de exportación (iOS)
ITSAppUsesNonExemptEncryptionen Info.plist:falsees apropiado cuando la aplicación no usa cifrado o solo usa cifrado exento (por ejemplo, HTTPS a través del sistema operativo, algoritmos estándar usados solo para proteger los datos propios del usuario en una aplicación cuya función principal no es la seguridad). Configurarlo omite las preguntas por compilación.- Si implementa o incluye criptografía propietaria, o el cifrado es una función principal, responda las preguntas en su lugar y verifique si corresponde la documentación o un informe de autoclaficación anual.
- Esta es una clasificación legal; si no está seguro, consulte a un asesor de cumplimiento comercial. Documentos: Cumplimiento de las regulaciones de exportación de cifrado.
7. Clasificación por edades
- Responda el cuestionario actual de Apple y el cuestionario IARC de Play de manera veraz, incluyendo preguntas sobre temas de salud/bienestar, chat de IA o contenido generado, contenido generado por el usuario y acceso web sin restricciones.
- Mantenga la clasificación coherente con la edad mínima de sus Términos y cualquier puerta de edad dentro de la aplicación. Si el resultado del cuestionario es inferior a la edad mínima de sus Términos, use la opción de la tienda para establecer una clasificación más alta en lugar de dejar una discrepancia.
8. Eliminación de cuenta
- En la aplicación: si los usuarios pueden crear una cuenta, pueden iniciar la eliminación dentro de la aplicación (configuración de la cuenta). La desactivación por sí sola no es suficiente. También cuentas de invitados/creadas automáticamente. Se permite la reautenticación o confirmación, pero no debe ser innecesariamente difícil. Apple: Ofrecer eliminación de cuenta.
- URL web (Play): una página, accesible sin la aplicación o inicio de sesión, que nombre la aplicación como en el listado, explique cómo solicitar la eliminación, qué se elimina y qué se retiene (y por qué), y cualquier paso previo (cancelar la suscripción). Documentos: Eliminación de cuenta en Play.
- Suscripciones: eliminar la cuenta no cancela una suscripción de la tienda. Advierta en la hoja de eliminación y enlace a la gestión de suscripciones de la tienda.
- Iniciar sesión con Apple: revoque los tokens del usuario a través de la API REST de Iniciar sesión con Apple al eliminar.
- Terceros: elimine al usuario también en los procesadores (por ejemplo, el cliente de RevenueCat, identificadores de análisis/fallos, listas de correo).
- Implementación de reautenticación: si agrega un requisito de reautenticación al endpoint de eliminación, envíe la aplicación que maneja la nueva respuesta al mismo tiempo que el cambio en el backend, o mantenga el comportamiento antiguo para versiones antiguas de la aplicación.
- Use una redacción para la ruta en todas partes (aplicación, política, formularios de la tienda, página web), por ejemplo, "Perfil > Eliminar cuenta".
9. Funciones de IA
- Apple 5.1.2(i): divulgue dónde se comparten datos personales con terceros, incluyendo IA de terceros, y obtenga permiso explícito primero.
- Antes del primer uso de una función de IA: una hoja de consentimiento breve que nombre al proveedor y su rol ("procesado por para generar la respuesta"), qué se envía, que no se usa para entrenar modelos (solo si los términos del proveedor lo dicen para su plan), y la retención (del proveedor y la suya). Un interruptor en la configuración para retirar el consentimiento.
- Redacción de la política: el proveedor de IA actúa como un procesador/proveedor de servicios según sus instrucciones; enumere con ubicación y retención.
- Formularios de la tienda: las entradas de IA (mensajes, fotos, texto) son datos recopilados (Contenido del usuario); generalmente no "compartidos" en Play cuando el proveedor es un procesador.
- Considere: una línea de "no es asesoramiento profesional" en las respuestas de IA sobre salud o finanzas, y una respuesta segura definida para temas de crisis.
10. Datos de salud
- Nunca envíe datos de HealthKit / Health Connect a proveedores de IA u otros terceros. Apple (5.1.3) restringe el uso y la divulgación de datos de salud; la política de Health Connect también restringe las transferencias. El diseño más simple y conforme: los datos leídos de Apple Health / Health Connect permanecen en el dispositivo (o solo en el almacenamiento de la cuenta del usuario, divulgado), y las funciones que llaman a una IA usan solo datos que el usuario escribió en su aplicación.
- No use datos de salud para publicidad o marketing; no los almacene en iCloud.
- Las cadenas de uso de Info.plist (
NSHealthShareUsageDescription,NSHealthUpdateUsageDescription) deben indicar el uso real. Si la cadena dice "nunca se comparte con terceros", el código debe garantizarlo. - Refuércelo en el código: el constructor de solicitudes para llamadas de IA toma una lista explícita de campos permitidos; agregue una prueba que falle si aparece un campo con origen de salud en una carga útil de IA.
Puntos de decisión que requieren aprobación humana
Respuestas finales en cada formulario (el titular de la cuenta es legalmente responsable), la clasificación de cumplimiento de exportación, la clasificación por edades, el proveedor de IA y sus términos de datos, cualquier cambio en qué datos de salud salen del dispositivo.
Verificación
- Cada respuesta del formulario cita una fila del inventario; el inventario cita el código.
- Verificación de diferencias: política de privacidad ↔ Privacidad de la aplicación ↔ CSV de seguridad de datos ↔ texto de consentimiento en la aplicación ↔ cadenas de Info.plist. Sin contradicciones.
- Prueba: elimine una cuenta de prueba; confirme que las filas del backend, los registros del procesador y el usuario de autenticación hayan desaparecido; la página web de eliminación sea accesible sin iniciar sesión.
- La compilación no muestra advertencias de manifiesto de privacidad.
Errores comunes
- "Los datos nunca salen del dispositivo" en la política mientras una función de sincronización o IA los envía.
- Olvidar su propio informe anónimo de fallos/uso en los formularios.
- Una dependencia agrega silenciosamente el permiso AD_ID.
- Datos de salud fluyen a un mensaje de IA a través de un constructor de "contexto" que incluye "todo lo que sabemos".
- La ruta de eliminación tiene un nombre diferente en la aplicación, la política y los formularios de la tienda.
- Clasificación por edades 4+ mientras los Términos dicen 16+.