Aplikacja została odrzucona z powodu brakujących opisów użytkowania (Xcode8)

91

Więc dzisiaj dostałem tę wiadomość, mówiącą, że najnowsza wersja mojej aplikacji została odrzucona przez iTunes Connect z powodu brakujących opisów użytkowania. Byc dokładnym:

Ta aplikacja próbuje uzyskać dostęp do danych wrażliwych na prywatność bez opisu użytkowania. Aplikacja Info.plist musi zawierać klucz NSContactsUsageDescription z wartością ciągu wyjaśniającą użytkownikowi, w jaki sposób aplikacja używa tych danych.

Ta aplikacja próbuje uzyskać dostęp do danych wrażliwych na prywatność bez opisu użytkowania. Aplikacja Info.plist musi zawierać klucz NSCalendarsUsageDescription z wartością ciągu wyjaśniającą użytkownikowi, w jaki sposób aplikacja wykorzystuje te dane.

Ta aplikacja próbuje uzyskać dostęp do danych wrażliwych na prywatność bez opisu użytkowania. Aplikacja Info.plist musi zawierać klucz NSPhotoLibraryUsageDescription z wartością ciągu wyjaśniającą użytkownikowi, w jaki sposób aplikacja wykorzystuje te dane.

Ta aplikacja próbuje uzyskać dostęp do danych wrażliwych na prywatność bez opisu użytkowania. Aplikacja Info.plist musi zawierać klucz NSBluetoothPeripheralUsageDescription z wartością ciągu wyjaśniającą użytkownikowi, w jaki sposób aplikacja wykorzystuje te dane.

Ta aplikacja próbuje uzyskać dostęp do danych wrażliwych na prywatność bez opisu użytkowania. Aplikacja Info.plist musi zawierać klucz NSMicrophoneUsageDescription z wartością ciągu wyjaśniającą użytkownikowi, w jaki sposób aplikacja używa tych danych.

Ta aplikacja próbuje uzyskać dostęp do danych wrażliwych na prywatność bez opisu użytkowania. Aplikacja Info.plist musi zawierać klucz NSMotionUsageDescription z wartością ciągu wyjaśniającą użytkownikowi, w jaki sposób aplikacja wykorzystuje te dane.

Po rozwiązaniu tych problemów możesz ponownie dostarczyć poprawiony plik binarny.

Doszedłem do wniosku, że stały się one obowiązkowe w iOS 10, ale jedynym problemem jest to, że moja aplikacja nie prosi o pozwolenie na dostęp do któregokolwiek z nich. Sądziłem, że opis jest obowiązkowy tylko wtedy, gdy faktycznie poprosiłeś o pozwolenie?

Czy to dlatego, że jedna z moich zależności (Cocoapods) może zawierać kod żądający tych uprawnień? A może te opisy są obowiązkowe, nawet jeśli nigdy nie chcę wyświetlać kalendarza użytkowników, kontaktów itp.?

KimHafr
źródło
3
Z mojego doświadczenia - są one konieczne tylko wtedy, gdy żądasz uprawnień. Więc może jakaś zależność robi to za Ciebie. Ponadto WSZYSTKIE te uprawnienia pachną podejrzanie, zwłaszcza jeśli Twoja aplikacja jest prostą listą rzeczy do zrobienia. Może jakaś zależność prowadzi do phishingu?
Eimantas
Czy mógłbyś opublikować swoją PodFilei listę bibliotek, z których korzystasz (jeśli korzystasz z niektórych zewnętrznych cocoapods)?
Julien Quere
To był github.com/nickoneill/PermissionScope .. Dzięki za pomoc!
KimHafr
ُ jego wyjaśnione i pokazowe użycie: iosdevcenters.blogspot.com/2016/09/…
Saeid
mam dokładnie ten sam problem i wydaje mi się, że jest to spowodowane przez: pod 'ReactNativePermissions',: path => '../node_modules/react-native-permissions'
luky

Odpowiedzi:

33

