- PVSM.RU - https://www.pvsm.ru -
Привет! На связи Максим, я QA и рассказываю про мобильное тестирование.
Ручные проверки, поиск логов, разбор крешей, автотесты — с чего бы ни начиналась работа тестировщика, первым делом приложение нужно установить на устройство. Звучит как самая простая часть работы, правда?
На Android так и есть: скачал APK, разрешил установку из неизвестных источников — готово. С iOS такой номер не прокатит. Во многих компаниях в качестве сервиса для распространения сборок используется Firebase AppDistribution. В связи с этим часто возникает вопрос от мобильных QA, у которых мало опыта — «Почему вместо кнопки „Скачать“ отображается „Зарегистрировать устройство“? Почти все сложности с установкой объясняются одним механизмом — подписью приложения. Если понять, как она устроена, то любой способ установки перестает быть набором инструкций. С подписи и начнем разбираться в способах установить тестовую сборку на iPhone.
iOS запускает только приложения, подписанные сертификатом разработчика. Вместе с подписью в сборку вшивается provisioning profile — профиль, в котором записано, кто подписал приложение и где ему разрешено работать. Получится ли установить приложение на ваш iPhone, решает именно профиль, а не сам файл сборки.
От типа профиля зависит, кому достанется сборка. Релизный профиль для App Store не привязан к конкретным устройствам: приложение проверяет и распространяет сама Apple. Для тестовых сборок в обход стора обычно используют Ad Hoc‑профиль, и в нём явно перечислены UDID всех устройств, на которые разрешена установка.
UDID — это идентификатор, который однозначно определяет конкретный iPhone, iPad или другое устройство Apple. Он пригодится не только для установки: например, по UDID указывают устройство в консольных утилитах, когда снимают с него логи. Если UDID вашего телефона нет в профиле, iOS откажется ставить приложение, и никакие настройки на самом телефоне это не исправят.
У этой схемы два неприятных следствия. Профиль вшивается в сборку в момент подписи, поэтому новое устройство попадёт только в сборки, собранные после его регистрации в аккаунте разработчика. Старые сборки о нём ничего не знают, поэтому их не получится запустить на новом устройстве.
Второе следствие — список не резиновый. Apple разрешает зарегистрировать по 100 устройств каждого типа (iPhone, iPad и так далее) на год участия в Apple Developer Program. Удалённое устройство освобождает место только при продлении участия, поэтому добавлять устройства стоит осознанно, а не «на всякий случай».
Есть и способы, которым список UDID не нужен вовсе:
TestFlight подписывает сборки тем же профилем, что и App Store, а доступ выдаёт не устройству, а конкретному человеку — по приглашению на Apple ID.
симулятор — приложение собирается под Mac и запускается на нём же, поэтому подпись для установки ему не нужна.
Перед тем, как перейдем к способам установить тестовое приложение на iOS — узнаем, как подготовить UDID.
Чтобы найти UDID — для начала нужно выяснить, как он выглядит. Состав UDID принципиально делятся на 2 типа:
современные устройства — 25 символов: 8 символов, дефис и ещё 16 символов. Например: 00008030-0014644202B00146;
старые модели (всё, что до выходило до iPhone X включительно) — 40 символов. Например: ed3f4964739e62a4782aa75b3e11c390b268526d.
Быстрее всего узнать UDID с помощью Mac и кабеля. Подключите устройство к Mac, откройте Finder и выберите устройство на панели слева. При каждом щелчке строка меняется: модель, серийный номер, UDID и так далее.
Есть UDID и в «Отчёте о системе» macOS, в разделе Аппаратное обеспечение → USB. Но там он притворяется серийным номером и теряет дефис. Его нужно вернуть после восьмого символа, иначе будет добавлен невалидный идентификатор (напр., 000080300014644202B00146 → 00008030-0014644202B00146).
Если у вас установлен Xcode, то тот же идентификатор можно найти, если перейти в Window → Devices and Simulators (⇧⌘2), в поле Identifier. Для этого нужно выбрать устройство на панели Devices слева.
А для любителей командной строки можно воспользоваться libimobiledevice [1] — кроссплатформенной библиотекой для работы с iOS‑устройствами. Достаточно одной команды, которая вернет UDID подключенного устройства:
idevice_id -l
Полученный UDID передайте тому, кто в команде управляет сертификатами и профилями, — обычно это iOS‑разработчик или тимлид. Он добавит устройство в Apple Developer и пересоберёт приложение. Все сборки, собранные после этого, можно будет поставить на ваш телефон.
Firebase App Distribution [2] — сервис Google для раздачи тестовых сборок. Разработчики или CI загружают туда сборку, а тестировщики получают письмо и ставят её прямо на телефон, без Mac и кабеля. Каждая сборка хранится 150 дней. У неё есть номер, описание и заметки к релизу, куда команды обычно пишут ветку и окружение. Поэтому для повседневного ручного тестирования это самый удобный вариант: нашёл в поиске номер сборки из CI и нажал «Скачать» → «Установить».
Чтобы до этого дойти, телефон нужно один раз настроить. Понадобятся Google‑аккаунт на рабочую почту и приглашение в проект: команда добавляет вас вручную или даёт invite‑ссылку (Firebase → App Distribution → Invite links). Дальше порядок такой:
Если на телефоне уже есть старый профиль Firebase, удалите его в Настройки → Основные → VPN и управление устройством. Иначе новый не установится, и это самая частая причина, по которой настройка тормозится еще на старте.
Откройте ссылку из письма‑приглашения на телефоне, причём именно в Safari: в других браузерах профиль не установится.
Войдите в Google‑аккаунт, примите приглашение и выберите приложение.
Согласитесь добавить App Distribution на главный экран и нажмите «Скачать профиль».
Откройте Настройки, нажмите на плашку «Профиль загружен» и установите профиль, подтвердив действие паролем устройства.
Профиль нужен не только ради иконки на рабочем столе. Через него App Distribution узнаёт UDID телефона и показывает его разработчикам в консоли Firebase. Но, как я говорил ранее, в сборку устройство попадёт только после регистрации в Apple Developer и пересборки. До этого у сборок вместо «Скачать» будет кнопка «Зарегистрировать устройство».
Отдельно стоит сказать о доступности. С 2 022 года доступ к Firebase для российских компаний ограничен, и из российской сети App Distribution может не открываться. Верный признак проблемы — непрогрузившиеся иконки приложений: в таком состоянии установка, скорее всего, закончится ошибкой. Многие команды из‑за этого перешли на альтернативы.
Иногда сервис раздачи недоступен или нужную сборку туда просто не загружали: например, она лежит в артефактах конкретного CI‑пайплайна. Тогда .ipa‑файл можно поставить напрямую через Mac. Ограничения подписи при этом никуда не деваются: если UDID нет в профиле сборки, установка закончится ошибкой.
Проще всего сделать это в Apple Configurator — перетащить .ipa мышкой на карточку подключённого устройства.

