# Сертификат разработчика iOS: provisioning profile и Expo

> Сертификат подтверждает, кто подписал приложение, а профиль говорит, какое оно и на каких iPhone работает. В Expo оба создаёт EAS.

Оригинальная страница: [Сертификат разработчика iOS: provisioning profile и Expo](https://devoria.fr/ru/blog/ios-developer-certificate-provisioning-profile-expo)
Автор: [Mehdi Azizi](https://devoria.fr/ru/mehdi-azizi)
Опубликовано: 2026-11-04
Последняя правка контента: 2026-11-04


Сертификат разработчика iOS подтверждает, кто подписал твоё приложение. Provisioning profile (профиль подготовки) связывает этот сертификат с конкретным приложением и определяет, где оно может запускаться. **С Expo тебе почти никогда не придётся делать их вручную: EAS создаёт их, хранит и обновляет, когда ты запускаешь сборку.**

Понимать, что делает каждый файл, всё равно полезно. В тот день, когда сборка не хочет устанавливаться или отправка застревает, именно это знание сэкономит тебе целый день. В этом гайде разберём четыре элемента, их срок жизни, ограничения Apple и типичные ошибки, с решением для каждой.

Я публикую свои iOS-приложения через Expo и EAS, в том числе Solys и TradaZen. Полный путь описан в статье [как опубликовать iOS-приложение без Mac](https://devoria.fr/ru/blog/publish-ios-app-without-mac-expo-eas). А здесь заглянем под капот подписи.

## Зачем Apple требует подпись

iOS-приложение должно быть подписано, чтобы установиться на iPhone или уйти в App Store Connect. Подпись гарантирует, что приложение от известного Apple разработчика и что с тех пор его никто не менял.

Для App Store есть одна успокаивающая деталь. Согласно [технической заметке Apple TN3161](https://developer.apple.com/documentation/technotes/tn3161-inside-code-signing-certificates), App Store проверяет, что твой сертификат распространения действителен в момент отправки, а затем переподписывает приложение, и оно больше не зависит от срока действия твоего сертификата. **Значит, сертификаты должны быть действительны в момент отправки, а не всё время жизни приложения.**

## Четыре элемента, которые нужно знать

[Документация Expo по учётным данным](https://docs.expo.dev/app-signing/app-credentials/) называет для iOS три: сертификат распространения, профили и ключ push-уведомлений. Я добавлю ещё идентификатор приложения, без которого не существует ни одного профиля.

### Сертификат распространения

Это твоя подпись разработчика. [Справка Apple по сертификатам](https://developer.apple.com/help/account/certificates/certificates-overview) выделяет два семейства:

- **Apple Development** нужен, чтобы запускать приложение на своих устройствах во время разработки. Он принадлежит конкретному человеку.
- **Apple Distribution** нужен для распространения на выбранные тестовые устройства или для отправки в App Store Connect. Он принадлежит команде, и создать его могут только владелец аккаунта или админ.

Сертификат распространения не привязан к конкретному приложению: один и тот же подписывает все твои приложения. К нему прилагается закрытый ключ, и подписывает именно он. Согласно TN3161, сертификат Apple обычно действует один год с момента создания.

### Идентификатор приложения (App ID)

App ID идентифицирует твоё приложение в профиле. Он повторяет твой bundle identifier, например `com.example.myapp` (вымышленный пример). Согласно [справке Apple](https://developer.apple.com/help/account/identifiers/register-an-app-id), он также содержит список разрешённых возможностей: push-уведомления, App Groups, Sign in with Apple…

В Expo это поле `ios.bundleIdentifier` в конфигурации. **Выбери его раз и навсегда**: он должен быть одинаковым везде, и в конфигурации, и в App Store Connect. App ID не истекает. А согласно [документации Expo по возможностям iOS](https://docs.expo.dev/build-reference/ios-capabilities/), EAS синхронизирует его возможности с твоей конфигурацией при каждой сборке.

### Provisioning profile

Профиль всё связывает. Он содержит App ID, сертификат и, в зависимости от типа, список разрешённых устройств. Тебя касаются три типа:

- **Development**: тестовое приложение на твоих зарегистрированных устройствах.
- **Ad hoc**: сборка, которую можно установить на конкретный список устройств, каждое определяется своим UDID. Это «внутреннее распространение» (internal distribution) в EAS.
- **App Store**: для App Store Connect и TestFlight. Списка устройств в нём нет, объясняет [заметка TN3125](https://developer.apple.com/documentation/technotes/tn3125-inside-code-signing-provisioning-profiles).

У каждого профиля есть срок действия: по Apple обычно не больше года, по Expo 12 месяцев.

### Ключ push-уведомлений (APNs)

Ключ APNs разрешает твоему серверу или серверу Expo отправлять уведомления в твоё приложение. Это файл .p8, который можно скачать только один раз: [Apple его не хранит](https://developer.apple.com/help/account/keys/create-a-private-key) в твоём аккаунте. Один ключ подходит для всех твоих приложений, и [срок его действия не истекает никогда](https://developer.apple.com/support/expiration/).

## Сводная таблица

| Элемент                      | Для чего                    | Срок            | Кто управляет в Expo  |
| ---------------------------- | --------------------------- | --------------- | --------------------- |
| Сертификат распространения   | Подписывать сборки          | Обычно один год | EAS, после входа      |
| App ID                       | Идентифицировать приложение | Не истекает     | Ты, потом EAS         |
| Профиль App Store            | Отправлять в Apple          | До 12 месяцев   | EAS                   |
| Профиль ad hoc               | Ставить на свои iPhone      | До 12 месяцев   | EAS и твои устройства |
| Push-ключ APNs               | Отправлять уведомления      | Не истекает     | EAS или ты            |
| Профиль бесплатного аккаунта | Тестировать через Xcode     | 7 дней          | Xcode, не EAS         |

«Ты, потом EAS»: ты выбираешь bundle identifier, EAS занимается возможностями. «EAS и твои устройства»: ты регистрируешь каждый тестовый iPhone, EAS делает профиль. Последняя строка касается бесплатного аккаунта Apple: согласно [справке Apple по аккаунтам](https://developer.apple.com/help/account/basics/about-your-developer-account), его профили истекают через 7 дней после создания.

## Ограничения Apple, которые нужно знать

- **Сертификаты распространения**: их очень мало на аккаунт. Справка Apple говорит об одном на тип распространения и на команду, таблица Expo о лимите в 2. Запомни правило: **не создавай новый сертификат при каждой сборке или на каждом компьютере.**
- **Ключи APNs**: максимум 2 на аккаунт, по данным Expo.
- **Профили**: без ограничений, по данным Expo.
- **Устройства**: до 100 на семейство продуктов и на год членства, согласно [справке Apple по устройствам](https://developer.apple.com/help/account/devices/devices-overview). Отключение устройства не освобождает место. Счётчик возвращается к 100 в начале следующего года членства, если ты удалишь устройства.

## Что EAS делает за тебя

Согласно [странице Expo об управляемых учётных данных](https://docs.expo.dev/app-signing/managed-credentials/), при первой iOS-сборке тебе предложат сгенерировать то, чего не хватает. Ты входишь в свой аккаунт Apple Developer, EAS создаёт сертификат распространения, профиль и push-ключ, а потом хранит их на своих серверах. Следующие сборки используют их повторно.

Три полезных момента:

- **Твой пароль Apple остаётся на твоём компьютере.** [Страница Expo о безопасности](https://docs.expo.dev/app-signing/security/) уточняет, что он не отправляется на их серверы, а сохранённые учётные данные зашифрованы.
- **`eas credentials` показывает всё**: сертификат, профили, push-ключ. Эта команда также позволяет их заменить или удалить.
- **Удаление в EAS не удаляет у Apple.** Чтобы освободить место, нужно отозвать сертификат на портале Apple.

Можно и держать всё под своим контролем через локальные учётные данные: файл `credentials.json` указывает на твой сертификат (.p12) и профиль (.mobileprovision). Expo просит добавить эти файлы в `.gitignore`. Это то же правило, что и для [API-ключей в приложении на Expo](https://devoria.fr/ru/blog/sekretnyj-api-klyuch-expo-prilozhenie): секрет никогда не попадает в репозиторий.

## Типичные ошибки и как их исправить

### Истёк профиль

Ad hoc-сборка содержит свой профиль внутри: когда он истекает, приложение перестаёт открываться на твоих тестовых iPhone. А вот в App Store, как подтверждает Expo, истечение никак не влияет на приложение в продакшене. **Решение: перезапусти сборку.** EAS сгенерирует новый профиль, или сделай это сам через `eas credentials`. Затем переустанови новую сборку на устройства.

Не путай с TestFlight: сборка в TestFlight истекает через 90 дней, независимо от сертификата. Подробности в статье [TestFlight для тестирования приложения на iPhone](https://devoria.fr/ru/blog/testflight-testirovanie-iphone-prilozheniya).

### Сертификат истёк или отозван

Apple говорит ясно: если твоё членство действительно, приложения, которые уже в App Store, не пострадают. Но отправить сборку, подписанную этим сертификатом, ты больше не сможешь. Сборка, которая отправлена, но ещё не подана на ревью, может получить статус Invalid Binary, если её сертификат отозван. А [профили, содержащие отозванный сертификат, становятся недействительными](https://developer.apple.com/help/account/certificates/revoke-a-certificate).

**Решение: создай новый сертификат через `eas credentials` или при следующей сборке**, а потом дай EAS пересоздать профили. И никогда не отзывай рабочий сертификат просто на всякий случай.

### Устройства нет в ad hoc-профиле

Ссылка на установку работает у тебя, но не на iPhone тестировщика. Причина: [документация Expo по внутреннему распространению](https://docs.expo.dev/build/internal-distribution/) объясняет, что установить приложение могут только устройства, которые были в профиле на момент сборки.

Решение:

1. Зарегистрируй устройство командой `eas device:create`.
2. Перезапусти сборку в интерактивном режиме, войдя в аккаунт Apple, чтобы EAS обновил профиль. Или переподпиши существующую сборку через `eas build:resign`, без полной перекомпиляции.
3. В CI неинтерактивный режим использует профиль повторно, не обновляя его список. Добавь опцию `--refresh-ad-hoc-provisioning-profile`.

На новом или только что продлённом аккаунте Apple может обрабатывать новое устройство от 24 до 72 часов. Поэтому первая сборка с ним может упасть: подожди и перезапусти.

### Достигнут лимит сертификатов

Apple отказывается создавать новый сертификат распространения. Часто где-то валяются старые сертификаты: созданные из Xcode на другом Mac или другим сервисом сборки. **Используй существующий сертификат, если у тебя есть его файл .p12. Если нет, отзови ненужный** на портале Apple. Отзыв не влияет на уже опубликованные приложения, но делает недействительными профили, которые его содержали.

### «Provisioning profile doesn't include signing certificate»

Это сообщение Xcode означает, что в профиле нет сертификата, чей закрытый ключ лежит на твоём компьютере. Типичная причина: смешивание автоматической подписи Xcode и учётных данных EAS. **Выбери один источник истины**: сборки EAS с управляемыми учётными данными или локальные учётные данные, но не то и другое сразу.

### Уведомления перестали приходить после отзыва ключа

Если ты отзовёшь ключ APNs, Expo предупреждает: все приложения, которые его используют, перестанут получать уведомления. Создай новый ключ и загрузи его через `eas credentials`. Токены Expo Push у твоих пользователей не меняются.

### Добавил возможность, а профиль стал недействительным

Включение сервиса вроде push-уведомлений или App Groups [делает профиль недействительным](https://developer.apple.com/help/account/provisioning-profiles/edit-download-or-delete-profiles): его нужно сгенерировать заново. С EAS синхронизация возможностей происходит при каждой сборке. Если профиль всё равно отклоняется, `eas credentials` позволяет создать новый.

## Что дальше после подписи

Подписанная сборка это лишь один этап. Карточка приложения, скриншоты, конфиденциальность и отправка на ревью собраны в статье [как опубликовать приложение в App Store](https://devoria.fr/ru/expertise/publish-app-on-app-store). Если у тебя ещё нет членства, начни с [аккаунта разработчика Apple](https://devoria.fr/ru/blog/akkaunt-razrabotchika-apple-cena). А чтобы понять, почему я советую Expo новичкам, прочитай [React Native и Expo для мобильного приложения](https://devoria.fr/ru/expertise/react-native-expo-mobile-app).

## Если ты готовишь первую публикацию

Перед первой отправкой пройди [бесплатную диагностику](https://devoria.fr/ru/diagnostic): она покажет, что на самом деле блокирует твой проект, и пришлёт мой чек-лист против отказов Apple.

Чтобы собрать приложение, подключить подписки и опубликовать его, не воюя с подписью, есть [iOS & Android Kit](https://devoria.fr/ru/kits/ios): он ведёт по пути из четырёх шагов со стартовым кодом моих приложений, в твоём темпе.

## Частые вопросы

### Что такое provisioning profile?

Это файл, который разрешает твоему приложению запускаться или уходить в Apple. Он связывает идентификатор приложения, сертификат и, в зависимости от типа, список устройств. В профиле App Store устройств нет, в ad hoc-профиле перечислено несколько.

### Сертификат разработчика iOS бесплатный?

Отдельной цены у него нет: сертификат распространения входит в Apple Developer Program за 99 $ в год. С бесплатным аккаунтом Apple Xcode позволяет тестировать максимум на 3 устройствах, но профили истекают через 7 дней, а публикация невозможна.

### Сколько действует сертификат распространения Apple?

Обычно один год с момента создания, по данным Apple. Provisioning profiles тоже действуют максимум 12 месяцев. А ключ push-уведомлений не истекает никогда.

### Что будет, если мой сертификат распространения истечёт?

С приложениями, которые уже в App Store, ничего, пока твоё членство действительно. Ты просто больше не сможешь отправить новую сборку, подписанную этим сертификатом. С EAS новый сертификат создаётся при следующей сборке или через `eas credentials`.

### Нужен ли Mac, чтобы создать сертификат iOS?

Нет, если работаешь через EAS. Ты входишь в аккаунт Apple из командной строки, и EAS генерирует сертификат и профиль, хоть на Windows, хоть на Linux. Без EAS классический способ идёт через Xcode или Связку ключей на Mac.

### Сколько устройств может быть в ad hoc-профиле?

Твой аккаунт может зарегистрировать до 100 iPhone за год членства, и столько же для каждого другого семейства устройств. Отключённое устройство всё равно учитывается. Чтобы тестировать с большим числом людей, используй TestFlight.


## Твой проект

[Review Kit](https://devoria.fr/ru/kits/app-review): Мой чек-лист для ревью в App Store, исправленные отказы Apple, чек-лист для Google Play и три скилла для Claude Code. 55 $.

[iOS & Android Kit](https://devoria.fr/ru/kits/ios): Создай своё приложение для iPhone и Android с Claude Code: стартовый код моих приложений, путь до публикации в сторах и все киты. 109 $.

[Диагностика: что отделяет тебя от твоего iPhone-приложения](https://devoria.fr/ru/diagnostic): 7 вопросов, 60 секунд: ты узнаешь, что на самом деле мешает тебе опубликовать iPhone-приложение, получишь путь из 4 этапов и подходящий тебе кит.
