Ошибка «No matching provisioning profiles found» в Xcode почти всегда означает одно: файл mobileprovision не связан с действующим сертификатом разработчика iOS, и сборка приложения блокируется ещё до этапа компиляции. Эта пара — профиль подготовки и сертификат — фундамент всей системы подписи кода в экосистеме Apple, и без их корректной связки приложение невозможно установить даже на собственный iPhone для тестирования.
Разберёмся, что представляет собой файл .mobileprovision, чем он отличается от сертификата, как создать оба компонента в учётной записи Apple Developer и как диагностировать типовые ошибки подписи. Материал ориентирован на разработчиков, которые настраивают подпись вручную или столкнулись со сбоями автоматической настройки Xcode.
Что такое файл mobileprovision
Provisioning profile (профиль подготовки) — это файл с расширением .mobileprovision, который связывает воедино три сущности: ваш сертификат подписи, идентификатор приложения (App ID) и список устройств, на которых приложение разрешено запускать. По сути, это цифровое разрешение от Apple, подтверждающее: конкретный разработчик вправе устанавливать конкретное приложение на конкретные устройства.
Внутри файла в зашифрованном виде хранятся:
- 📋 App ID — уникальный идентификатор приложения (bundle ID);
- 🔑 Список сертификатов, которым разрешено подписывать приложение;
- 📱 Перечень UDID устройств (для профилей разработки и ad-hoc);
- ⚙️ Entitlements — разрешения на возможности вроде push-уведомлений или iCloud;
- 📅 Срок действия профиля, после которого он становится недействительным.
Проверить содержимое профиля можно прямо в терминале macOS, не открывая Xcode:
security cms -D -i profile.mobileprovision
Команда выведет XML-структуру профиля, где видны все перечисленные параметры, включая дату истечения и привязанные сертификаты.
Чем сертификат отличается от provisioning profile
Эти два понятия постоянно путают, хотя роли у них разные. Сертификат — это цифровое удостоверение личности разработчика или организации, выпущенное Apple. Он подтверждает, кто подписал код. Сертификат хранится в связке ключей (Keychain) на Mac вместе с закрытым ключом, без которого подпись невозможна.
Mobileprovision, в свою очередь, отвечает на вопрос где и что: на какие устройства можно ставить приложение и какими возможностями оно может пользоваться. Профиль ссылается на сертификат, но не заменяет его.
| Параметр | Сертификат | Mobileprovision |
|---|---|---|
| Назначение | Удостоверение личности разработчика | Разрешение на установку приложения |
| Где хранится | Связка ключей (Keychain) | Папка профилей Xcode |
| Что содержит | Публичный ключ, данные владельца | App ID, UDID устройств, entitlements |
| Типы | Development, Distribution | Development, Ad Hoc, App Store, Enterprise |
| Можно ли подписать без него | Нет | Нет |
Типы профилей и сертификатов
Для разных этапов жизненного цикла приложения используются разные комбинации. Сертификат разработки (Apple Development) нужен для отладки на своих устройствах, а сертификат распространения (Apple Distribution) — для публикации в App Store и распространения сборок тестировщикам.
Профили подготовки делятся на четыре основных вида. Профиль Development привязан к конкретному списку зарегистрированных устройств и работает только с сертификатом разработки. Профиль Ad Hoc позволяет распространять сборку вне App Store, но тоже только на заранее зарегистрированные устройства. Профиль App Store не содержит списка устройств вовсе — он предназначен исключительно для загрузки в магазин. Отдельно существует Enterprise-профиль для корпоративного распространения, доступный только участникам программы Apple Developer Enterprise Program.
Как создать сертификат и mobileprovision
Процедура начинается с генерации запроса на сертификат на вашем Mac. Откройте Связку ключей и в меню выберите путь Связка ключей → Ассистент сертификации → Запросить сертификат у бюро сертификации. Укажите email и сохраните файл .certSigningRequest на диск — он понадобится на следующем шаге.
Далее все действия выполняются на портале разработчика. Вам нужно войти в учётную запись на сайте Apple Developer, перейти в раздел Certificates, Identifiers & Profiles и последовательно создать три сущности: сам сертификат (загрузив CSR-файл), идентификатор приложения в разделе Identifiers и, наконец, профиль в разделе Profiles, где вы свяжете сертификат, App ID и устройства.
☑️ Проверка перед созданием профиля
⚠️ Внимание: сертификат без соответствующего закрытого ключа в связке ключей бесполезен. Если вы переехали на новый Mac и не перенесли ключи, экспортируйте сертификат со старого компьютера в формате .p12 вместе с закрытым ключом — иначе подписывать сборки не получится, и сертификат придётся отзывать и пересоздавать.
После создания профиль скачивается с портала и устанавливается двойным кликом — Xcode подхватывает его автоматически. Убедиться, что профиль на месте, можно в настройках проекта на вкладке Signing & Capabilities.
Типичные ошибки и их диагностика
Большинство проблем с подписью сводится к небольшому набору сценариев. Разберём самые частые.
«Provisioning profile doesn't include signing certificate» — профиль создан под другой сертификат. Откройте профиль командой security cms -D и сверьте отпечатки сертификатов внутри него с тем, что установлен в вашей связке ключей. Если они не совпадают, отредактируйте профиль на портале, отметив нужный сертификат, и скачайте его заново.
«Device is not registered» — UDID устройства не добавлен в профиль. Это актуально только для development и ad-hoc профилей: зарегистрируйте устройство в разделе Devices портала, затем пересоздайте профиль — простое добавление устройства на портале не обновляет уже выданный файл.
«Certificate has expired» или профиль просрочен — и сертификаты, и профили имеют ограниченный срок действия. Просроченный сертификат нельзя «продлить» — только создать новый и перепривязать профили к нему. Истёкший сертификат распространения не удаляет уже опубликованные приложения из App Store, но блокирует загрузку новых сборок — это важное различие, которое часто вызывает панику напрасно.
⚠️ Внимание: отзыв (revoke) сертификата распространения, используемого в Enterprise-программе, мгновенно останавливает работу всех корпоративных приложений на устройствах сотрудников. Перед отзывом любого сертификата убедитесь, что он не задействован в действующих сборках.
Где Xcode хранит профили
Установленные профили лежат в папке ~/Library/MobileDevice/Provisioning Profiles. При странных сбоях подписи помогает удалить оттуда устаревшие версии профилей и переустановить актуальные — Xcode иногда цепляется к старой копии с тем же именем.
Автоматическое и ручное управление подписью
Xcode предлагает два режима. Автоматический (Automatically manage signing) сам создаёт и обновляет сертификаты и профили через вашу учётную запись — удобно для одиночной разработки и быстрых экспериментов. Минус в том, что Xcode может отозвать существующий сертификат без явного предупреждения, что критично, если тот же сертификат используется на других машинах или в CI.
Ручной режим требует явно указать профиль для каждой конфигурации сборки, зато даёт полный контроль: ничего не отзовётся и не пересоздастся без вашего ведома. Для команд, где сертификаты и профили общие, существуют инструменты вроде fastlane match, которые хранят подписывающие активы в зашифрованном репозитории и синхронизируют их между разработчиками — это снижает риск рассинхронизации ключей.
Перенос сертификатов на другой Mac
Смена рабочей машины — классический момент, когда подпись «ломается». Причина почти всегда одна: сертификат в связке ключей нового компьютера есть, а закрытого ключа нет. Визуально это заметно в Связке ключей: у полноценного сертификата есть раскрывающийся треугольник с вложенным ключом.
Правильная процедура переноса выглядит так. На старом Mac найдите сертификат в связке ключей, выделите его вместе с закрытым ключом и экспортируйте через контекстное меню в файл .p12, задав пароль. Перенесите файл на новый компьютер и импортируйте двойным кликом, введя пароль. После этого скачайте актуальные профили с портала разработчика — сами профили переносить не обязательно, они всегда доступны в учётной записи.
Часто задаваемые вопросы
Можно ли установить приложение на iPhone без платного аккаунта разработчика?
Да, с бесплатной учётной записью Apple ID Xcode создаёт временный профиль для личной команды (Personal Team). Такие сборки работают ограниченное время и имеют ограничения по возможностям, но для обучения и локального тестирования этого достаточно.
Что будет, если истечёт срок действия mobileprovision?
Приложения, установленные с development или ad-hoc профилем, перестанут запускаться на устройствах. Приложения из App Store это не затрагивает — там действует механизм подписи самого магазина. Для восстановления работы тестовых сборок профиль нужно пересоздать и переустановить приложение.
Чем отличаются App ID и bundle ID?
Фактически это одно и то же значение в формате обратного домена, например com.example.myapp. Bundle ID задаётся в проекте Xcode, а App ID регистрируется на портале разработчика. Для успешной подписи они должны совпадать (либо App ID может быть wildcard-идентификатором, покрывающим несколько приложений).
Нужно ли отзывать старый сертификат при создании нового?
Не обязательно, если старый ещё действует и используется. Но если сертификат скомпрометирован или закрытый ключ утерян, отзыв — правильная мера. Перед отзывом проверьте, не завязаны ли на него действующие профили и сборки, особенно в корпоративной среде.
Почему Xcode не видит установленный профиль?
Возможные причины: профиль просрочен, создан под другую команду разработчиков, либо Xcode закэшировал старую версию. Проверьте папку ~/Library/MobileDevice/Provisioning Profiles, удалите устаревшие копии, перезапустите Xcode и заново скачайте профиль с портала.