Missing Compliance в TestFlight: как исправить навсегда
Автор: Mehdi Azizi
Опубликовано , 9 мин
Missing Compliance значит, что Apple ждёт твою декларацию о шифровании. Разблокируй билд в App Store Connect и пропиши ключ, чтобы статус не возвращался.
Missing Compliance не ошибка: это билд, который ждёт твоего ответа про шифрование. Пока ты не ответил, билд недоступен твоим тестировщикам. Для этого билда ты отвечаешь на вопросы во вкладке TestFlight в App Store Connect. Для следующих прописываешь ключ ITSAppUsesNonExemptEncryption в Info.plist или ios.config.usesNonExemptEncryption в app.json, если у тебя Expo, и статус больше не появляется.
Мои iOS-приложения сделаны на Expo. В app.json приложения Solys ключ стоит в false, причём дважды: в ios.config и в ios.infoPlist. Этот гайд опирается на страницы Apple о статусах билдов и об экспортном соответствии бета-билдов, которые я перечитал 6 ноября 2026 года.
Что значит Missing Compliance
В списке статусов билдов Apple определяет его одной фразой: не хватает документации об экспортном соответствии, и от тебя ждут действия. Apple показывает его жёлтым, это цвет процесса, который идёт и зависит от тебя или от Apple, а в описании прямо сказано, что действие нужно с твоей стороны.
Зачем Apple вообще спрашивает? Это объясняет страница о правилах экспорта шифрования: когда ты отправляешь билд в TestFlight или App Store, ты загружаешь его на сервер в США. Если приложение распространяется за пределами США и Канады, на него распространяется американское экспортное право, в какой бы стране ни была зарегистрирована твоя компания. И как только приложение использует, содержит или встраивает шифрование, Apple считает это экспортом ПО для шифрования.
Итог: при каждой новой версии App Store Connect задаёт тебе вопросы о соответствии, если только твой Info.plist уже на них не отвечает. Поэтому первый билд на Expo почти всегда приходит в статусе Missing Compliance.
Как разблокировать ожидающий билд
Шаги взяты со страницы Apple об экспортном соответствии бета-билдов. Тебе нужна роль Account Holder, Admin или App Manager.
- В Apps открой своё приложение, затем вкладку TestFlight.
- В боковой панели в разделе Builds выбери платформу.
- В колонке Build нажми на иконку или номер нужного билда.
- Нажми Provide Export Compliance Information и ответь на вопросы.
- Если Apple просит документацию, нажми Go to App Encryption Page, чтобы её отправить. Иначе нажми Save.
Apple описывает и короткий путь: рядом с билдом ссылка Manage открывает те же вопросы, а Choose File позволяет приложить уже одобренную документацию. После сохранения билд переходит в Ready to Submit или сразу в Testing, если он идёт внутренней группе. Ready to Test появляется только после бета-ревью для внешних тестировщиков.
Ссылка Manage не кликается? Сначала проверь свою роль в команде: Apple разрешает отвечать только ролям Account Holder, Admin и App Manager, аккаунт Developer или Marketing ответить не может. Других причин Apple не документирует. Если билд только что загружен, дождись письма об окончании обработки (подробно об этом в гайде про номер билда и версию), потом обнови страницу.
Больше никогда не отвечать: ключ в проекте
Apple пишет на странице о бета-билдах: ты можешь указать в Info.plist, что приложение не использует шифрование или освобождено от требований, и тогда отвечать при каждой отправке больше не нужно. Ключ называется ITSAppUsesNonExemptEncryption. В Xcode он отображается как App Uses Non-Exempt Encryption.
| Твой инструмент | Файл | Где | Значение |
|---|---|---|---|
| Expo (EAS Build) | app.json | expo.ios.config | false |
| Expo, другой путь | app.json | expo.ios.infoPlist | false |
| Чистый React Native | Info.plist | App Uses Non-Exempt Encryption | NO |
| Xcode, Swift | Info.plist | App Uses Non-Exempt Encryption | NO |
В Expo ключ называется usesNonExemptEncryption, и справочник по конфигурации уточняет, что он записывает ключ Apple в Info.plist билда, а ios.config используется только при сборке: в продакшен-манифест он не попадает.
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
В Expo ios.infoPlist тоже принимает ключ под его именем от Apple с тем же значением: это вторая строка в app.json приложения Solys. В нативном проекте то же объявление занимает одну строку в Info.plist: ключ App Uses Non-Exempt Encryption (так его показывает Xcode) со значением NO. Значение булево, а не строка.
Ключ начинает действовать со следующего билда. Уже загруженный билд остаётся в Missing Compliance, пока ты не ответишь в App Store Connect: эти два действия не заменяют, а дополняют друг друга.
false или true: как решить
Apple определяет значение NO так: твоё приложение, включая сторонние библиотеки, не использует никакого шифрования или использует только шифрование, освобождённое от требований к документации. Иначе ставь YES.
Что обычно освобождено, согласно странице о правилах экспорта: шифрование, встроенное в систему, например HTTPS-соединения через URLSession. Что не освобождено: проприетарное шифрование, которое ты написал сам или встроил. Обзор экспортного соответствия добавляет важное напоминание: за интерпретацию отвечаешь ты, как и за последствия, если заявишь освобождение ошибочно.
Для приложения на Expo, которое ходит в API по HTTPS, хранит настройки и продаёт подписку, false это обычный ответ. Для приложения, которое само шифрует сообщения, файлы или хранилище, ответ true, и Apple ждёт документацию.
Не ставь
falseна автомате. Перепроверь зависимости: библиотека сквозного шифрования или самописное зашифрованное хранилище переводит тебя в категорию, где нужна документация.
Если приложение использует неосвобождённое шифрование
Страница о документации по шифрованию описывает процесс. В App Information рядом с App Encryption Documentation кнопка добавления открывает вопросы, затем Choose File для документа, затем Save. Apple просит заранее заполнить описание приложения и настроить его доступность, чтобы оценить, достаточно ли документации. Ориентир Apple: около двух рабочих дней, если пакет полный.
После одобрения документации Apple выдаёт значение, которое нужно прописать в ключ ITSEncryptionExportComplianceCode в Info.plist. С ним вопросы при каждой загрузке пропадают. Пока идёт проверка, билд показывает Waiting for Export Compliance Review или In Compliance Review: от тебя ничего не требуется.
Два момента, которые отмечает Apple, один на странице о правилах экспорта, другой в обзоре соответствия:
- Даже при освобождённом шифровании может потребоваться ежегодный отчёт о самоклассификации для правительства США. Он не нужен, если ты используешь неосвобождённое шифрование и предоставил документацию Apple.
- Франция тоже контролирует импорт и экспорт приложений с шифрованием. В обзоре Apple среди затронутых областей названы защищённое хранение, защищённые коммуникации и антивирусы, с исключениями для банковских и медицинских приложений, и есть ссылка на ANSSI.
Что дальше происходит в TestFlight
Разблокированный билд живёт обычной жизнью билда TestFlight, описанной в гайде TestFlight для тестирования iPhone-приложения: внутренние тестировщики получают его сразу, внешние после бета-ревью, а срок действия истекает через 90 дней, согласно списку статусов билдов. Другие возможные остановки при отправке из Expo, например уже использованный номер билда или отклонённый файл, разобраны в статье ошибки отправки EAS в App Store Connect, а вся цепочка целиком в гайде публикация приложения Expo в App Store через EAS.
В iOS & Android Kit есть мой стартовый код на Expo с уже прописанным ключом и путь от первого билда до страницы в App Store. Если хочешь понять, что ещё блокирует твою публикацию, бесплатная диагностика ответит за несколько вопросов и пришлёт мой чек-лист против отказов Apple. Все шаги подробно в гайде как опубликовать приложение в App Store.
Частые вопросы
Что значит Missing Compliance в TestFlight?
Билд ждёт твоей декларации об экспортном соответствии, то есть ответа об использовании шифрования. Apple относит его к статусам, которые требуют действия с твоей стороны. Пока ты не ответишь, билд не уйдёт тестировщикам.
Почему ссылка Manage в Missing Compliance не кликается?
Проверь свою роль: Apple разрешает отвечать только ролям Account Holder, Admin и App Manager. Других причин Apple не документирует. Если билд только что пришёл, обнови страницу после письма об окончании обработки.
Моё приложение использует только HTTPS, нужно ли отвечать «да» про шифрование?
Apple указывает, что встроенное в систему шифрование, например HTTPS-соединения через URLSession, обычно освобождено от требований к документации. В этом случае ключ ITSAppUsesNonExemptEncryption равен NO, при условии что ни одна сторонняя библиотека не добавляет проприетарное шифрование.
Нужно ли отвечать на вопросы о шифровании для каждого билда?
Да, пока в твоём Info.plist нет ключа ITSAppUsesNonExemptEncryption. С ним App Store Connect больше не задаёт вопросы. В Expo он настраивается в app.json через ios.config.usesNonExemptEncryption.
Где указать шифрование в app.json в Expo?
В app.json, в expo.ios.config, со значением "usesNonExemptEncryption": false, если приложение не использует неосвобождённое шифрование. EAS Build записывает ключ в Info.plist билда. Он действует со следующего билда, а не для уже загруженного.
Блокирует ли Missing Compliance и отправку в App Store?
Вопросы об экспортном соответствии задаются для любой новой версии, бета или App Store. Билд без ответа нельзя распространять. Ключ в Info.plist решает оба случая сразу.
Нужно ли мне подавать ежегодный отчёт о самоклассификации?
Apple отмечает, что использование освобождённого шифрования всё равно может потребовать ежегодного отчёта о самоклассификации для правительства США, и отсылает к официальной процедуре. Если приложение использует неосвобождённое шифрование и ты предоставил документацию Apple, этот отчёт не нужен.

