Загрузка приложения в TestFlight — обязательный этап перед релизом в App Store, но многие разработчики сталкиваются с ошибками на этом пути. От отсутствия сертификатов до проблем с версиями билда — каждая мелочь может задержать тестирование на неделю. Эта статья поможет избежатьных ловушек и ускорить процесс, будь вы новичок с первым приложением или опытный разработчик, мигрирующий на новую версию Xcode.
Мы разберём не только базовые шаги (создание архива, загрузку в App Store Connect), но и нюансы, о которых редко пишут: как правильно настроить Info.plist для бета-тестирования, почему Apple может отклонить билд из-за SKAdNetwork, и как автоматизировать процесс с помощью Fastlane. А ещё — актуальные лимиты TestFlight на 2026 год и способы их обойти.
1. Подготовка проекта перед загрузкой в TestFlight
Прежде чем архивировать приложение, убедитесь, что проект соответствует требованиям Apple для бета-тестирования. Начните с проверки Bundle Identifier — он должен быть уникальным и зарегистрирован в Apple Developer Account. Если вы используете com.company.appname, убедитесь, что домен company.com принадлежит вам или вашему клиенту.
Особое внимание уделите Info.plist:
- 🔧 CFBundleVersion — должна увеличиваться с каждым билдом (например,
1.0.0→1.0.1). - 📱 UIRequiredDeviceCapabilities — если ваше приложение не поддерживает iPad, добавьте
arm64в список. - 🔒 NSPhotoLibraryUsageDescription — без этого описания Apple отклонит билд, если вы запрашиваете доступ к фото.
Не забудьте про сертификаты и профили provisioning. Для TestFlight подходит App Store Distribution профиль, но если вы тестируете in-house (для внутренних тестеров), потребуется Ad Hoc или Enterprise профиль. Проверьте их актуальность в Apple Developer Portal — просроченные профили приведут к ошибке No suitable application records were found.
2. Архивирование приложения в Xcode
Процесс архивирования начинается в Xcode. Откройте проект, выберите целевое устройство (Generic iOS Device) и перейдите в Product → Archive. Если кнопка неактивна, проверьте:
- 🛠️ Наличие ошибок компиляции (даже warnings могут блокировать архивацию).
- 🔄 Правильно выбранную схему (Scheme) — она должна соответствовать таргету вашего приложения.
- 📱 Подключённое устройство или симулятор (хотя архив создаётся без них, Xcode иногда требует проверки).
После успешного архивирования откроется Organizer. Здесь выберите последний архив и нажмите Distribute App. На этапе распределения выберите App Store Connect (не Ad Hoc или Development!) и подтвердите экспорт. Xcode сгенерирует файл .ipa и загрузит его в App Store Connect.
Что делать, если архив не создаётся?
Если Xcode зависает на этапе"Processing app symbols", попробуйте:
1. Удалить папку ~/Library/Developer/Xcode/DerivedData.
2. Отключить Bitcode в настройках проекта (Build Settings → Enable Bitcode = NO).
3. Перезапустить Xcode с очисткой кэша (Shift + Cmd + K).
Важно: с 2023 года Apple требует, чтобы все новые приложения поддерживали 64-битную архитектуру и были собраны с Xcode 14 или новее. Если вы используете старую версию, билд будет отклонён с ошибкой ITMS-90023.
3. Загрузка билда в App Store Connect
После архивирования билд появится в App Store Connect в разделе TestFlight → iOS App. Если его там нет, проверьте:
- 🔄 Статус загрузки — иногда требуется до 10 минут для обработки.
- 📧 Уведомления на email, привязанный к Apple Developer Account — Apple может отправлять предупреждения о проблемах.
- 🛡️ Права доступа — у вашей учётной записи должна быть роль Admin, App Manager или Developer.
Перед отправкой на ревью заполните метаданные билда:
- Что нового в этой версии — краткое описание изменений (до 4000 символов). Используйте маркированный список для удобства тестеров.
- Контактная информация — email для обратной связи (тестеры будут писать сюда о багах).
- Примечания для ревьюера — если есть специфические инструкции (например,"Для тестирования платежей используйте тестовые кредитные карты").
Указаны все поддерживаемые устройства|Заполнено поле"Что нового"|Добавлены скриншоты (если требуется)|Проверены права доступа к аккаунту|Отключены неиспользуемые возможности (например, Game Center, если не нужен)-->
Если билд загружен, но не отправляется на тестирование, проверьте статус обработки в App Store Connect. Частая ошибка — Missing Export Compliance. Решается заполнением формы о шифровании в разделе App Information → Export Compliance.
4. Настройка тестирования в TestFlight
После одобрения билда (обычно занимает 1–2 часа) можно настроить тестирование. В App Store Connect перейдите в TestFlight → Группы тестеров. Здесь вы можете создать две категории:
| Тип группы | Макс. кол-во тестеров | Требования | Срок действия билда |
|---|---|---|---|
| Внутреннее тестирование | 100 человек | Email из Apple Developer аккаунта | 90 дней |
| Внешнее тестирование | 10 000 человек | Одобрение Apple (ревью 1–2 дня) | 90 дней |
| Публичное тестирование | 10 000 человек | Одобрение Apple + публичная ссылка | 90 дней |
Для внутреннего тестирования достаточно добавить email тестеров вручную. Для внешнего потребуется заполнить дополнительную информацию:
- 📝 Описание тестирования — цели, задачи, что именно тестировать.
- 📅 Сроки — дата начала и окончания (максимум 90 дней).
- 🔗 Ссылка на обратную связь — форма, email или Slack-канал для багрепортов.
Внутреннее (для команды)|Внешнее (для клиентов)|Публичное (открытая бета)|Не использую TestFlight-->
Внимание: если вы планируете тестировать платежи через StoreKit, включите StoreKit Testing in Sandbox в настройках проекта. Иначе тестеры увидят реальные цены, а транзакции будут отклоняться.
5. Приглашение тестеров и управление доступом
Тестеры получают приглашение по email с ссылкой на установку через TestFlight. Если письмо не приходит, проверьте:
- 📧 Папку Спам — иногда письма от Apple попадают туда.
- 🔄 Статус тестера в App Store Connect — должен быть
Active. - 📱 Версию TestFlight на устройстве тестера — требуется последняя версия.
Для упрощения процесса используйте публичные ссылки (доступны для внешнего тестирования). Сгенерировать её можно в настройках группы тестеров. Ссылка будет активна до истечения срока тестирования или до удаления билда. Пример ссылки:
https://testflight.apple.com/join/XXXXXXXX
Если тестер не может установить приложение, проверьте:
⚠️ Внимание: Устройство тестера должно работать на iOS 13.0 или новее. На iPad с iPadOS также требуется последняя версия TestFlight. Если приложение поддерживает только arm64, оно не установится на iPhone 5s и старше.
6. Типичные ошибки и их решения
Даже опытные разработчики сталкиваются с ошибками при загрузке в TestFlight. Вот самые распространённые и способы их исправления:
| Ошибка | Причина | Решение |
|---|---|---|
ITMS-90046 |
Несовпадение Bundle ID в проекте и App Store Connect |
Проверьте Bundle Identifier в Xcode и на портале разработчика. |
ITMS-90161 |
Отсутствует поддержка iPhone XS Max или новых устройств | Добавьте запусковые изображения (Launch Screen) для всех актуальных разрешений. |
ITMS-90685 |
Отсутствует SKAdNetwork для трекинга рекламы |
Добавьте ключ NSAdvertisingAttributionReportEndpoint в Info.plist. |
ITMS-90171 |
Незаполненное поле"Что нового в этой версии" | Заполните поле в App Store Connect перед отправкой на ревью. |
Если билд отклонён с ошибкой Guideline 2.1 — App Completeness, это означает, что приложение не готово к тестированию. Частые причины:
- 🔌 Отсутствует функциональность (например, кнопки не работают).
- 📱 Приложение крашится на запуске (проверьте логи в Xcode → Devices and Simulators).
- 🔒 Требуется авторизация, но нет тестовых аккаунтов.
Внимание: если вы используете Firebase или другие сервисы, требующие GoogleService-Info.plist, убедитесь, что файл добавлен в целевой пакет (Target Membership) и корректно подписан.
7. Автоматизация с Fastlane и CI/CD
Ручная загрузка билдов в TestFlight отнимает время, особенно если вы выпускаете обновления часто. Автоматизировать процесс поможет Fastlane — инструмент для управления релизами. Установите его через Gem:
sudo gem install fastlane -NV
Минимальный набор команд для загрузки в TestFlight:
fastlane pilot upload— загружает последний билд.fastlane pilot add"tester@example.com"— добавляет тестера.fastlane pilot build— создаёт новый билд и загружает его.
Для полной автоматизации настройте CI/CD (например, в GitHub Actions или Bitrise). Пример workflow для GitHub Actions:
name: Deploy to TestFlight
on: [push]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- run: bundle install
- run: fastlane beta
Если вы работаете с Flutter, добавьте в Fastfile шаг для сборки .ipa:
lane:beta do
build_ios_app(
scheme:"Runner",
export_method:"app-store"
)
upload_to_testflight
end
FAQ: Частые вопросы о TestFlight
Сколько времени занимает ревью билда для TestFlight?
Обычно 1–2 часа для внутреннего тестирования и 1–2 дня для внешнего. В редких случаях (например, если приложение использует чувствительные разрешения) ревью может затянуться до 5 дней. Проверяйте статус в App Store Connect в разделе Activity → All Builds.
Можно ли тестировать приложение на jailbreak-устройствах?
Технически да, но Apple может заблокировать аккаунт разработчика, если обнаружит такие устройства среди тестеров. Кроме того, на jailbreak-устройствах часто не работают функции, связанные с Keychain или Apple Pay.
Как удалить билд из TestFlight?
Перейдите в App Store Connect → TestFlight → Builds, выберите нужный билд и нажмите Stop Testing. Учтите, что после удаления тестеры не смогут установить эту версию, даже если у них осталась ссылка.
Что делать, если тестер не видит обновление в TestFlight?
Попросите тестера:
- Обновить приложение TestFlight в App Store.
- Удалить текущую версию приложения и установить заново через приглашение.
- Проверьте, что устройство тестера добавлено в список поддерживаемых (в настройках билда в App Store Connect).
Можно ли тестировать приложение без аккаунта разработчика?
Нет. Для загрузки в TestFlight обязателен активный Apple Developer Account (99$ в год). Альтернатива — использование Ad Hoc распределения (до 100 устройств), но это требует ручной установки .ipa через Xcode или AltStore.