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

Письмо от Apple
Письмо от Apple

Почему Apple отправляет письма разработчикам?

Apple стремится улучшать защиту данных пользователей и требует от разработчиков предоставления детальной информации о том, как их приложения используют личные данные. Введение требования о файле PrivacyInfo.xcprivacy направлено на то, чтобы разработчики явно указывали, какие данные собирают их приложения, и для каких целей эти данные используются.

Крайний срок для заполнения файла PrivacyInfo.xcprivacy

До 1 мая 2024 года все приложения должны быть обновлены и должны содержать файл PrivacyInfo.xcprivacy с корректно заполненной информацией о конфиденциальности.

Для начала обновим библиотеки

Большинство библиотек уже включают в себя Privacy Manifest. Проверьте обновления для используемых вами библиотек.

Alamofire уже добавили Privacy Manifest, а ты нет
Alamofire уже добавили Privacy Manifest, а ты нет

Создание и заполнение файла PrivacyInfo.xcprivacy

Создание файла

  1. File -> New -> File

  2. Выберите шаблон App Privacy

  3. Назовите файл PrivacyInfo и сохраните

Заполнение файла

  1. Указать тип данных из письма от Apple (например, местоположение, контакты, фотографии и т.д.)

  2. Найти категорию в документации

  3. Описать, как эти данные используются вашим приложением и обосновать необходимость сбора этих данных

Заполненный Privacy Manifest
Заполненный Privacy Manifest

Пример моего кода:

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

Полезные ссылки

Describing use of required reason API.

Privacy manifest files.

WWDC23 Privacy report.

Example of PrivacyInfo.xcprivacy.

Комментарии (6)


  1. aLeXv17
    04.04.2024 08:30
    +1

    Виталий, спасибо за статью.

    Не нашел в доках ответы (может, плохо искал) на возникшие вопросы, может ты знаешь или сталкивался?

    1) Если либа не собирает никакие privacy и не использует api нужен ли ей пустой файл xcprivacy?

    2) Что делать, если в приложении фичи лежат в local pods и соответственно линкуются как фреймворки. И в итоге они хоть и являются частью кода и даже репозитория, но лежат отдельно от основного таргета. Следует ли для них отдельно добавлять свои xcprivacy файлы или достаточно одного общего для всего приложения?


    1. vitalikbov Автор
      04.04.2024 08:30
      +1

      Спасибо за отзыв!

      1. В документации сказано, что файлы должны быть в библиотеках, которые используют определённые API. Соответственно, если API не используются - файл не нужен.

      2. При сборке проекта файлы из библиотек собираются в один общий файл. Таким образом не важно, где лежат файлы.

      Если приложение уже в сторе, надёжнее всего ориентироваться на письмо Apple. Ещё могу добавить, что файл обязательно нужен, если используются библиотеки, перечисленные здесь. Ну, и, дополнительно, можно прогнать свой проект скриптом, на который я ссылался в статье. Он подсветит классы, которые используют api, попадащие под privacy.


      1. aLeXv17
        04.04.2024 08:30

        Спасибо за ответ!


  1. NineNineOne
    04.04.2024 08:30

    Чуть больше недели назад писал статью на эту тему: https://telegra.ph/59-Nastraivaem-PrivacyInfoxcprivacy-03-23.

    Думал, такой контент на хабре не пройдет модерацию


    1. vitalikbov Автор
      04.04.2024 08:30

      Я тоже написал около недели назад. Всё это время ждал модерацию, т.к. статья сначала попадает в песочницу


    1. cher11
      04.04.2024 08:30
      +1

      А почему не пройдет? Статья же полезная, после 1 мая ещё и просмотры вырастут