Mobileprovision и сертификат iOS: полное руководство по подписи приложений

Ошибка «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, DistributionDevelopment, Ad Hoc, App Store, Enterprise
Можно ли подписать без негоНетНет

Типы профилей и сертификатов

Для разных этапов жизненного цикла приложения используются разные комбинации. Сертификат разработки (Apple Development) нужен для отладки на своих устройствах, а сертификат распространения (Apple Distribution) — для публикации в App Store и распространения сборок тестировщикам.

Профили подготовки делятся на четыре основных вида. Профиль Development привязан к конкретному списку зарегистрированных устройств и работает только с сертификатом разработки. Профиль Ad Hoc позволяет распространять сборку вне App Store, но тоже только на заранее зарегистрированные устройства. Профиль App Store не содержит списка устройств вовсе — он предназначен исключительно для загрузки в магазин. Отдельно существует Enterprise-профиль для корпоративного распространения, доступный только участникам программы Apple Developer Enterprise Program.

📊 Какой способ подписи вы используете чаще всего?
Автоматическая подпись в Xcode
Ручное управление профилями
fastlane match или аналоги
Только начинаю разбираться

Как создать сертификат и mobileprovision

Процедура начинается с генерации запроса на сертификат на вашем Mac. Откройте Связку ключей и в меню выберите путь Связка ключей → Ассистент сертификации → Запросить сертификат у бюро сертификации. Укажите email и сохраните файл .certSigningRequest на диск — он понадобится на следующем шаге.

Далее все действия выполняются на портале разработчика. Вам нужно войти в учётную запись на сайте Apple Developer, перейти в раздел Certificates, Identifiers & Profiles и последовательно создать три сущности: сам сертификат (загрузив CSR-файл), идентификатор приложения в разделе Identifiers и, наконец, профиль в разделе Profiles, где вы свяжете сертификат, App ID и устройства.

☑️ Проверка перед созданием профиля

Выполнено: 0 / 5
⚠️ Внимание: сертификат без соответствующего закрытого ключа в связке ключей бесполезен. Если вы переехали на новый 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 и заново скачайте профиль с портала.