ITMS-90683 "Missing purpose string": cómo añadir las descripciones de uso correctas a Info.plist
ITMS-90683 llega por correo poco después de una subida: tu binario hace referencia a un recurso protegido, como la cámara, la ubicación o los contactos, e Info.plist no tiene ninguna frase que explique por qué. Añade la clave indicada con una frase honesta y sube una nueva compilación. Lo que merece la pena hacer bien es la propia frase, porque App Review también la lee.
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é dice el correo y por qué lo recibe una app web
El mensaje nombra una clave, por ejemplo NSCameraUsageDescription o NSLocationWhenInUseUsageDescription, y el bundle en el que falta. El texto de Apple también señala que las bibliotecas externas y los SDK pueden hacer referencia a estas APIs, y que el texto de propósito es obligatorio aunque tu app no llegue a usarlas. Trátalo como un bloqueo: corrige la clave, sube el número de compilación y vuelve a enviarla.
Tu app web pide la cámara mediante <input type="file" capture>, la ubicación mediante navigator.geolocation y el micrófono mediante getUserMedia. Dentro de una app de WebViewGold todo esto pasa por WebKit y el envoltorio nativo, e iOS usa los textos de propósito del Info.plist de la app para el diálogo de permiso. Sin el texto, iOS no puede mostrar el diálogo y cierra la app, que es justo lo que evita la comprobación de subida de Apple.
El desencadenante más común en proyectos de WebViewGold es la limpieza que fomenta la Directriz 2.5.1: borras textos de propósito de funciones que no usas, y uno de ellos pertenece a código que sigue compilado en el binario. El correo es la referencia sobre lo que usa el binario, así que la clave vuelve a su sitio, con una frase precisa.
Qué clave corresponde a cada función de WebViewGold
Xcode muestra el nombre legible en el editor de Info.plist; el correo usa la clave sin formato.
Clave en el correo
Nombre que muestra Xcode
Tu app la necesita cuando...
NSCameraUsageDescription
Privacy - Camera Usage Description
hace fotos o vídeos para subirlos, usa qrcode:// o barcodescanner://, el escáner de documentos (kVisionKitEnable), la API de la linterna o un flujo de cámara en la app web. Consulta la documentación del escáner QR.
NSHealthShareUsageDescription y NSHealthUpdateUsageDescription
Privacy - Health Share / Health Update Usage Description
usa el plugin de HealthKit (readhealthkit://, writehealthkit://). La documentación de HealthKit exige ambas claves.
NSUserTrackingUsageDescription
Privacy - Tracking Usage Description
siempre. La documentación de WebViewGold indica que esta clave es obligatoria y que eliminarla hace que la app se cierre de golpe.
Textos de propósito débiles y textos sólidos
Las pautas de Apple sobre textos de propósito piden una frase completa en voz activa que nombre la función y explique qué pasa con los datos. Nada de marketing ni de repetir el nombre del recurso.
Recurso
Lo cuestionan
Lo aprueban
Cámara
Esta app necesita acceso a la cámara.
Escanea el código QR de tu tarjeta de socio para registrar tu entrada en recepción.
Ubicación
Para usar la ubicación.
Muestra los rocódromos más cercanos y el tiempo a pie hasta cada uno.
Añadir fotos
Guardar fotos.
Guarda tu entrada al evento en Fotos para que puedas mostrarla en la puerta sin conexión.
Micrófono
Micrófono necesario para la app.
Graba tu nota de voz y la convierte en texto para tu entrada del diario.
Face ID
Usar Face ID.
Desbloquea tu presupuesto con Face ID en lugar de tu contraseña.
Contactos
Accede a tus contactos para una mejor experiencia.
Te permite elegir amigos de tus contactos para invitarlos a una lista compartida. Solo se envían a nuestro servidor las personas que selecciones. (Escribe la segunda frase solo si es cierta.)
¡Gran trabajo! Nunca tuve que usar código para nada, pero logré trabajar con esto y tener mi App lista. ¡Fácil y rápido! ¡También con gran ayuda de los creadores!
El bundle puede ser tu app principal o un target de extensión (extensión de servicio de notificaciones push, widget, extensión para compartir, App Clip). Cada target tiene su propio Info.plist, y la clave tiene que estar en el que indica el correo.
Añade la clave en Xcode
Abre ese Info.plist, pasa el ratón por encima de una fila, haz clic en el signo más, elige la entrada "Privacy - ..." de la lista y pega tu frase. O haz clic derecho en el archivo, elige Open As, Source Code, y añade el par de clave y texto que se muestra abajo.
Decide qué describe la frase
Si la función forma parte de tu app, descríbela. Si no, hay dos opciones honestas: añadir la clave con una frase precisa sobre lo que hace ese código (el propio correo ITMS dice que el texto es obligatorio aunque tu app no llegue a usar la API), o eliminar el código que hace referencia a la API, que es lo que recomiendan las pautas de Apple sobre textos de propósito cuando no hay un motivo válido. En un proyecto de WebViewGold, no borres archivos Swift ni SDK por tu cuenta (la documentación advierte de que eliminar el SDK de AdMob provoca muchos errores de dependencias); pregunta al soporte cómo quitar un módulo. Un texto de propósito nunca muestra un diálogo por sí solo; iOS solo lo enseña cuando el código solicita el acceso de verdad.
Localízalo si tu app está traducida
Añade las mismas claves a InfoPlist.strings para cada idioma que admita tu app y deja el texto en inglés en Info.plist como respaldo. Prueba cada idioma en un dispositivo.
Sube el número de compilación y envíala
Archiva, sube y espera el correo de procesamiento. Si el procesamiento termina sin un correo ITMS, la compilación aparece en TestFlight.
Provoca cada diálogo una vez en un dispositivo
Instala la compilación de TestFlight, usa cada función que pida permiso y comprueba que el diálogo aparece en el momento de uso con tu frase. Un diálogo en el primer arranque sin ningún motivo visible es justo lo que los revisores señalan bajo la 5.1.1.
Entradas de Info.plist en vista de código fuente
Valores de ejemplo; sustitúyelos por frases sobre tus propias funciones.
xml
<key>NSCameraUsageDescription</key>
<string>Escanea el código QR de tu tarjeta de socio para registrar tu entrada en recepción.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Guarda tu entrada al evento en Fotos para que puedas mostrarla en la puerta sin conexión.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Muestra los rocódromos más cercanos y el tiempo a pie hasta cada uno.</string>
<key>NSFaceIDUsageDescription</key>
<string>Desbloquea tu presupuesto con Face ID en lugar de tu contraseña.</string>
Prompt: deja que un agente añada y redacte las claves
Prompt para Claude Code o Cursor, abierto en la carpeta del proyecto Xcode de WebViewGold
Mi subida fue rechazada con ITMS-90683 (correo abajo). En este proyecto iOS de WebViewGold:
1. Dime a qué target y a qué Info.plist pertenece cada clave que falta.
2. Lee Config.swift y enumera qué funciones nativas están activadas (escáneres, escáner de documentos, geolocalización, ubicación en segundo plano, biometría, contactos, NFC, HealthKit, guardado de archivos e imágenes).
3. Añade cada clave que falta al Info.plist correcto. Escribe el valor como una frase completa en voz activa que nombre la función concreta de mi app y lo que pasa con los datos. Sin palabras de marketing, sin "para ofrecer una mejor experiencia". Mi app: [un párrafo sobre qué hace la app y para quién].
4. Si una clave pertenece a una función que no está activada, añádela igualmente, escribe una frase precisa sobre lo que hace ese código y enumérala aparte para que yo decida.
5. Si existen archivos InfoPlist.strings, añade traducciones de cada clave en esos idiomas.
6. Nunca elimines NSUserTrackingUsageDescription. No cambies ningún otro archivo.
Correo:
[pega aquí el correo de ITMS-90683]
Preguntas frecuentes
Nunca uso la cámara. ¿Por qué Apple quiere NSCameraUsageDescription?
Porque el código de tu binario, a menudo un SDK o un módulo de la plantilla, hace referencia a la API de la cámara. La comprobación de Apple mira el binario, no qué funciones activaste. Añade la clave con una frase precisa o pide que se elimine ese código.
¿Añadir un texto de propósito muestra un diálogo de permiso a mis usuarios?
No. El diálogo solo aparece cuando el código solicita el acceso de verdad, por ejemplo cuando un usuario pulsa tu botón de escanear. El texto de una función que no se usa nunca se muestra.
¿Puede estar el texto solo en mi idioma?
Escribe el valor de Info.plist en el idioma principal de la app y añade archivos InfoPlist.strings para los demás idiomas que admita tu app. El valor de Info.plist es el respaldo para cada idioma que no hayas traducido.
¿Rechazará App Review un texto de propósito genérico?
Puede hacerlo. Una frase como "Esta app necesita tu ubicación" es un hallazgo típico de la Directriz 5.1.1. Nombra la función y el beneficio en una frase concreta.
¿Necesito una nueva compilación o puedo arreglarlo en App Store Connect?
Necesitas una nueva compilación. Info.plist forma parte del bundle de la app, así que la corrección solo llega a Apple con una nueva subida y un número de compilación mayor.
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.