Как добавить Privacy Manifest

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

Поможем в чате для iOS разработчиков

Если вы используете User Defaults или собираете данные о пользователе, то вам нужно заполнить манифест. Всё что вы укажите появиться на странице приложения.

Авторы библиотеки тоже добавляют манифест. Но если они этого не сделали, то внутри проекта добавляет сам разработчик

Если у библиотеки есть манифест, то не нужно дублировать в ваш манифест. Когда архивируете проект, все манифесты объединяются в один.

Добавляем Манифест

Нажмите ⌘+N и выберите App Privacy-файл.

 Создаем App Privacy-файл
Создаем App Privacy-файл

У каждого таргета свой манифест, поэтому внимательно ставьте чекмарк нужному таргету. Если манифест одинаковый для всех таргетов, то можно сразу указать несколько таргетов.

 Указываем таргет для манифеста
Указываем таргет для манифеста

Структура Манифеста

Манифест это plist-файл с расширением .xcprivacy.

 Пример заполненного Privacy Манифеста
Пример заполненного Privacy Манифеста

Манифест состоит из трех полей. Первое про трекинг — его заполняете когда собираете почту или имя. Второе отвечает за системные API, например, User Defaults. Третьер отвечает за IDFA.

Разберем каждое поле подробнее.

Трекинг пользователя

Поле Privacy Nutrition Label Types описывает какие данные собираем о пользователе. Все что укажите в манифесте, будет видно в поле App Privacy на странице приложения:

 Информация какие данные собираем на странице App Store
Информация какие данные собираем на странице App Store

Collected Data Type — это тип данных, которые собираете о пользователе. Например, контакты или информация о платежах. Все типы на официальном сайте, свои добавлять нельзя. В plist-файл добавлять строку из Data type.

 Типы данных про контакты для Манифеста
Типы данных про контакты для Манифеста

Для каждого типа данных создаете новый Item. Поля ниже нужно указывать для каждого типа данных:

Linked to User — если собираете данные, связанные с личностью пользователя, ставьте YES.

Used for Tracking — если ли данные используются для трекинга, ставим YES.

Collection Purposes — здесь указываем причины почему собираем данные. Например, аналитика, реклама или аутентификация. Выбирать из доступного списка причин, свои указывать нельзя.

 Причины в Манифесте почему собираем данные
Причины в Манифесте почему собираем данные

Системное API

Для API отдельное поле Privacy Accessed API Types. Как раз по нему прилетает письмо с ошибками от Apple. В этом поле указываем какое API используем и почему.

 Тип API и причина его использования
Тип API и причина его использования

Это системные API, которые нужно указывать в манифесте:

Для каждого API по ссылке будет и список доступных причин. Свои причины указывать нельзя.

Если подходит несколько причин, нужно указывать все

IDFA

Если используете IDFA, добавьте поле Privacy Tracking Enabled и установите YES. Сразу добавляйте поле Privacy Tracking Domains, здесь нужно указать все домены, которые работают в IDFA.

 Поля для IDFA в Манифесте
Поля для IDFA в Манифесте
Если установили Privacy Tracking Enabled, то обязательно указать хотя бы один домен

Чтобы получить какие домены используются для IDFA, откройте профайлер ProductProfile. Теперь в окне выберите Network:

 Окно профайлера
Окно профайлера

В левом верхнем углу жмем кнопку Start Recording. Выбираете вкладку Points of Interest, здесь будет список всех доменов. В колонке Start Message видно домен и указано что его не добавили в манифест.

 Как собрать домены IDFA
Как собрать домены IDFA

Профайл иногда сбоит, если в Points of Interest ничего не показывает или вообще пропадает, вот второй способ. Выбираете вкладку вашего приложения, а в сессиях видны все домены.

 Все домены в сессиях приложения
Все домены в сессиях приложения

Теперь придется проверить каждый или участвует он в IDFA. Сделать придется вам лично.

Манифест в библиотеках

Авторы библиотеки тоже добавляют манифест. Но если они этого не сделали, то внутри проекта добавляет сам разработчик

Если автор библиотеки не добавил манифест, то разработчик должен заполнить манифест сам.

Если в библиотеке есть манифест и он заполнен, то не нужно дублировать информацию в главный манифест. Все манифесты объединяются в один, когда собираем архив.

Если в манифесте есть ошибки, то разработчику придется самому дополнить манифест внутри проекта. Например, Firebase Сrashlytics использует домен firebase-settings.crashlytics.com. В своем манифесте они это не указали:

 Ошибка манифесте Firebase
Ошибка манифесте Firebase

Мы это нашли с помощью профайлера. В такой ситуации добавляем домен в свой манифест, это перекроет проблемное поле в манифесте от Firebase.

В манифестах библиотек допускают ошибки — обязательно перепроверяйте.

Если ошибка в Манифесте

Ошибки придут на почту, только когда отправите приложение на проверку. Если просто выгрузить проект, то ошибок не будет

На почту придут ошибки только про системное API:

 Письмо с ошибками в манифесте
Письмо с ошибками в манифесте

Чтобы быстро найти ключи, ввидите в поиске NS. Именно их не хватает в вашем Манифесте. Даже если вы не используете это API, его могут использовать библиотеки, которые вы добавили в проект.

Вот NS ключи, и ссылки на ключ и причину на сайте Apple:

  1. NSPrivacyAccessedAPICategoryFileTimestamp
  2. NSPrivacyAccessedAPICategorySystemBootTime
  3. NSPrivacyAccessedAPICategoryDiskSpace
  4. NSPrivacyAccessedAPICategoryActiveKeyboards
  5. NSPrivacyAccessedAPICategoryUserDefaults

Финальный Манифест

Собираем архив Product -> Archive. Правой кнопкой по архиву, выбираем Generate Privacy Report.

 Экспорт финального манифеста
Экспорт финального манифеста

В экспорте PDF-файл. Все манифесты объединились в итоговый:

 PDF отчет со всеми манифестами
PDF отчет со всеми манифестами

Все поля что с расширением .app, это из вашего манифеста. Остальные поля это сторонние библиотеки в вашем проекте.

Поправить или дополнить статью через Pull Request