Как поставлять приложение тестерам
Что проверяют
Выстроен ли у вас рутинный путь от сборки до тестировщика или каждый билд собирается руками на ноутбуке. Следом обычно спрашивают, чем внутренние тестировщики TestFlight отличаются от внешних и как вы подписываете сборки на CI.
Как отвечать
Опирайтесь на свой проект и называйте реальные цифры: сколько сборок в неделю, сколько занимает путь от мержа до установки. Каркас такой:
- TestFlight как основной канал: внутренних тестировщиков до 100, это участники команды в App Store Connect, сборка доступна им сразу после обработки. Внешних до 10 000, приглашение по почте или публичной ссылке, первая сборка версии проходит Beta App Review. Каждая сборка живёт 90 дней;
- автоматизация: сборку и загрузку выполняет CI, а не человек. Это Xcode Cloud или fastlane (
gymиpilot) на своём Mac либо на облачных macOS-раннерах. Для загрузки удобен ключ App Store Connect API вместо личного аккаунта с двухфакторкой; - подпись: сертификаты и профили в одном месте, например через
matchв fastlane, чтобы новая машина не ломала сборку; - окружения: отдельные схемы или конфигурации под stage и прод, понятная пометка в приложении, на какой бэкенд оно смотрит;
- обратная связь: заполненное поле «What to Test», скриншоты и крэши из TestFlight, связь сборки с задачами в трекере.
Запасной канал: Ad Hoc через Firebase App Distribution. Там нужны UDID устройств в профиле, а лимит 100 устройств каждого типа на год членства в программе.
Если сами поставку не настраивали, так и скажите, но покажите, что понимаете путь: archive, экспорт, загрузка, обработка, раздача группам. Добавьте, что бы вы автоматизировали первым.
Где спотыкаются
Говорят «скину .ipa в чат». Без UDID в профиле подписи сборка на устройство не встанет.
Забывают про номер сборки. CFBundleVersion должен расти с каждой загрузкой, иначе App Store Connect её отклонит.
Предлагают раздавать внешним тестировщикам через Enterprise-аккаунт. Он предназначен только для внутренних приложений сотрудников, такое использование нарушает условия программы.