Push-сертификат Apple: .p8 или .p12 в Expo
Автор: Mehdi Azizi
Опубликовано , 8 мин
Для push-уведомлений Apple даёт бессрочный ключ .p8 для всех твоих приложений или годовой сертификат .p12. В Expo ключом управляет EAS.
Push-сертификат Apple разрешает серверу отправлять уведомления в твоё приложение через APNs, сервис уведомлений Apple. Он бывает в двух видах: сертификат .p12, который действует год и привязан к одному приложению, или ключ .p8, который не истекает и подходит для всех приложений твоего аккаунта. С Expo сертификат тебе не нужен: EAS предлагает создать ключ .p8 при первой сборке, и push-сервис Expo использует его за тебя.
В гайде про сертификат разработчика и provisioning profile push-ключ упоминается в паре строк. Здесь разберём всё до конца: выбор между двумя форматами, окружения sandbox и production, продление и сбои, из-за которых уведомления не доходят в TestFlight.
Я публикую свои приложения через Expo и EAS. В конфигурации Solys и TradaZen объявлен плагин expo-notifications: именно он готовит приложение к приёму уведомлений.
Зачем Apple нужен сертификат или ключ
Push-уведомление уходит с сервера, твоего или сервера Expo, тот передаёт его в APNs, а APNs доставляет его на iPhone. Значит, APNs должен проверить, что этот сервер имеет право писать твоему приложению. Apple предлагает два способа это доказать.
- Подключение по токену, с ключом .p8. По словам Apple, оно быстрее, работает с нескольких серверов, а один ключ покрывает все приложения твоей команды или их часть. Сервер подписывает им токен, который нужно обновлять минимум раз в час.
- Подключение по сертификату, с файлом .p12. Apple уточняет, что такой сертификат привязан к одному приложению и действует год. Несколько приложений означают несколько сертификатов.
Страница Apple о сроках действия напоминает: ключ подписи токенов APNs не истекает никогда.
Таблица .p8 / .p12
| Критерий | Ключ .p8 | Сертификат .p12 |
|---|---|---|
| Срок действия | Не истекает | Один год |
| Охват | Все твои приложения | Одно приложение |
| Окружение | Выбирается при создании | Sandbox и production |
| Продление | Не нужно, кроме отзыва | Каждый год |
| Скачивание | Только один раз | Экспорт с Mac |
| Количество | Два на окружение | Один на приложение |
| Использование в Expo | Создаётся и управляется EAS | Нет в документации Expo |
Три уточнения. Файл .p8 скачивается только один раз: Apple не хранит его в твоём аккаунте. А .p12 экспортируется из связки ключей Mac, на котором создан сертификат. И лимит в два ключа на окружение касается ключей команды. Для ключей, ограниченных отдельными приложениями, Apple разрешает до 200 на окружение.
Страница Expo об учётных данных говорит только о push-ключе и допускает максимум два на аккаунт, не различая ни окружения, ни ключи для отдельных приложений. Для приложения на Expo правильный выбор: ключ .p8.
Sandbox и production: два окружения
У APNs два сервера: development, он же sandbox, и production. Apple отводит первый для тестов, а второй для опубликованных приложений. Приложение узнаёт, какой использовать, по entitlement aps-environment. По словам Apple, его значение зависит от профиля подписи: development с профилем разработки, production с профилем дистрибуции и для TestFlight.
Поэтому сборка TestFlight общается с production, точно так же, как App Store.
Со стороны Expo две детали. Документация expo-notifications говорит, что в проекте entitlement всегда прописан как development, а в архиве release-сборки переключается на production. И при создании токен Expo привязывается к окружению приложения, которое определяется автоматически: при отправке тебе ничего выбирать не нужно.
Если создаёшь ключ сам, Apple спросит его окружение и охват: вся команда или отдельные приложения. В документации для разработчиков теперь описаны ключи команды, ограниченные sandbox или production, а старые ключи, действующие везде, по-прежнему принимаются. А вот справка по аккаунту всё ещё утверждает, что ключ работает в обоих окружениях. Apple сам себе противоречит: ориентируйся на окружение, которое выбрал при создании. Ключ только для sandbox не подойдёт ни для TestFlight, ни для App Store.
Как Expo управляет push-ключом
Согласно гайду Expo по настройке, обновлённому 28 июля 2026 года, первая development-сборка предложит настроить push-уведомления и сгенерировать ключ APNs. Отвечай «да» на оба вопроса. Без EAS Build запусти eas credentials. Нужен платный аккаунт Apple Developer.
Дальше:
- EAS хранит ключ и привязывает его к приложению. По словам Expo, один ключ подходит для любого числа приложений, а загрузка нового не меняет токены Expo Push твоих пользователей.
- Твой сервер не обращается к APNs. Он отправляет в push-сервис Expo, а тот передаёт в APNs. Expo просит читать квитанции примерно через 15 минут после отправки: именно там видны ошибки.
- Плагин добавляет entitlement. Объяви
expo-notificationsвplugins:
{
"expo": {
"plugins": ["expo-notifications"]
}
}
Две ловушки. FAQ Expo говорит, что Expo Go не поддерживает push-уведомления начиная с SDK 53, а страница expo-notifications упоминает только Android. В обоих случаях Expo советует development-сборку: тестируй на ней. И удаление ключа через eas credentials убирает его с серверов Expo, но не из твоего аккаунта Apple. Чтобы освободить место, отзови ключ в портале Apple. Как и любой секрет, файл .p8 никогда не должен попасть в репозиторий: правило то же, что и для API-ключей приложения на Expo.
Продление: что на самом деле истекает
Ключ .p8 продлевать не нужно. Он перестаёт работать, только если ты его отзовёшь. Если подозреваешь, что он скомпрометирован, Apple советует создать новый ключ, переключиться на него и только потом отозвать старый. Как заменить ключ в Expo, описано в FAQ: eas credentials, iOS, твой профиль сборки, затем удаление push-ключа и генерация нового.
Сертификат .p12 истекает каждый год. Apple просит обновить его до окончания срока и следить за датой в связке ключей. После истечения или отзыва ты больше не сможешь отправлять уведомления в своё приложение. Отдельной процедуры продления Apple не описывает: создаёшь новый сертификат из идентификатора приложения, ставишь его на сервер до окончания срока, потом удаляешь старый. Лучшее продление: перейти на ключ.
Управляешь iPhone через Intune или другую систему управления устройствами? Это другой сертификат. Push-сертификат для управления устройствами создаётся на Apple Push Certificates Portal и продлевается каждый год. Apple советует записать использованный Apple-аккаунт: он понадобится для продления.
Типичные сбои и как их исправить
В development работает, в TestFlight нет
- Ты отправляешь не на тот токен. Сборка TestFlight регистрируется в production и получает новый токен. Токен из development-сборки не сработает: Apple отвечает
BadDeviceToken, когда токен не соответствует окружению. Бери токен из самого приложения в TestFlight. - У production-приложения нет push-учётных данных. Это диагноз из FAQ Expo. Проверь страницу учётных данных проекта на expo.dev или
eas credentials. - Твой ключ ограничен sandbox. Замени его ключом, который работает в production.
- iPhone не получает токен. Если ты установил сборку TestFlight поверх сборки из Xcode, Expo советует перезагрузить устройство.
«No valid aps-environment entitlement string found»
По FAQ Expo, эта ошибка означает, что для твоего iOS-проекта не настроен push-ключ. Проверь страницу учётных данных и запусти сборку заново: EAS предложит сгенерировать ключ. Ещё проверь, что expo-notifications указан в plugins.
ITMS-90078: Missing Push Notification Entitlement
Apple присылает это письмо после отправки сборки: похоже, приложение регистрируется в APNs, но в его подписи нет entitlement aps-environment. Это объясняет заметка Expo о SDK 51. Начиная с этого SDK, entitlement добавляется, только если установлен expo-notifications. Предупреждение возникает из-за двух проверок Apple. Первая сравнивает capabilities идентификатора приложения с entitlements приложения. Вторая находит в бинарнике метод регистрации уведомлений, который есть в коде Expo во всех приложениях.
Это предупреждение, а не отказ, уточняет Expo. Если ты используешь уведомления, добавь плагин и пересобери: EAS синхронизирует capabilities идентификатора приложения при каждой сборке. Если нет, убери capability Push Notifications у идентификатора в портале Apple. Предупреждение может остаться, но ни на что не повлияет.
InvalidCredentials или все приложения замолчали разом
InvalidCredentials в квитанции значит, что твои push-учётные данные больше не действительны, часто потому, что ключ отозван. Все приложения, которые его использовали, замолкают одновременно. Решение от Expo: eas credentials, затем новый ключ. Если в квитанции InvalidProviderToken, Expo советует пересобрать, заново сгенерировав push-ключ и профиль.
Перед включением уведомлений
Чтобы протестировать уведомления на своём iPhone до релиза, следуй гайду TestFlight для тестирования приложения. Если отправляешь тихие уведомления, чтобы будить приложение, перечитай guideline 2.5.4 о фоновых режимах. Вся цепочка без Mac описана в статье как опубликовать iOS-приложение без Mac, а этапы релиза на странице публикация приложения в App Store.
Перед первой отправкой пройди бесплатную диагностику: она покажет, что блокирует твой проект, и пришлёт мой чек-лист против отказов Apple. Чтобы собрать приложение, подключить подписки и опубликовать его, iOS & Android Kit ведёт тебя по маршруту из четырёх этапов со стартовым кодом моих приложений, в твоём темпе.
Частые вопросы
Истекает ли push-сертификат Apple?
Сертификат .p12 истекает через год, и уведомления перестают приходить, если его не заменить. Ключ .p8 не истекает никогда: он перестаёт работать, только если ты его отзовёшь. Это главная причина выбрать ключ.
Нужен ли отдельный push-сертификат для каждого приложения?
С сертификатом .p12 да: каждый сертификат привязан к одному приложению. Ключ .p8 подходит для всех приложений твоего аккаунта. Поэтому в Expo один ключ может покрыть весь твой каталог.
Как продлить push-сертификат Apple?
Создай новый сертификат из идентификатора приложения с новым запросом на подпись, установи его на сервер, затем удали старый. Сделай это до окончания срока. Проще всего перейти на ключ .p8, который продлевать не нужно.
Я потерял файл .p8, что делать?
Apple позволяет скачать его только один раз. Если ключ создал EAS, Expo его хранит, и уведомления продолжают работать. Если нет, создай новый ключ, добавь его через eas credentials, затем отзови старый в портале Apple. Токены Expo Push твоих пользователей не меняются.
Нужно ли пересобирать приложение после смены push-ключа?
Обычно нет. Ключ нужен серверу, который отправляет, а не установленному приложению, и Expo указывает, что новый ключ не меняет токены. Исключение: если в квитанциях InvalidProviderToken, Expo советует пересобрать с новым ключом и новым профилем.

