Apple プッシュ通知証明書:Expoなら.p8と.p12どっち?
著者:Mehdi Azizi
公開・8 分
Appleのプッシュ通知には、有効期限がなく全アプリで使える.p8キーと、毎年更新の.p12証明書があります。ExpoならEASがキーを管理します。
Appleのプッシュ証明書は、サーバーがAppleの通知サービスであるAPNsを通じてアプリに通知を送ることを許可するものです。形式は2つあります。有効期間1年で1つのアプリに紐づく.p12証明書と、有効期限がなくアカウント内の全アプリで使える.p8キーです。Expoなら証明書は不要です。最初のビルド時にEASが.p8キーの作成を提案してくれて、Expoのプッシュサービスがそれを代わりに使ってくれます。
開発者証明書とプロビジョニングプロファイルのガイドでは、プッシュキーについて数行しか触れていません。この記事では最後まで掘り下げます。2つの形式の選び方、sandboxとproductionの環境、更新、そしてTestFlightで通知が届かなくなる障害についてです。
僕はExpoとEASでアプリを公開しています。SolysとTradaZenは設定でexpo-notificationsプラグインを宣言しています。アプリが通知を受け取れるよう準備するのはこのプラグインです。
Appleが証明書やキーを求める理由
プッシュ通知は、自分のサーバーかExpoのサーバーから送られ、APNsに渡され、APNsがiPhoneに届けます。つまりAPNsは、そのサーバーにアプリへ送信する権限があるかを確認する必要があります。Appleはその証明方法を2つ用意しています。
- .p8キーによるトークンベースの接続。 Appleによると、こちらのほうが高速で、複数のサーバーから使え、1つのキーでチームの全アプリまたは一部のアプリをカバーできます。サーバーはこのキーでトークンに署名し、そのトークンは少なくとも1時間ごとに作り直す必要があります。
- .p12ファイルによる証明書ベースの接続。 Appleの説明では、この証明書は1つのアプリに紐づき、有効期間は1年です。アプリが複数なら証明書も複数必要です。
Appleの有効期限に関するページにもあるとおり、APNsのトークン署名キーは期限切れになりません。
.p8と.p12の比較表
| 項目 | .p8キー | .p12証明書 |
|---|---|---|
| 有効期間 | 期限なし | 1年 |
| 対象範囲 | 全アプリ | 1つのアプリのみ |
| 環境 | 作成時に選択 | sandboxとproduction |
| 更新 | 不要(失効させない限り) | 毎年 |
| ダウンロード | 1回のみ | Macから書き出し |
| 数 | 環境ごとに2つ | アプリごとに1つ |
| Expoでの利用 | EASが作成・管理 | Expoのドキュメントに記載なし |
補足が3つあります。.p8ファイルは1回しかダウンロードできません。Appleはアカウント内に保管しません。一方.p12は、証明書を作成したMacのキーチェーンから書き出します。また、環境ごとに2つという上限はチームキーの話です。特定のアプリに限定したキーなら、Appleは環境ごとに最大200個まで認めています。
Expoの認証情報に関するページはプッシュキーにしか触れておらず、上限をアカウントあたり最大2つとしていて、環境やアプリ別キーの区別はしていません。Expoアプリなら、.p8キーが正解です。
sandboxとproduction:2つの環境
APNsには開発用(sandboxとも呼ばれます)と本番用の2つのサーバーがあります。Appleは前者をテスト用、後者を公開済みアプリ用としています。どちらを使うかは、アプリのaps-environment entitlementで決まります。Appleによると、その値は署名プロファイルに従います。開発用プロファイルならdevelopment、配布用プロファイルとTestFlightならproductionです。
つまりTestFlightのビルドは、App Storeとまったく同じくproductionと通信します。
Expo側では2つ注意点があります。expo-notificationsのドキュメントによると、プロジェクト内のentitlementは常にdevelopmentと書かれ、リリースビルドのアーカイブでproductionに切り替わります。また、Expoのトークンは作成時にアプリの環境に紐づけられ、それは自動で検出されます。送信時に何かを選ぶ必要はありません。
自分でキーを作る場合、Appleは環境と対象範囲(チーム全体か特定のアプリか)を聞いてきます。開発者向けドキュメントでは現在、sandboxまたはproductionに限定したチームキーが説明されていて、どちらでも使える従来のキーも引き続き使えます。ところがアカウントのヘルプでは、いまだにキーは両方の環境で使えると書かれています。Apple自身が矛盾しているので、作成時に選んだ環境を基準に考えてください。sandbox専用のキーは、TestFlightでもApp Storeでも使えません。
Expoはプッシュキーをどう管理するか
Expoのセットアップガイド(2026年7月28日更新)によると、最初の開発ビルドでプッシュ通知の設定とAPNsキーの生成を提案されます。どちらも「はい」と答えましょう。EAS Buildを使わない場合はeas credentialsを実行します。有料のApple Developerアカウントが必要です。
その後は次のとおりです。
- EASがキーを保管し、アプリに紐づけます。 Expoによると、1つのキーは何個のアプリにでも使え、新しいキーをアップロードしてもユーザーのExpo Pushトークンは変わりません。
- 自分のサーバーはAPNsを呼び出しません。 Expoのプッシュサービスに送り、それがAPNsに転送します。Expoは送信から約15分後にレシートを確認するよう求めています。エラーが表示されるのはそこです。
- プラグインがentitlementを設定します。
pluginsにexpo-notificationsを宣言してください。
{
"expo": {
"plugins": ["expo-notifications"]
}
}
落とし穴が2つあります。ExpoのFAQでは、SDK 53以降Expo Goはプッシュ通知に対応しないとされていますが、expo-notificationsのページではAndroidのみが対象になっています。どちらにしてもExpoは開発ビルドを推奨しているので、それでテストしましょう。また、eas credentialsでキーを削除しても、消えるのはExpoのサーバーからで、Appleアカウントからではありません。枠を空けたいなら、Appleのポータルで失効させてください。他のシークレットと同じく、.p8ファイルは絶対にリポジトリに入れないこと。ルールはExpoアプリのAPIキーと同じです。
更新:本当に期限が切れるもの
.p8キーは更新不要です。 止まるのは自分で失効させたときだけです。漏洩した疑いがあるなら、Appleの推奨は、新しいキーを作成して切り替え、そのあとで古いキーを失効させることです。Expoでキーを差し替える手順はFAQにあります。eas credentials、iOS、ビルドプロファイルの順に選び、プッシュキーを削除して新しいキーを生成します。
.p12証明書は毎年期限が切れます。 Appleは期限前に更新し、キーチェーンで有効期限を確認するよう求めています。期限切れや失効になると、アプリに通知を送れなくなります。Appleは独立した更新手順を説明していません。アプリのIDから新しい証明書を作成し、期限前にサーバーにインストールしてから、古い証明書を外します。一番の更新方法は、キーに移行することです。
IntuneなどのデバイスMDMツールでiPhoneを管理していますか?それは別の証明書です。デバイス管理用のプッシュ証明書はApple Push Certificates Portalで作成し、毎年更新します。Appleは使ったAppleアカウントをメモしておくよう勧めています。更新時に必要になるからです。
よくある障害と対処法
開発では動くのにTestFlightでは動かない
- 送信先のトークンが違います。 TestFlightビルドはproductionに登録され、新しいトークンを取得します。開発ビルドのトークンは使えません。トークンが環境と一致しない場合、Appleは
BadDeviceTokenを返します。TestFlightアプリそのものからトークンを取得してください。 - 本番アプリにプッシュの認証情報がありません。 ExpoのFAQにある診断です。expo.devのプロジェクトの認証情報ページか、
eas credentialsで確認しましょう。 - キーがsandbox限定になっています。 productionで使えるキーに置き換えてください。
- iPhoneがトークンを取得できていません。 Xcodeビルドの上にTestFlightビルドをインストールした場合、Expoはデバイスの再起動を勧めています。
「No valid aps-environment entitlement string found」
ExpoのFAQによると、このエラーはiOSプロジェクトにプッシュキーが設定されていないことを示します。認証情報ページを確認してから、ビルドし直してください。EASがキーの生成を提案してくれます。pluginsにexpo-notificationsがちゃんと入っているかも確認しましょう。
ITMS-90078: Missing Push Notification Entitlement
このメールは提出後にAppleから届きます。アプリがAPNsに登録しようとしているように見えるのに、署名にaps-environment entitlementが含まれていない、という内容です。ExpoのSDK 51に関するノートが説明しています。このSDK以降、entitlementはexpo-notificationsがインストールされている場合にしか追加されません。警告はAppleの2つのチェックから来ます。1つ目はApp IDのケイパビリティとアプリのentitlementを比較するもの。2つ目はバイナリ内の通知登録メソッドを検出するもので、Expoのコードにはこれがどのアプリにも含まれています。
これは警告であってリジェクトではない、とExpoは説明しています。通知を使うならプラグインを追加してビルドし直してください。EASはビルドのたびにApp IDのケイパビリティを同期します。使わないなら、AppleのポータルでApp IDからPush Notificationsケイパビリティを外してください。警告が残ることもありますが、影響はありません。
InvalidCredentials、または全アプリが一斉に沈黙
レシートにInvalidCredentialsが出たら、プッシュの認証情報が無効になっているという意味です。多くはキーが失効させられたのが原因です。そのキーを使っていた全アプリが同時に通知を送れなくなります。Expoの対処法は、eas credentialsで新しいキーを作ることです。レシートにInvalidProviderTokenとある場合、Expoはプッシュキーとプロファイルを再生成してビルドし直すよう勧めています。
通知を有効にする前に
リリース前に自分のiPhoneで通知をテストするなら、TestFlightでアプリをテストするを参考にしてください。アプリを起こすためにサイレント通知を送るなら、バックグラウンドモードに関するガイドライン2.5.4を読み直しましょう。Macなしの全工程はMacなしでiOSアプリを公開するに、リリースの手順はApp Storeにアプリを公開するのページにまとめています。
最初の送信の前に、無料の診断を受けてみてください。プロジェクトで何が障害になっているかがわかり、僕のApple リジェクト対策チェックリストも届きます。アプリを作り、サブスクリプションを組み込み、公開するまでなら、iOS & Android Kitが僕のアプリのスターターコード付きで4ステップの流れを自分のペースで案内します。
よくある質問
Appleのプッシュ証明書は期限切れになりますか?
.p12証明書は1年で期限が切れ、差し替えないと通知が止まります。.p8キーは期限切れになりません。止まるのは失効させたときだけです。キーを選ぶ一番の理由はこれです。
プッシュ証明書はアプリごとに必要ですか?
.p12証明書なら必要です。証明書はそれぞれ1つのアプリに紐づきます。.p8キーはアカウント内の全アプリで使えます。つまりExpoなら、1つのキーで全アプリをカバーできます。
Appleのプッシュ証明書はどう更新しますか?
新しい証明書署名要求を使って、アプリのIDから新しい証明書を作成し、サーバーにインストールしてから古い証明書を外します。期限前に行ってください。一番簡単なのは、更新不要の.p8キーに移行することです。
.p8ファイルをなくしたらどうすればいいですか?
Appleでは1回しかダウンロードできません。EASがキーを作成したなら、Expoが保管しているので通知は止まりません。そうでなければ、新しいキーを作成してeas credentialsで追加し、Appleのポータルで古いキーを失効させてください。ユーザーのExpo Pushトークンは変わりません。
プッシュキーを変えたらビルドし直す必要がありますか?
通常は不要です。キーは送信側のサーバーで使うもので、インストール済みのアプリでは使いません。Expoも新しいキーでトークンは変わらないとしています。例外として、レシートにInvalidProviderTokenが出る場合は、新しいキーとプロファイルでビルドし直すようExpoは勧めています。