В Xcode то же самое делается в Window → Devices and Simulators: выберите устройство и нажмите «+» под списком Installed Apps.

А если установку нужно встроить в скрипт, пригодится утилита ideviceinstaller из той же libimobiledevice [1]:
ideviceinstaller -i MyApp.ipa # установить .ipa
ideviceinstaller -l # список установленных приложений
ideviceinstaller -U com.example.app # удалить приложение по Bundle Identifier
Если у вас есть доступ к коду, приложение можно собрать и запустить на подключённом iPhone прямо из Xcode. По сути, это тот же запуск, что и на симуляторе, только на настоящем железе. Главный бонус — режим отладки: в консоли Xcode в реальном времени видны логи, можно ставить брейкпоинты и смотреть, что происходит внутри. Так удобнее всего разбираться с багом, который воспроизводится только на устройстве, или проверять сценарии, завязанные на железо, — камеру, пуши, производительность — прямо из ветки.
Подготовка здесь дольше, чем у остальных способов. Нужно добавить учётную запись Apple в Xcode и выбрать её в поле Team на вкладке Signing & Capabilities, а устройство должно быть зарегистрировано в аккаунте разработчика. При первом подключении телефон спросит, доверять ли этому компьютеру. Начиная с iOS 16, без режима разработчика запуск не сработает: он включается в Настройки → Конфиденциальность и безопасность → Режим разработчика. Пункт появляется только после первого подключения к Xcode, а после включения телефон попросит перезагрузку.
Если Xcode всё равно отказывается запускать приложение, проверьте по очереди поле Team, доверие компьютеру и режим разработчика. Почти всегда проблема в одном из этих трёх пунктов.
Подписать сборку можно и бесплатным Apple ID (Personal Team), но тогда приложение проработает только 7 дней. А перед первым запуском разработчика придётся вручную разрешить в Настройки → Основные → VPN и управление устройством.

TestFlight [3] — официальный сервис Apple для бета‑тестирования. Сборка загружается в App Store Connect и подписывается профилем для App Store, поэтому список UDID ей не нужен. Доступ выдаётся конкретному человеку, а не устройству. Вы получаете приглашение на Apple ID по почте или публичной ссылке, ставите приложение TestFlight из App Store, нажимаете «Принять» и «Установить» — и сборка встаёт на любой ваш телефон без регистрации и пересборки. Если нужна не последняя сборка, а одна из предыдущих, её можно выбрать на странице приложения.
Тестировщики в TestFlight бывают двух видов:
— внутренние — до 100 участников команды в App Store Connect — получают сборку сразу после обработки;
— внешние — до 10 000 человек по приглашению или публичной ссылке — ждут, пока Apple одобрит первую сборку каждой версии, а это может занять время.
Каждая сборка работает 90 дней. Прямо из TestFlight можно отправить отзыв со скриншотом, а после креша — описать, что к нему привело.
Сборка в TestFlight подписана так же, как будущий релиз, поэтому он хорош для регресса и приёмки релиз‑кандидата. Ещё он выручает, когда тестировщиков много, а лимит UDID на исходе, и подходит для беты с коллегами из других отделов. Учтите одну деталь: у сборки из TestFlight тот же Bundle Identifier, что у версии из App Store, поэтому она заменит её на устройстве, а не встанет рядом.
С точки зрения подписи симулятор — самый простой способ. Приложение собирается под Mac и на нём же запускается, поэтому ни UDID, ни сертификаты не нужны. Если есть доступ к коду, достаточно открыть проект в Xcode, выбрать симулятор в верхней панели и нажать Run (⌘R). Первая сборка может идти долго, а последующие пойдут быстрее: Xcode кеширует промежуточные результаты в папке DerivedData и не компилирует заново то, что не изменилось.

