Что делает NSCalendarsUsageDescription обязательным?

Когда я загружаюсь в iTunes Connect, в моем приложении появляется ошибка, согласно NSCalendarsUsageDescription конфиденциальность NSCalendarsUsageDescription не предоставляется. Я знаю, что эта информация теперь обязательна, однако я не знаю, что и где мое приложение использует что-то, что потребует этого описания использования конфиденциальности.

Что мое приложение делает/использует, что для него требуется NSCalendarsUsageDescription?

Dear developer,

We have discovered one or more issues with your recent delivery for "MyApp". To process your delivery, the following issues must be corrected:

This app attempts to access privacy-sensitive data without a usage description. The app Info.plist must contain an NSCalendarsUsageDescription key with a string value explaining to the user how the app uses this data.

Once these issues have been corrected, you can then redeliver the corrected binary.

Regards,

The App Store team

Изменение: не дублировать из-за того, что решение не работает, поскольку я уже прокомментировал первый ответ и тот факт, что возможный дубликат фактически не отвечает на вопрос, что (как правило) делает это описание использования необходимым.

Ответ 1

Вы можете попробовать использовать nm tool для поиска специальных символов EventKit в ваших двоичных файлах frameworks, например:

nm YourFramework.framework/YourFramework | grep EK # EK is a prefix for EventKit classes

Или однострочный (искать файлы без расширения, также игнорировать CodeResources для уменьшения нерелевантного вывода):

find YourApp/Frameworks ! -name '*CodeResources*' -type f ! -name "*.*" -exec nm -o -- {} + | grep EK

Если есть такое, вы увидите что-то вроде:

0000000000003fdb t -[ClusterPrePermissions EKEquivalentEventType:]
                 U _OBJC_CLASS_$_EKEventStore

Ответ 2

Обновите файл Info.plist, добавив базу разрешений на почту отклонения или журнал ошибок.

NSCameraUsageDescription

<key>NSCameraUsageDescription</key>
    <string>$(PRODUCT_NAME) camera use.</string>

NSContactsUsageDescription

<key>NSContactsUsageDescription</key>
    <string>$(PRODUCT_NAME) contacts use.</string>

NSPhotoLibraryUsageDescription

<key>NSPhotoLibraryUsageDescription</key>
    <string>$(PRODUCT_NAME) photos and video use.</string>

NSBluetoothPeripheralUsageDescription

<key>NSBluetoothPeripheralUsageDescription</key>
    <string>$(PRODUCT_NAME) bluetooth use.</string>

NSMicrophoneUsageDescription

<key>NSMicrophoneUsageDescription</key>
    <string>$(PRODUCT_NAME) microphone use.</string>

NSMotionUsageDescription

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

NSLocationAlwaysUsageDescription

<key>NSLocationAlwaysUsageDescription</key>
    <string>$(PRODUCT_NAME) location use.</string>

NSLocationUsageDescription

<key>NSLocationUsageDescription</key>
    <string>$(PRODUCT_NAME) location use.</string>

NSLocationWhenInUseUsageDescription

<key>NSLocationWhenInUseUsageDescription</key>
    <string>$(PRODUCT_NAME) location use.</string>

NSRemindersUsageDescription

<key>NSRemindersUsageDescription</key>
    <string>$(PRODUCT_NAME) reminders use.</string>

NSSiriUsageDescription

<key>NSSiriUsageDescription</key>
    <string>$(PRODUCT_NAME) siri use.</string>

NSVideoSubscriberAccountUsageDescription

<key>NSVideoSubscriberAccountUsageDescription</key>
    <string>$(PRODUCT_NAME) video use.</string>

NSSpeechRecognitionUsageDescription

<key>NSSpeechRecognitionUsageDescription</key>
    <string>$(PRODUCT_NAME) speech recognition use.</string>

NSCalendarsUsageDescription

<key>NSCalendarsUsageDescription</key>
    <string>$(PRODUCT_NAME) user your calendar.</string>

ИЛИ

Разрешение отклонения приложений в отношении конфиденциальности данных

https://developer.apple.com/library/content/qa/qa1937/_index.html

Ответ 3

Согласно документации яблок:

NSCalendarsUsageDescription (String - iOS) Этот ключ позволяет описать причину, по которой ваше приложение обращается к пользовательским календарям. Когда система предложит пользователю разрешить доступ, эта строка отображается как часть предупреждения.

Затем он продолжает объяснять, как его реализовать:

Важно: Чтобы защитить конфиденциальность пользователей, приложение iOS, связанное с iOS 10.0 или после него, и которое обращается к пользовательским календарям, должно статически объявлять о намерении сделать это. Включите в свой файл Info.plist файл NSCalendarsUsageDescription и укажите целевую строку для этого ключа. Если ваше приложение пытается получить доступ к календарям пользователей без соответствующей целевой строки, ваше приложение завершает работу.

В основном просто вставьте это в файл info.plist

 <key>NSCalendarsUsageDescription</key>
<string>purpose for using calendar</string>

вы можете узнать больше о клавишах cocoa здесь

Ответ 4

Обновление до новой версии SDK AdMob решило мою проблему.

Ответ 5

Для тех, кто интересуется, почему в вашем приложении появились все эти настройки разрешений, в первую очередь это может быть связано с CocoaPods или Carthage - они подключили все эти разрешения. Я только что обновил свое приложение, чтобы использовать cordova-plugin-firebasex, который имеет обширную установку Cocoapods (и зависимостей). Вы можете отключить эти разрешения ДО того, как вы установите cocoapods в свой проект, поместив PermissionsConfiguration.xcconfig в корень вашего проекта - вы можете прочитать больше об этом здесь: https://cocoapods.org/pods/Permission#installation

Все это удивило меня, когда новая версия моего приложения была отклонена с 7 разрешениями key/string, отсутствующими в файле Info.plist. Затем мне пришлось покопаться в моем проекте, чтобы найти причину этого, так как моему приложению не нужны какие-либо из этих разрешений (и никогда не было).

Он может существовать, но в настоящее время я не могу найти способ удалить разрешения после интеграции модулей... мне придется покопаться в том, как это сделать, не запуская мой проект заново.