Opisy są obowiązkowe w przypadku wszelkich treści, do których odsyłasz, lub ram, do których odsyłasz, przed próbą uzyskania dostępu. Błędy są generowane przy próbie uzyskania dostępu do treści, jeśli nie podano opisu użytkowania, więc jeśli otrzymujesz te błędy, aplikacja musi o nie prosić. Powinieneś dowiedzieć się, dlaczego Twoja aplikacja lub jej struktury wymagają tego i dodać odpowiednie opisy użytkowania do listy info.plist aplikacji.

Lub lepiej, jeśli nie potrzebujesz dostępu, sprawdź, czy istnieje sposób, aby go nie żądać (lub użyj struktur, które niepotrzebnie go wymagają).

Matthew Seaman
źródło
11
Przez całe życie nie wyobrażałem sobie, że dodam bibliotekę z prośbą o wszystkie te uprawnienia. Ale to było takie oczywiste, kiedy to znalazłem: github.com/nickoneill/PermissionScope
KimHafr
1
Tak, taka struktura może nie być świetnym pomysłem, ponieważ powoduje, że aplikacja deklaruje o wiele więcej uprawnień, niż potrzebuje.
Matthew Seaman
3
Wydaje mi się, że to bardziej funkcja niż błąd. ITunes Connect wykrywa, że ​​gdzieś w Twojej aplikacji ktoś może poprosić o uprawnienia. W takim przypadku musisz wypełnić opisy użycia dla wszystkich z nich, na wypadek gdybyś mógł faktycznie wywołać część kodu w permissionscope. Framework też mi się podoba i nie jestem gotowy, aby go zastąpić. Więc wypełniłem jakiś fałszywy tekst i aplikacja została zatwierdzona.
Przesłałem
15
Potrzebujesz sposobu, aby wykryć, która struktura prosi o te uprawnienia?
neobie
5
Neobie - czy znalazłeś, jak możesz wykryć frameworki żądające uprawnień?
Nitesh
140

iOS 10 musi dodać uprawnienia w info.plist, po prostu przejrzyj ten BLOG: - ustawienia-w-ios-10 masz cały pomysł.

Dodaj uprawnienia w pliku info.plist na podstawie dziennika błędów .

Uwaga: wpisz właściwy powód zezwolenia w wartości ciągu, w przeciwnym razie Apple ponownie odrzuci aplikację.

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>

wprowadź opis obrazu tutaj

Mitul Marsoniya
źródło
Czy nie powinno to być „$ {PRODUCT_NAME}” zamiast „$ (PRODUCT_NAME)”? "{}" zamiast "()".
backslash-f
@ backslash-f, sprawdź istniejący plik plist w nowym projekcie i tak powinno być $(PRODUCT_NAME). Możesz zobaczyć domyślną właściwość, taką jak Bundle namew pliku plist.
Jayesh Thanki
1
Pamiętaj, że ogólny opis, taki jak ten, nie pozwoli Ci już przejść przez proces zatwierdzania sklepu z aplikacjami. Po prostu dwa razy pobijaliśmy podobne opisy. Musisz opisać rzeczywiste użycie dla człowieka
O'Rooney
9

Możesz dodać do swojej info.plist jak:

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

itp.

Nadzieja komuś pomoże ...

mgyky
źródło
6

Miałem ten sam problem i wygląda na to, że jeśli jakikolwiek framework, z którym łączysz się, zawiera kod, który prosi o to pozwolenie (nawet jeśli Twoja aplikacja nigdy ich nie żąda), opisy użytkowania są konieczne. Ale zgodnie z moim testem, jeśli ich nie poprosisz, nie pojawią się na liście uprawnień Twojej aplikacji.

Dielson Sales
źródło
3

Kalendarz: Klucz: Prywatność - Kalendarze Opis zastosowania
Wartość: wydarzenia kalendarza $ (PRODUCT_NAME)

Przypomnienie: Klucz: Prywatność - Przypomnienia Opis użycia
Wartość: użycie przypomnienia $ (PRODUCT_NAME)

