Application rejetée en raison de descriptions d'utilisation manquantes (Xcode8)

91

J'ai donc reçu ce courrier aujourd'hui disant que la dernière version de mon application avait été rejetée par iTunes Connect en raison de certaines descriptions d'utilisation manquantes. Pour être exact:

Cette application tente d'accéder aux données sensibles à la confidentialité sans description d'utilisation. Le fichier Info.plist de l'application doit contenir une clé NSContactsUsageDescription avec une valeur de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Cette application tente d'accéder aux données sensibles à la confidentialité sans description d'utilisation. Le fichier Info.plist de l'application doit contenir une clé NSCalendarsUsageDescription avec une valeur de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Cette application tente d'accéder aux données sensibles à la confidentialité sans description d'utilisation. Le fichier Info.plist de l'application doit contenir une clé NSPhotoLibraryUsageDescription avec une valeur de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Cette application tente d'accéder aux données sensibles à la confidentialité sans description d'utilisation. Le fichier Info.plist de l'application doit contenir une clé NSBluetoothPeripheralUsageDescription avec une valeur de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Cette application tente d'accéder aux données sensibles à la confidentialité sans description d'utilisation. Le fichier Info.plist de l'application doit contenir une clé NSMicrophoneUsageDescription avec une valeur de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Cette application tente d'accéder aux données sensibles à la confidentialité sans description d'utilisation. Le fichier Info.plist de l'application doit contenir une clé NSMotionUsageDescription avec une valeur de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Une fois que ces problèmes ont été corrigés, vous pouvez alors renvoyer le binaire corrigé.

J'ai compris que ceux-ci sont devenus obligatoires avec iOS 10, mais le seul problème est que mon application ne demande pas l'autorisation d'accéder à l'un de ceux-ci. Je pensais que la description n'était obligatoire que si vous avez réellement demandé une autorisation?

Est-ce parce que l'une de mes dépendances (Cocoapods) peut contenir du code pour demander ces autorisations? Ou ces descriptions sont-elles obligatoires même si je ne demande jamais à voir le calendrier des utilisateurs, les contacts, etc.?

KimHafr
la source
3
D'après mon expérience, ceux-ci ne sont nécessaires que si vous demandez les autorisations. Alors peut-être qu'une dépendance fait cela pour vous. De plus, TOUTES ces autorisations ont une odeur de poisson, surtout si votre application est une simple liste de tâches. Peut-être qu'une dépendance est en train de faire du phishing?
Eimantas
Pourriez-vous poster votre PodFileet la liste des bibliothèques que vous utilisez (si vous utilisez des cocoapodes extérieurs)?
Julien Quere
C'était github.com/nickoneill/PermissionScope .. Merci pour votre aide!
KimHafr
ُ son utilisation expliquée et spectacle: iosdevcenters.blogspot.com/2016/09
Saeid
J'ai exactement le même problème et je suppose qu'il est causé par: pod 'ReactNativePermissions',: path => '../node_modules/react-native-permissions'
luky

Réponses:

33

Les descriptions sont obligatoires pour tout contenu que vous ou tout cadre auquel vous vous connectez contre une tentative d'accès. Les erreurs sont générées lors d'une tentative d'accès au contenu si aucune description d'utilisation n'a été fournie, donc si vous obtenez ces erreurs, votre application doit les demander. Vous devriez découvrir pourquoi votre application ou ses frameworks en ont besoin et ajouter des descriptions d'utilisation appropriées à info.plist de votre application.

Ou plus idéalement, si vous n'avez pas besoin d'accès, voyez s'il existe un moyen de ne pas le demander (ou d'utiliser des frameworks qui le font inutilement).

