App rejeitado devido à falta de descrições de uso (Xcode8)

91

Recebi este e-mail hoje dizendo que a última compilação do meu aplicativo foi rejeitada pelo iTunes Connect devido a algumas descrições de uso ausentes. Para ser exato:

Este aplicativo tenta acessar dados confidenciais sem uma descrição de uso. O Info.plist do aplicativo deve conter uma chave NSContactsUsageDescription com um valor de string explicando ao usuário como o aplicativo usa esses dados.

Este aplicativo tenta acessar dados confidenciais sem uma descrição de uso. O Info.plist do aplicativo deve conter uma chave NSCalendarsUsageDescription com um valor de string explicando ao usuário como o aplicativo usa esses dados.

Este aplicativo tenta acessar dados confidenciais sem uma descrição de uso. O Info.plist do aplicativo deve conter uma chave NSPhotoLibraryUsageDescription com um valor de string explicando ao usuário como o aplicativo usa esses dados.

Este aplicativo tenta acessar dados confidenciais sem uma descrição de uso. O Info.plist do aplicativo deve conter uma chave NSBluetoothPeripheralUsageDescription com um valor de string explicando ao usuário como o aplicativo usa esses dados.

Este aplicativo tenta acessar dados confidenciais sem uma descrição de uso. O Info.plist do aplicativo deve conter uma chave NSMicrophoneUsageDescription com um valor de string explicando ao usuário como o aplicativo usa esses dados.

Este aplicativo tenta acessar dados confidenciais sem uma descrição de uso. O Info.plist do aplicativo deve conter uma chave NSMotionUsageDescription com um valor de string explicando ao usuário como o aplicativo usa esses dados.

Depois que esses problemas forem corrigidos, você poderá reenviar o binário corrigido.

Descobri que eles se tornaram obrigatórios com o iOS 10, mas o único problema é que meu aplicativo não está solicitando permissão para acessar nenhum deles. Achei que a descrição só era obrigatória se você realmente solicitasse uma permissão?

É porque uma das minhas dependências (Cocoapods) pode conter algum código para solicitar essas permissões? Ou essas descrições são obrigatórias, mesmo que eu nunca solicite ver a agenda, os contatos etc. dos usuários?

KimHafr
fonte
3
Pela minha experiência - eles são necessários apenas se você estiver solicitando as permissões. Então, talvez alguma dependência esteja fazendo isso por você. Além disso, TODAS essas permissões cheiram a suspeitas, especialmente se seu aplicativo for uma lista de tarefas simples. Talvez alguma dependência esteja indo para o phishing?
Eimantas
Você poderia postar o seu PodFilee a lista das bibliotecas que você usa (se você usa alguns cocoapods externos)?
Julien Quere,
Foi github.com/nickoneill/PermissionScope .. Obrigado pela ajuda!
KimHafr
Seu uso mostram explicado e: iosdevcenters.blogspot.com/2016/09/...
Saeid
Eu tenho exatamente o mesmo problema e acho que é causado por: pod 'ReactNativePermissions',: path => '../node_modules/react-native-permissions'
luky

Respostas:

33

As descrições são obrigatórias para qualquer conteúdo que você ou qualquer estrutura que você vincule para tentar acessar. Os erros são gerados em uma tentativa de acessar o conteúdo se uma descrição de uso não foi fornecida, portanto, se você estiver recebendo esses erros, seu aplicativo deve estar solicitando-os. Você deve descobrir por que seu aplicativo ou suas estruturas exigem isso e adicionar descrições de uso adequadas ao info.plist do seu aplicativo.

Ou mais idealmente, se você não precisa de acesso, veja se há uma maneira de não solicitá-lo (ou use frameworks que precisam desnecessariamente).

Matthew Seaman
fonte
11
Não poderia imaginar que adicionaria uma biblioteca solicitando todas essas permissões. Mas era tão óbvio quando o encontrei: github.com/nickoneill/PermissionScope
KimHafr
1
Sim, uma estrutura como essa pode não ser uma boa ideia porque faz com que seu aplicativo declare muito mais permissões do que precisa.
Matthew Seaman,
3
Acho que isso é mais um recurso do que um bug. O iTunes Connect detecta que em algum lugar do seu aplicativo alguém pode solicitar permissões. Nesse caso, você deve preencher as descrições de uso para todos eles, no caso de realmente poder invocar parte do código em permissionscope. Também gosto da estrutura e não estou pronto para substituí-la. Então, eu preenchi um texto falso e o aplicativo foi aprovado. Eu o enviei para a AppStore, então espero que esteja tudo bem :-)
KimHafr
15
Precisa de uma maneira de detectar qual estrutura está solicitando essa permissão?
neobie
5
Neobie - você descobriu como pode detectar as estruturas que solicitam as permissões?
Nitesh de
140

O iOS 10 deve adicionar permissão em info.plist, basta revisar este BLOG: - settings-in-ios-10, você já tem uma ideia.