Без доступа к коду симулятор тоже можно использовать. Попросите разработчиков собрать приложение под симулятор и передать вам .app‑файл. Его достаточно перетащить в окно запущенного симулятора или установить командой:
xcrun simctl install booted TestApp.app
А вот .ipa для реального устройства в симулятор не встанет: это сборки под разные платформы и процессорные архитектуры.
Симулятор незаменим для проверки вёрстки на разных моделях и версиях iOS, ведь переключение между ними занимает пару кликов. Он выручает, когда нужно проверить фичу прямо из ветки, не дожидаясь CI, или когда реального устройства под рукой нет. Но камеру и реальную производительность на нём не проверить, для этого всё равно нужен настоящий iPhone.
Даже когда всё сделано по инструкции, установка сборки иногда заканчивается ошибкой. Вот самые частые причины и что с ними делать.
«Не удаётся установить приложение» или вместо «Скачать» видна кнопка «Зарегистрировать устройство». Почти всегда это значит, что UDID устройства нет в профиле сборки. Проверьте, что устройство зарегистрировано, и ставьте сборку, собранную после регистрации. Старые сборки о новом устройстве ничего не знают.
Новый профиль Firebase не устанавливается. На устройстве остался старый профиль. Удалите его в Настройки → Основные → VPN и управление устройством и повторите установку.
Приложение установилось, но не запускается: «Ненадёжный корпоративный разработчик». Так iOS реагирует на сборки, подписанные корпоративным (Enterprise) сертификатом, — их нужно один раз разрешить вручную. Перейдите в Настройки → Основные → VPN и управление устройством, выберите профиль разработчика и нажмите «Доверять».
Приложение работало, а потом перестало открываться. У каждой сборки есть срок годности:
сборка из TestFlight — 90 дней;
сборка, подписанная бесплатным Apple ID, — 7 дней;
Ad Hoc‑ и Development‑сборки — пока действуют их профиль и сертификат (обычно до года).
Решение одно — поставить свежую сборку.
Xcode не запускает приложение на устройстве. Проверьте три вещи: включён ли режим разработчика, подтверждено ли доверие компьютеру на самом устройстве и выбрана ли Team на вкладке Signing & Capabilities.
Сравнительная таблица 5‑ти способов установить тестовую сборку на iOS:
|
Способ |
Где запускается |
Нужен Mac |
Нужна регистрация UDID |
Главное преимущество |
|---|---|---|---|---|
|
Firebase App Distribution |
Реальное устройство |
Нет |
Да |
Установка без проводов в пару тапов |
|
.ipa через Mac |
Реальное устройство |
Да |
Да |
Не нужен сервис раздачи сборок |
|
Xcode на устройстве |
Реальное устройство |
Да |
Да |
Отладка и логи в реальном времени |
|
TestFlight |
Реальное устройство |
Нет |
Нет |
Сборка подписана так же, как релиз |
|
Xcode Simulator |
Симулятор |
Да |
Нет |
Любая модель и версия iOS за пару кликов |
Если свести всё к одному правилу: сначала поймите, как подписана сборка, и выбор способа станет очевиден. Для повседневной проверки на своём телефоне подойдёт сервис раздачи вроде App Distribution, для приёмки релиза — TestFlight, для вёрстки — симулятор, а для отладки — Xcode на устройстве.
На этом тему со способами установить тестовое приложение на iOS можно считать закрытой. Поначалу установка сборки на iPhone кажется запутанной: профили, UDID, регистрация, пересборка. Но стоит один раз разобраться, как устроена подпись, зачем нужен UDID, и дальше всё сводится к простым действиям, которые потом делаешь по наитию. Сохраните статью в закладки — она пригодится в тот день, когда вместо кнопки «Скачать» вы снова увидите «Зарегистрировать устройство».
А как вы раздаёте тестовые сборки в своей команде? Поделитесь в комментариях.
Автор: Wizzzmo
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ios/460932
Ссылки в тексте:
[1] libimobiledevice: https://libimobiledevice.org/
[2] Firebase App Distribution: https://appdistribution.firebase.google.com
[3] TestFlight: https://apps.apple.com/app/testflight/id899247664
[4] Источник: https://habr.com/ru/articles/1099592/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1099592
Нажмите здесь для печати.