Если вы разработчик iOS (или Flutter, как я) приложений, вероятно, вы уже сталкивались с предупреждением от Apple: ITMS-91053: Missing API Declaration.

Почему Apple отправляет письма разработчикам?
Apple стремится улучшать защиту данных пользователей и требует от разработчиков предоставления детальной информации о том, как их приложения используют личные данные. Введение требования о файле PrivacyInfo.xcprivacy направлено на то, чтобы разработчики явно указывали, какие данные собирают их приложения, и для каких целей эти данные используются.
Крайний срок для заполнения файла PrivacyInfo.xcprivacy
До 1 мая 2024 года все приложения должны быть обновлены и должны содержать файл PrivacyInfo.xcprivacy с корректно заполненной информацией о конфиденциальности.
Для начала обновим библиотеки
Большинство библиотек уже включают в себя Privacy Manifest. Проверьте обновления для используемых вами библиотек.

Создание и заполнение файла PrivacyInfo.xcprivacy
Создание файла
File -> New -> File
Выберите шаблон App Privacy
Назовите файл PrivacyInfo и сохраните
Заполнение файла
Указать тип данных из письма от Apple (например, местоположение, контакты, фотографии и т.д.)
Найти категорию в документации
Описать, как эти данные используются вашим приложением и обосновать необходимость сбора этих данных

Пример моего кода:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>3B52.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>Disk space</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>7D9E.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>System boot time</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>User defaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>
Советы по заполнению
Убедитесь, что вы указываете все данные, которые собираете, а также цель сбора данных.
Будьте честны. Это поможет избежать проблем с проверкой приложения.
Если вы не знаете с какой целью в приложении используется определённая категория, вы можете найти в коде конкретные методы. Marco Eidinger рассказывает об этом способе в своей статье.
Заключение
Не забудьте, что до 1 мая 2024 все приложения должны быть обновлены с учетом новых требований конфиденциальности и должны содержать файл PrivacyInfo.xcprivacy. Не затягивайте с обновлением файла!
Если было интересно и полезно, приглашаю в свой Linkedin.
Полезные ссылки
Комментарии (6)
NineNineOne
04.04.2024 08:30Чуть больше недели назад писал статью на эту тему: https://telegra.ph/59-Nastraivaem-PrivacyInfoxcprivacy-03-23.
Думал, такой контент на хабре не пройдет модерацию
vitalikbov Автор
04.04.2024 08:30Я тоже написал около недели назад. Всё это время ждал модерацию, т.к. статья сначала попадает в песочницу
cher11
04.04.2024 08:30+1А почему не пройдет? Статья же полезная, после 1 мая ещё и просмотры вырастут
aLeXv17
Виталий, спасибо за статью.
Не нашел в доках ответы (может, плохо искал) на возникшие вопросы, может ты знаешь или сталкивался?
1) Если либа не собирает никакие privacy и не использует api нужен ли ей пустой файл xcprivacy?
2) Что делать, если в приложении фичи лежат в local pods и соответственно линкуются как фреймворки. И в итоге они хоть и являются частью кода и даже репозитория, но лежат отдельно от основного таргета. Следует ли для них отдельно добавлять свои xcprivacy файлы или достаточно одного общего для всего приложения?
vitalikbov Автор
Спасибо за отзыв!
В документации сказано, что файлы должны быть в библиотеках, которые используют определённые API. Соответственно, если API не используются - файл не нужен.
При сборке проекта файлы из библиотек собираются в один общий файл. Таким образом не важно, где лежат файлы.
Если приложение уже в сторе, надёжнее всего ориентироваться на письмо Apple. Ещё могу добавить, что файл обязательно нужен, если используются библиотеки, перечисленные здесь. Ну, и, дополнительно, можно прогнать свой проект скриптом, на который я ссылался в статье. Он подсветит классы, которые используют api, попадащие под privacy.
aLeXv17
Спасибо за ответ!