ITMS-90683 « Missing purpose string » : ajouter les bons textes d'usage dans Info.plist
ITMS-90683 arrive par e-mail peu après un envoi : votre binaire fait référence à une ressource protégée comme l'appareil photo, la localisation ou les contacts, et Info.plist ne contient aucune phrase expliquant pourquoi. Ajoutez la clé nommée avec une phrase honnête et envoyez un nouveau build. Ce qui mérite vraiment votre soin, c'est la phrase elle-même, car App Review la lit aussi.
Dès $109 en paiement unique par plateforme, ou notre équipe s'occupe de tout dès $698.
Garantie d'approbation – ou remboursement sous 14 jours
Aucun codage requis
Paiement unique, mises à jour gratuites
Support humain 24/7
Conçu en Allemagne depuis 2014 · ISO 27001
9:41
Votre app
Votre appDésormais dans votre poche
App Store · Google Play Approuvée
Ce que dit l'e-mail, et pourquoi une app web le reçoit
Le message nomme une clé, par exemple NSCameraUsageDescription ou NSLocationWhenInUseUsageDescription, et le bundle dans lequel elle manque. La formulation d'Apple précise aussi que des bibliothèques externes et des SDK peuvent faire référence à ces API, et qu'un texte d'usage est exigé même si votre app ne les utilise peut-être pas. Considérez-le comme bloquant : corrigez la clé, augmentez le numéro de build et envoyez à nouveau.
Votre app web demande l'appareil photo via <input type="file" capture>, la localisation via navigator.geolocation et le micro via getUserMedia. Dans une app WebViewGold, tout cela passe par WebKit et la coquille native, et iOS utilise les textes d'usage de l'Info.plist de l'app pour la boîte de dialogue d'autorisation. Sans ce texte, iOS ne peut pas afficher la boîte de dialogue et ferme l'app à la place, exactement ce que le contrôle d'Apple à l'envoi veut éviter.
Dans les projets WebViewGold, le déclencheur le plus courant est le ménage qu'encourage la guideline 2.5.1 : vous supprimez les textes d'usage des fonctionnalités que vous n'utilisez pas, et l'un d'eux appartient à du code encore compilé dans le binaire. L'e-mail fait foi sur ce que référence le binaire : la clé revient donc, avec une phrase précise.
Quelle clé pour quelle fonctionnalité WebViewGold
Xcode affiche le nom lisible dans l'éditeur d'Info.plist ; l'e-mail utilise la clé brute.
Clé brute dans l'e-mail
Affichée dans Xcode sous le nom
Votre app en a besoin si elle...
NSCameraUsageDescription
Privacy - Camera Usage Description
prend des photos ou des vidéos à envoyer, utilise qrcode:// ou barcodescanner://, le scanner de documents (kVisionKitEnable), l'API lampe torche, ou un flux de caméra dans l'app web. Voir la documentation du scanner QR.
NSHealthShareUsageDescription et NSHealthUpdateUsageDescription
Privacy - Health Share / Health Update Usage Description
utilise le plugin HealthKit (readhealthkit://, writehealthkit://). Les deux clés sont exigées par la documentation HealthKit.
NSUserTrackingUsageDescription
Privacy - Tracking Usage Description
toujours. La documentation WebViewGold indique que cette clé est obligatoire et que sa suppression fait planter l'app.
Textes d'usage faibles et textes solides
Les recommandations d'Apple sur les purpose strings demandent une phrase complète, à la voix active, qui nomme la fonctionnalité et ce qu'il advient des données. Pas de marketing, pas de simple reprise du nom de la ressource.
Ressource
Suscite des questions
Passe
Appareil photo
Cette app a besoin d'accéder à l'appareil photo.
Scannez le QR code de votre carte de membre pour vous enregistrer à l'accueil.
Localisation
Pour utiliser la localisation.
Affiche les salles d'escalade les plus proches de vous et le temps de marche jusqu'à chacune.
Ajout de photos
Enregistrer des photos.
Enregistre votre billet dans Photos pour que vous puissiez le présenter à l'entrée sans connexion.
Micro
Micro requis pour l'app.
Enregistre votre note vocale et la transforme en texte pour votre entrée de journal.
Face ID
Utiliser Face ID.
Déverrouille votre budget avec Face ID au lieu de votre mot de passe.
Contacts
Accéder à vos contacts pour une meilleure expérience.
Vous permet de choisir des amis dans vos contacts pour les inviter à une liste partagée. Seules les personnes que vous sélectionnez sont envoyées à notre serveur. (N'écrivez la seconde phrase que si elle est vraie.)
Excellent travail! Je n'ai jamais codé quoi que ce soit, mais j'ai réussi à travailler avec cela. Facile et rapide! Avec une grande aide des créateurs!
Le bundle peut être votre app principale ou une cible d'extension (extension de service push, widget, extension de partage, App Clip). Chaque cible a son propre Info.plist, et la clé doit se trouver dans celui que nomme l'e-mail.
Ajoutez la clé dans Xcode
Ouvrez cet Info.plist, survolez une ligne, cliquez sur le plus, choisissez l'entrée « Privacy - ... » dans la liste et collez votre phrase. Ou faites un clic droit sur le fichier, choisissez Open As, Source Code, et ajoutez la paire clé et texte présentée ci-dessous.
Décidez de ce que décrit la phrase
Si la fonctionnalité fait partie de votre app, décrivez-la. Sinon, il existe deux options honnêtes : ajouter la clé avec une phrase exacte sur ce que fait ce code (l'e-mail ITMS lui-même indique qu'un texte est exigé même si votre app n'utilise peut-être pas l'API), ou supprimer le code qui fait référence à l'API, ce que recommandent les consignes d'Apple sur les purpose strings en l'absence de raison valable. Dans un projet WebViewGold, ne supprimez pas de fichiers Swift ni de SDK de votre propre chef (la documentation prévient que la suppression du SDK AdMob provoque de nombreuses erreurs de dépendances) ; interrogez plutôt le support sur le retrait d'un module. Un texte d'usage n'affiche jamais de boîte de dialogue à lui seul ; iOS ne l'affiche que lorsque du code demande réellement l'accès.
Localisez si votre app est localisée
Ajoutez les mêmes clés dans InfoPlist.strings pour chaque langue prise en charge par votre app, et gardez le texte de base (souvent en anglais) dans Info.plist comme valeur de secours. Testez chaque langue sur un appareil.
Augmentez le numéro de build et envoyez
Archivez, envoyez et attendez l'e-mail de traitement. Si le traitement se termine sans e-mail ITMS, le build apparaît dans TestFlight.
Déclenchez chaque boîte de dialogue une fois sur un appareil
Installez le build TestFlight, utilisez chaque fonctionnalité qui demande une autorisation et vérifiez que la boîte de dialogue apparaît au moment de l'utilisation, avec votre phrase. Une boîte de dialogue au premier lancement sans raison visible, c'est précisément ce que les examinateurs signalent au titre de la 5.1.1.
Entrées Info.plist en vue source
Valeurs d'exemple ; remplacez-les par des phrases sur vos propres fonctionnalités.
xml
<key>NSCameraUsageDescription</key>
<string>Scannez le QR code de votre carte de membre pour vous enregistrer à l'accueil.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Enregistre votre billet dans Photos pour que vous puissiez le présenter à l'entrée sans connexion.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Affiche les salles d'escalade les plus proches de vous et le temps de marche jusqu'à chacune.</string>
<key>NSFaceIDUsageDescription</key>
<string>Déverrouille votre budget avec Face ID au lieu de votre mot de passe.</string>
Prompt : laissez un agent ajouter et rédiger les clés
Prompt pour Claude Code ou Cursor, ouvert dans le dossier du projet Xcode WebViewGold
Mon envoi a été refusé avec ITMS-90683 (e-mail ci-dessous). Dans ce projet iOS WebViewGold :
1. Dites-moi à quelle cible et à quel Info.plist appartient chaque clé manquante.
2. Lisez Config.swift et listez les fonctionnalités natives activées (scanners, scanner de documents, géolocalisation, localisation en arrière-plan, biométrie, contacts, NFC, HealthKit, enregistrement de fichiers et d'images).
3. Ajoutez chaque clé manquante dans le bon Info.plist. Rédigez la valeur sous forme d'une phrase complète, à la voix active, qui nomme la fonctionnalité concrète de mon app et ce qu'il advient des données. Pas de mots marketing, pas de « pour vous offrir une meilleure expérience ». Mon app : [un paragraphe sur ce que fait l'app et pour qui].
4. Si une clé appartient à une fonctionnalité qui n'est pas activée, ajoutez-la quand même, rédigez une phrase exacte sur ce que fait ce code et listez-la à part pour que je puisse décider.
5. Si des fichiers InfoPlist.strings existent, ajoutez les traductions de chaque clé dans ces langues.
6. Ne supprimez jamais NSUserTrackingUsageDescription. Ne modifiez aucun autre fichier.
E-mail :
[collez ici l'e-mail ITMS-90683]
Questions fréquentes
Je n'utilise jamais l'appareil photo. Pourquoi Apple veut-il NSCameraUsageDescription ?
Parce que du code de votre binaire, souvent un SDK ou un module du modèle, fait référence à l'API de l'appareil photo. Le contrôle d'Apple examine le binaire, pas les fonctionnalités que vous avez activées. Ajoutez la clé avec une phrase exacte, ou faites retirer le code.
Ajouter un texte d'usage affiche-t-il une demande d'autorisation à mes utilisateurs ?
Non. La boîte de dialogue n'apparaît que lorsque du code demande réellement l'accès, par exemple quand un utilisateur touche votre bouton de scan. Le texte d'une fonctionnalité inutilisée n'est jamais affiché.
Le texte peut-il être uniquement dans ma langue ?
Rédigez la valeur d'Info.plist dans la langue principale de l'app et ajoutez des fichiers InfoPlist.strings pour les autres langues prises en charge. La valeur d'Info.plist sert de secours pour toutes les langues que vous n'avez pas traduites.
App Review refusera-t-il un texte d'usage générique ?
C'est possible. Une phrase comme « Cette app a besoin de votre position » est un constat typique de la guideline 5.1.1. Nommez la fonctionnalité et le bénéfice en une phrase concrète.
Me faut-il un nouveau build, ou puis-je corriger cela dans App Store Connect ?
Il vous faut un nouveau build. Info.plist fait partie du bundle de l'app, la correction n'arrive donc chez Apple qu'avec un nouvel envoi et un numéro de build plus élevé.
Trois façons de mettre votre app dans les stores
Même résultat, charge de travail différente de votre côté. Les trois formules incluent la garantie d'approbation et le support humain 24/7.
Faites-le vous-même
$109 par plateforme, paiement unique
La licence WebViewGold : un projet Xcode ou Android Studio prêt à l'emploi. Collez votre URL, définissez le nom et l'icône, activez les fonctionnalités, compilez et soumettez. Mises à jour gratuites à vie.
Ni Mac, ni Xcode, ni Android Studio : configurez dans le navigateur, nous compilons les deux apps dans le cloud et les transmettons à App Store Connect et à la Play Console.
Envoyez-nous votre URL et votre icône. Notre équipe configure, compile et livre votre app sous 72 heures, en marque blanche, projets sources inclus. Les deux plateformes pour $1,158.
Les remboursements sont accordés aux conditions indiquées dans notre FAQ : un refus non lié au contenu par Apple et/ou Google, demandé dans les 14 jours suivant l'achat.