Matthew Seaman
la source
11
Je ne pouvais pas imaginer de ma vie que j'ajouterais une bibliothèque demandant toutes ces autorisations. Mais c'était tellement évident quand je l'ai trouvé: github.com/nickoneill/PermissionScope
KimHafr
1
Ouais, un cadre comme celui-ci n'est peut-être pas une bonne idée car il oblige votre application à déclarer beaucoup plus d'autorisations que ce dont elle a besoin.
Matthew Seaman
3
Je suppose que c'est plus une fonctionnalité qu'un bug. ITunes Connect détecte que quelque part dans votre application, quelqu'un peut demander des autorisations. Dans ce cas, vous devez remplir des descriptions d'utilisation pour tous ces éléments, au cas où vous pourriez réellement appeler une partie du code dans permissionscope. J'aime aussi le cadre et je ne suis pas prêt à le remplacer. J'ai donc rempli un faux texte et l'application a été approuvée. Je l'ai soumis à l'AppStore, alors j'espère que ça ira :-)
KimHafr
15
Besoin d'un moyen de détecter quel framework demande ces autorisations?
neobie
5
Neobie - avez-vous trouvé comment détecter les frameworks demandant les autorisations?
Nitesh
140

iOS 10 doit ajouter une autorisation dans info.plist, il suffit de consulter ce BLOG: - settings-in-ios-10 vous avez toute idée.

Ajoutez l'autorisation dans le fichier info.plist basé sur votre journal d' erreurs .

Remarque: écrivez la raison appropriée de l'autorisation dans la valeur de chaîne, sinon Apple rejette à nouveau l'application.

NSCameraUsageDescription

<key>NSCameraUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSContactsUsageDescription

<key>NSContactsUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSPhotoLibraryUsageDescription

<key>NSPhotoLibraryUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSBluetoothPeripheralUsageDescription

<key>NSBluetoothPeripheralUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSMicrophoneUsageDescription

<key>NSMicrophoneUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSMotionUsageDescription

<key>NSMotionUsageDescription</key>
    <string>$(PRODUCT_NAME) motion use.</string>

NSLocationAlwaysUsageDescription

<key>NSLocationAlwaysUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSLocationUsageDescription

<key>NSLocationUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSLocationWhenInUseUsageDescription

<key>NSLocationWhenInUseUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSRemindersUsageDescription

<key>NSRemindersUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSSiriUsageDescription

<key>NSSiriUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSVideoSubscriberAccountUsageDescription

<key>NSVideoSubscriberAccountUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSSpeechRecognitionUsageDescription

<key>NSSpeechRecognitionUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

NSCalendarsUsageDescription

<key>NSCalendarsUsageDescription</key>
    <string>You have to describe the real usage for a human.</string>

entrez la description de l'image ici

Mitul Marsoniya
la source
Ne devrait-il pas être "$ {PRODUCT_NAME}" au lieu de "$ (PRODUCT_NAME)"? "{}" au lieu de "()".
backslash-f
@ backslash-f, veuillez vérifier le fichier plist existant dans le nouveau projet et il devrait l'être $(PRODUCT_NAME). Vous pouvez voir la propriété par défaut comme Bundle namedans le fichier plist.
Jayesh Thanki
1
Veuillez noter qu'une description générique comme celle-ci ne vous permettra plus d'obtenir l'approbation de l'App Store. Nous étions juste sonné deux fois pour des descriptions similaires. Vous devez décrire l'utilisation réelle d'un humain
O'Rooney
9

Vous pouvez ajouter votre info.plist comme:

<key>NSCalendarsUsageDescription</key>
    <string>Explain the reasons for accessing...</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>Explain the reasons for accessing...</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>Explain the reasons for accessing...</string>

etc.

L'espoir aidera quelqu'un ...

mgyky
la source
6

J'ai eu le même problème, et il semble que si un cadre auquel vous vous connectez a un code qui demande cette autorisation (même si votre application ne le demande jamais), les descriptions d'utilisation sont nécessaires. Mais selon mon test, si vous ne les demandez pas, ils n'apparaîtront pas dans la liste des autorisations de votre application.