Adicione permissão no arquivo info.plist com base em seu log de erros .

Nota: Escreva o motivo adequado para a permissão no valor da string, caso contrário, a apple rejeitará o app novamente.

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>

insira a descrição da imagem aqui

Mitul Marsoniya
fonte
Não deveria ser "$ {PRODUCT_NAME}" em vez de "$ (PRODUCT_NAME)"? "{}" ao invés de "()".
barra invertida-f
@ barra invertida-f, verifique o arquivo plist existente no novo projeto e deve ser $(PRODUCT_NAME). Você pode ver a propriedade padrão como Bundle nameno arquivo plist.
Jayesh Thanki
1
Observe que uma descrição genérica como esta não o levará mais à aprovação da app store. Acabamos de ser acusados ​​duas vezes por descrições semelhantes. Você tem que descrever o uso real para um humano
O'Rooney
9

Você pode adicionar em seu info.plist como:

<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.

Espero que ajude alguem ...

mgyky
fonte
6

Eu tive o mesmo problema e parece que se qualquer estrutura que você vincular tiver código que pede essa permissão (mesmo que seu aplicativo nunca a solicite), as descrições de uso são necessárias. Mas de acordo com meu teste, se você não os solicitar, eles não aparecerão na lista de permissões do seu aplicativo.

Dielson Sales
fonte
3

Calendário: Chave: Privacidade - Descrição de uso de calendários
Valor: $ (PRODUCT_NAME) eventos de calendário

Lembrete: Chave: Privacidade -
Valor de Descrição de Uso de Lembretes : $ (PRODUCT_NAME) uso de lembrete

Contato : Chave: Privacidade - Descrição de uso dos contatos
Valor: $ (PRODUCT_NAME) uso do contato

Foto: Chave: Privacidade - Descrição de uso da biblioteca de fotos
Valor: $ (PRODUCT_NAME) uso de fotos

Compartilhamento de Bluetooth: Chave: Privacidade - Descrição do uso de periféricos Bluetooth
Valor: $ (PRODUCT_NAME) Uso periférico de Bluetooth

Microfone: Chave: Privacidade - Descrição do uso do microfone
Valor: $ (PRODUCT_NAME) uso do microfone

Câmera: Chave: Privacidade - Descrição de uso da câmera
Valor: $ (PRODUCT_NAME) uso da câmera

Localização: Chave: Privacidade - Localização Sempre
Valor Descrição de Uso : $ (PRODUCT_NAME) uso de localização

Chave: Privacidade - Local quando em uso
Valor da descrição de uso : $ (PRODUCT_NAME) uso do local

Heath: Chave: Privacidade -
Valor da descrição do uso de compartilhamento de saúde : $ (PRODUCT_NAME) uso de compartilhamento de saúde

Chave: Privacidade -
Valor da descrição de uso da atualização de saúde : $ (PRODUCT_NAME) uso de atualização de saúde

HomeKit: Chave: Privacidade - Descrição de uso do HomeKit
Valor: $ (PRODUCT_NAME) uso do kit doméstico

Biblioteca de mídia: Chave: Privacidade - Descrição de uso da biblioteca de mídia
Valor: $ (PRODUCT_NAME) uso da biblioteca de mídia

Movimento: Chave: Privacidade -
Valor da descrição do uso do movimento : $ (PRODUCT_NAME) uso do movimento

Reconhecimento de fala: Chave: Privacidade -
Valor da descrição do uso do reconhecimento de fala : $ (PRODUCT_NAME) uso de fala

SiriKit: Chave: Privacidade -
Valor da descrição de uso da Siri : $ (PRODUCT_NAME) siri use

Provedor de TV: Chave: Privacidade - Descrição de uso do provedor de TV
Valor: $ (PRODUCT_NAME) uso do tvProvider

Trinadh Koya
fonte
0

Para quem está se perguntando por que, de repente, seu aplicativo agora tem todas essas configurações de permissão, em primeiro lugar, pode ser por causa do CocoaPods ou do Carthage - eles colocam ganchos para todas essas permissões. Acabei de atualizar meu aplicativo para usar cordova-plugin-firebasex, que tem uma extensa instalação de Cocoapods (e dependências). Você pode desativar essas permissões ANTES de instalar cocoapods em seu projeto, colocando um PermissionsConfiguration.xcconfig na raiz de seu projeto - você pode ler mais sobre isso aqui: https://cocoapods.org/pods/Permission#installation

Isso tudo me surpreendeu quando a nova versão do meu aplicativo foi rejeitada com 7 chaves / string de permissões ausentes no arquivo Info.plist. Então, tive que cavar em meu projeto para descobrir o que estava causando isso, já que meu aplicativo não precisa ou usa nenhuma dessas permissões (nunca precisou).

Pode existir, mas no momento não consigo encontrar uma maneira de remover as permissões após a integração dos pods ... vou ter que pesquisar sobre como fazer isso sem começar meu projeto novamente.

rolinger
fonte