Kontakt : Klucz: Prywatność - Opis wykorzystania kontaktów
Wartość: wykorzystanie kontaktu $ (PRODUCT_NAME)

Zdjęcie: Klucz: Prywatność - Opis wykorzystania biblioteki zdjęć
Wartość: Wykorzystanie zdjęć $ (PRODUCT_NAME)

Udostępnianie Bluetooth: Klucz: Prywatność - Opis wykorzystania urządzeń peryferyjnych Bluetooth
Wartość: $ (PRODUCT_NAME) Używanie urządzeń peryferyjnych Bluetooth

Mikrofon: Klucz: Prywatność - Opis użycia mikrofonu
Wartość: użycie mikrofonu $ (PRODUCT_NAME)

Kamera: Klucz: Prywatność - Opis użycia kamery
Wartość: Użytkowanie kamery $ (PRODUCT_NAME)

Lokalizacja: Klucz: Prywatność - Lokalizacja Zawsze Opis użycia
Wartość: $ (PRODUCT_NAME) użycie lokalizacji

Klucz: Prywatność - Lokalizacja podczas użytkowania Opis użycia
Wartość: $ (PRODUCT_NAME) użycie lokalizacji

Zdrowie : Klucz: Prywatność - Zdrowie Użycie udziału Opis
Wartość: $ (PRODUCT_NAME) wykorzystanie udziału zdrowotnego

Klucz: Prywatność - Aktualizacja stanu zdrowia Opis użycia
Wartość: użycie aktualizacji zdrowia $ (PRODUCT_NAME)

HomeKit: Klucz: Prywatność - Opis wykorzystania HomeKit
Wartość: Użytkowanie zestawu domowego $ (PRODUCT_NAME)

Biblioteka multimediów: Klucz: Prywatność - Opis wykorzystania biblioteki multimediów
Wartość: użycie biblioteki multimediów $ (PRODUCT_NAME)

Ruch: Klucz: Prywatność - Opis użycia ruchu
Wartość: Wykorzystanie ruchu $ (PRODUCT_NAME)

Rozpoznawanie mowy: Klucz: Prywatność - Rozpoznawanie mowy Opis zastosowania
Wartość: $ (PRODUCT_NAME) użycie mowy

SiriKit: Klucz: Prywatność - Opis wykorzystania Siri
Wartość: użycie Siri $ (PRODUCT_NAME)

Dostawca telewizji: Klucz: Prywatność - Opis wykorzystania dostawcy telewizji
Wartość: $ (PRODUCT_NAME) Wykorzystanie przez tvProvider

Trinadh Koya
źródło
0

Każdy, kto zastanawia się, dlaczego nagle Twoja aplikacja ma teraz wszystkie te ustawienia uprawnień, może to być spowodowane CocoaPods lub Carthage - umieszczają haczyki na wszystkich tych uprawnieniach. Właśnie zaktualizowałem moją aplikację do korzystania z cordova-plugin-firebasex, który ma rozbudowaną instalację Cocoapods (i zależności). Możesz wyłączyć te uprawnienia PRZED zainstalowaniem cocoapods w swoim projekcie, umieszczając PermissionsConfiguration.xcconfig w katalogu głównym swojego projektu - możesz przeczytać więcej na ten temat tutaj: https://cocoapods.org/pods/Permission#installation

To wszystko mnie zaskoczyło, gdy nowa wersja mojej aplikacji została odrzucona z brakiem 7 kluczy / ciągu uprawnień w pliku Info.plist. Następnie musiałem zagłębić się w mój projekt, aby znaleźć przyczynę tego problemu, ponieważ moja aplikacja nie potrzebuje ani nie używa żadnego z tych uprawnień (nigdy nie ma).

Może istnieć, ale w tej chwili nie mogę znaleźć sposobu na usunięcie uprawnień po integracji z podami ... będę musiał przekopać się, jak to zrobić bez rozpoczynania projektu od nowa.

rolinger
źródło