Ventes Dielson
la source
3

Calendrier: Clé: Confidentialité - Calendriers Description de l'utilisation
Valeur: Événements de calendrier $ (PRODUCT_NAME)

Rappel: Clé: Confidentialité - Rappels Description de l'utilisation
Valeur: Utilisation du rappel $ (PRODUCT_NAME)

Contact : Clé: Confidentialité - Contacts Description de l'utilisation
Valeur: $ (PRODUCT_NAME)

Photo: Clé: Confidentialité - Description de l'utilisation de la photothèque
Valeur: Utilisation de la photo (PRODUCT_NAME) $

Partage Bluetooth: Clé: Confidentialité - Utilisation du périphérique Bluetooth Description
Valeur: $ (PRODUCT_NAME) Utilisation du périphérique Bluetooth

Microphone: Clé: Confidentialité - Utilisation du microphone Description
Valeur: $ (PRODUCT_NAME) utilisation du microphone

Caméra: Clé: Confidentialité - Description de l'utilisation de la caméra
Valeur: Utilisation de la caméra (PRODUCT_NAME) $

Emplacement: Clé: Confidentialité - Emplacement toujours Description de l'utilisation
Valeur: $ (PRODUCT_NAME) location use

Clé: Confidentialité - Emplacement lors de l'utilisation Description de l'utilisation
Valeur: $ (PRODUCT_NAME) location use

Heath: Key: Privacy - Health Share Usage Description
Valeur: $ (PRODUCT_NAME) heath share use

Clé: Confidentialité - Utilisation des mises à jour de santé Description
Valeur: Utilisation des mises à jour de santé $ (PRODUCT_NAME)

HomeKit: Clé: Confidentialité - Description de l'utilisation de HomeKit
Valeur: Utilisation du kit pour la maison $ (PRODUCT_NAME)

Médiathèque: Clé: Confidentialité - Utilisation de la médiathèque Description
Valeur: $ (PRODUCT_NAME) utilisation de la médiathèque

Motion: Key: Confidentialité - Motion Description de l'utilisation
Valeur: $ (PRODUCT_NAME) motion use

Reconnaissance vocale: Clé: Confidentialité - Utilisation de la reconnaissance vocale Description
Valeur: utilisation vocale $ (PRODUCT_NAME)

SiriKit: Clé: Confidentialité - Description de l'utilisation de Siri
Valeur: $ (PRODUCT_NAME) siri use

Fournisseur TV: Clé: Confidentialité - Description de l'utilisation du fournisseur TV
Valeur: $ (PRODUCT_NAME) Utilisation de tvProvider

Trinadh Koya
la source
0

Pour tous ceux qui se demandent pourquoi tout à coup votre application a maintenant tous ces paramètres d'autorisation, cela pourrait être à cause de CocoaPods ou de Carthage - ils ont mis en place toutes ces autorisations. Je viens de mettre à niveau mon application pour utiliser cordova-plugin-firebasex qui a une installation étendue de Cocoapods (et de dépendances). Vous pouvez désactiver ces autorisations AVANT d'installer des cocoapods dans votre projet en mettant un PermissionsConfiguration.xcconfig à la racine de votre projet - vous pouvez en savoir plus à ce sujet ici: https://cocoapods.org/pods/Permission#installation

Tout cela m'a surpris lorsque la nouvelle version de mon application a été rejetée avec 7 clés / chaînes d'autorisations manquantes dans le fichier Info.plist. J'ai ensuite dû creuser dans mon projet pour trouver ce qui en était la cause, car mon application n'a besoin d'aucune de ces autorisations ou n'utilise aucune de ces autorisations (jamais).

Cela peut exister, mais pour le moment, je ne trouve pas de moyen de supprimer les autorisations après l'intégration des pods ... je vais devoir fouiller pour savoir comment faire cela sans recommencer mon projet.

rolinger
la source