プッシュ API

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-push-api-20261005/
最新公開バージョン:
https://www.w3.org/TR/push-api/
最新編集者ドラフト:
https://w3c.github.io/push-api/
履歴:
https://www.w3.org/standards/history/push-api/
コミット履歴
編集者:
Marcos Caceres (Apple Inc.)
Kagami Rosylight (Mozilla財団)
以前の編集者:
Peter Beverloo (Google) - まで
Martin Thomson (Mozilla財団) - まで
Bryan Sullivan (AT&T) - まで
Eduardo Fullea (Telefonica) - まで
Michaël van Ouwerkerk (Google) - まで
フィードバック:
GitHub w3c/push-api (プルリクエスト, 新しいIssue, オープンIssue)

概要

Push APIは、プッシュメッセージをプッシュサービスを介してウェブアプリケーションに送信することを可能にします。アプリケーションサーバーは、ウェブアプリケーションやユーザーエージェントが非アクティブな場合でも、いつでもプッシュメッセージを送信できます。プッシュサービスは、ユーザーエージェントへの信頼性と効率的な配信を保証します。プッシュメッセージは、ウェブアプリケーションのオリジンで実行されているService Workerに配信され、そのメッセージの情報を使ってローカル状態の更新やユーザーへの通知の表示ができます。

本仕様は、Web Push プロトコルと共に使用するために設計されています。このプロトコルは、アプリケーションサーバーやユーザーエージェントがプッシュサービスとどのように連携するかを説明しています。

この文書のステータス

このセクションは、この文書が公開された時点でのステータスについて説明します。現在のW3C 公開文書とこの技術レポートの最新改訂版は、 W3C 標準・草案一覧で確認できます。

この文書は、Web Applications Working Groupによって、勧告トラックを用いて作業草案として公開されました。

作業草案として公開されることは、W3Cおよびそのメンバーによる承認を意味するものではありません。

この文書は草案であり、今後随時更新、差し替え、または他の文書によって廃止される可能性があります。進行中の作業以外のものとしてこの文書を引用するのは適切ではありません。

この文書は、 W3C 特許ポリシーの下で運営されているグループによって作成されました。 W3Cは、 当該グループが提供する成果物に関連する特許開示の公開リストを管理しています。 このページには特許開示の方法についても記載されています。該当する特許を知っている個人は、 必須クレームを含むと考えられる場合、 W3C特許ポリシー第6節に従って情報を開示する義務があります。

この文書は 2025年8月18日 W3Cプロセス文書に従って管理されています。

1. はじめに

このセクションは規範的ではありません。

Push APIは、ウェブアプリケーションがユーザーエージェントと非同期に通信することを可能にします。これにより、アプリケーションサーバーは、ユーザーエージェントに、情報が判明した時点で即座に時間に敏感な情報を提供できるようになり、ユーザーがウェブアプリケーションを開くのを待つ必要がなくなります。

ここで定義されているように、プッシュサービスは、いつでもプッシュメッセージの配信をサポートします。

特に、プッシュメッセージは、ウェブアプリケーションが現在ブラウザーウィンドウでアクティブでなくても配信されます。これは、ユーザーがウェブアプリケーションを閉じた場合でも、プッシュメッセージを受信した際にウェブアプリケーションが再起動できることが有益となるユースケースに関連します。例えば、プッシュメッセージは、着信WebRTC通話をユーザーに通知するために利用される場合があります。

プッシュメッセージは、ユーザーエージェントが一時的にオフラインの場合にも送信できます。これをサポートするため、プッシュサービスはユーザーエージェント向けにメッセージを保持し、ユーザーエージェントが利用可能になるまで待機します。これにより、ユーザーがオフラインの間にウェブアプリケーションが変更を検知した場合でも、ユーザーエージェントに迅速に関連情報を提供できます。プッシュメッセージは、プッシュサービスによって、ユーザーエージェントが到達可能になるまで保持され、配信されます。

Push APIはまた、ユーザーエージェントがウェブアプリケーションをアクティブに利用している間にプッシュメッセージの確実な配信を保証します。例えば、ユーザーがウェブアプリケーションを積極的に利用している場合や、ウェブアプリケーションがアクティブなワーカー、フレーム、バックグラウンドウィンドウを通じてアプリケーションサーバーと通信している場合などです。ただし、これはPush APIの主なユースケースではありません。ウェブアプリケーションは、頻度の低いメッセージのためにPush APIを選択し、アプリケーションサーバーとの常時通信を維持する必要を回避することができます。

プッシュメッセージングは、ユーザーエージェントとウェブアプリケーションの間に既にアクティブな通信チャネルが存在しない場合に最適です。プッシュメッセージの送信は、Fetch APIや [WebSockets] など、より直接的な通信手段と比較して、はるかに多くのリソースを必要とします。プッシュメッセージは通常、直接通信よりも高いレイテンシーがあり、利用に制限がかかる場合もあります。多くのプッシュサービスは、送信できるプッシュメッセージのサイズや数に制限を設けています。

2. 依存関係

Web Pushプロトコル [RFC8030]は、ユーザーエージェントまたはアプリケーションサーバーとプッシュサービス間の通信を可能にするプロトコルを説明しています。代替プロトコルをこのプロトコルの代わりに利用することもできますが、本仕様はこのプロトコルの利用を前提としています。代替プロトコルは互換性のあるセマンティクスを提供することが期待されます。

Content-Encoding HTTPヘッダーは、 [RFC9110] の8.4節に記載されており、 プッシュメッセージ のペイロードに適用されたコンテンツコーディングを示します。

3. 概念

3.1 アプリケーションサーバー

アプリケーションサーバーという用語は、ウェブアプリケーションのサーバー側コンポーネントを指します。

3.2 プッシュメッセージ

プッシュメッセージは、アプリケーションサーバーからウェブアプリケーションに送信されるデータです。

プッシュメッセージは、そのメッセージが送信されたアクティブワーカーに配信されます。このワーカーは、プッシュ購読に関連付けられています。サービスワーカーが現在起動していない場合は、配信のためにワーカーが起動されます。

3.3 宣言的プッシュメッセージ

宣言型プッシュメッセージは、プッシュメッセージの一種であり、その データはユーザーエージェントによって解釈されるJSON文書です。 ユーザーエージェントは、受信する各 プッシュメッセージを適宜解析し、そのメッセージが宣言型プッシュメッセージであるかどうかを、 宣言型プッシュメッセージパーサーを使用して判定します。

宣言型プッシュメッセージにより、サービスワーカーを関与させずに、通知を作成して 表示できます。 それでも、アプリケーションサーバーが望む場合は、サービスワーカーを 関与させることもできます。このようなシナリオでは、 たとえばストレージの逼迫によってサービスワーカーが破棄された場合に備えて、プッシュメッセージの宣言的な性質がバックアップとして 機能します。さらに、 通知データを送信するための、よりオブジェクト指向的なアプローチも提供します。

{
  "web_push": 8030,
  "notification": {
    "title": "Adaが「London」にメールを送信しました",
    "lang": "en-US",
    "dir": "ltr",
    "body": "地下鉄のストライキについて聞きましたか?",
    "navigate": "https://email.example/message/12"
  }
}

3.3.1 メンバー

宣言的プッシュメッセージは、以下のメンバーを持ちます。

web_push (必須)

整数値で、必ず8030でなければなりません。宣言的プッシュメッセージと他のJSON文書を区別するために使用されます。

notification (必須)

以下のメンバーを持つJSONオブジェクトです。すべてNotifications APIの機能と類似していますが、一部はより厳密な型になっています。titleを除き、全てのメンバーはNotificationOptions 辞書由来であり、同期して管理されます。[NOTIFICATIONS]

title (必須)

文字列。

dir

"auto"、"ltr"、または"rtl"。

lang

言語タグを保持する文字列。

body

文字列。

navigate (必須)

URLを保持する文字列。

tag

文字列。

image

URLを保持する文字列。

icon

URLを保持する文字列。

badge

URLを保持する文字列。

vibrate

32ビット符号なし整数の配列。

timestamp

64ビット符号なし整数。

renotify

真偽値(boolean)。

silent

真偽値(boolean)。

requireInteraction

真偽値(boolean)。

注

一貫性のため、NotificationOptions 辞書と合わせてrequire_interactionではなくrequireInteractionとなっています。

data

任意のJSON値。

actions

以下のメンバーを持つJSONオブジェクトの配列で、すべてNotificationAction 辞書由来であり、同期して管理されます。

action (必須)

文字列。

title (必須)

文字列。

navigate (必須)

URLを保持する文字列。

icon

URLを保持する文字列。

mutable

真偽値(boolean)。true の場合、Service Worker(存在する場合)にNotification オブジェクトを含むpushイベントがdispatchされます。 そのNotificationオブジェクトは宣言的プッシュメッセージで記述されたものです。

3.3.2 パーサー

宣言的プッシュメッセージパーサー結果は、タプルであり、 notification( 通知)と mutable(真偽値)で構成されます。

宣言的プッシュメッセージパーサーは、byte sequence bytes、origin origin、URL baseURL、 EpochTimeStamp fallbackTimestampを引数として、これらの手順を実行します。結果は失敗か、宣言的プッシュメッセージパーサー結果です。

  1. messageを、JSONバイト列をInfra値にパースした結果とします。例外が発生した場合は失敗を返します。

  2. messageがmapでない場合は失敗を返します。

  3. message["web_push"]が存在しない、または8030でない場合は失敗を返します。

  4. message["notification"]が存在しない場合は失敗を返します。

  5. notificationInputをmessage["notification"]とします。

  6. notificationInputがmapでない場合は失敗を返します。

  7. notificationInput["title"]が存在しない、または文字列でない場合は失敗を返します。

  8. notificationInput["navigate"]が存在しない、または文字列でない場合は失敗を返します。

  9. notificationTitleをnotificationInput["title"]とします。

  10. notificationOptionsをNotificationOptions 辞書の新しいインスタンスとします。

  11. notificationInput["dir"]が存在し、"auto"、"ltr"、"rtl"のいずれかの場合、 notificationOptions["dir"] にnotificationInput["dir"]をセットします。

  12. notificationInput["lang"]が存在し、文字列の場合は notificationOptions["lang"] に notificationInput["lang"]をセットします。

  13. notificationInput["body"]が存在し、文字列の場合は notificationOptions["body"] に notificationInput["body"]をセットします。

  14. notificationOptions["navigate"] に notificationInput["navigate"](変換済み)をセットします。

  15. notificationInput["tag"]が存在し、文字列の場合は notificationOptions["tag"] に notificationInput["tag"]をセットします。

  16. notificationInput["image"]が存在し、文字列の場合は notificationOptions["image"] に notificationInput["image"](変換済み)をセットします。

  17. notificationInput["icon"]が存在し、文字列の場合は notificationOptions["icon"] に notificationInput["icon"](変換済み)をセットします。

  18. notificationInput["badge"]が存在し、文字列の場合は notificationOptions["badge"] に notificationInput["badge"](変換済み)をセットします。

  19. notificationInput["vibrate"]が存在し、各itemが32ビット符号なし整数のlistの場合は notificationOptions["vibrate"] に notificationInput["vibrate"]をセットします。

  20. notificationInput["timestamp"]が存在し、64ビット符号なし整数の場合は notificationOptions["timestamp"] に notificationInput["timestamp"]をセットします。

  21. notificationInput["renotify"]が存在し、真偽値の場合は notificationOptions["renotify"] に notificationInput["renotify"]をセットします。

  22. notificationInput["silent"]が存在し、真偽値の場合は notificationOptions["silent"] に notificationInput["silent"]をセットします。

  23. notificationInput["requireInteraction"]が存在し、真偽値の場合は notificationOptions["requireInteraction"] に notificationInput["requireInteraction"]をセットします。

  24. notificationInput["data"]が存在する場合は notificationOptions["data"] に Infra値をJSON互換JavaScript値に変換した結果をセットします。

  25. notificationInput["actions"]が存在し、listの場合:

    1. notificationActionsを空リスト « » とします。

    2. 各 actionInput について notificationInput["actions"]を反復します:

      1. actionInput["action"]が存在しない、または文字列でない場合はcontinueします。

      2. actionInput["title"]が存在しない、または文字列でない場合はcontinueします。

      3. actionInput["navigate"]が存在しない、または文字列でない場合はcontinueします。

      4. actionNavigateを actionInput["navigate"] (変換済み)とします。

      5. notificationActionを NotificationAction 辞書 «[ "action" → actionInput["action"], "title" → actionInput["title"], "navigate" → actionNavigate ]»とします。

      6. actionInput["icon"]が存在し、文字列の場合は notificationAction["icon"] に actionInput["icon"](変換済み)をセットします。

      7. Appendで notificationActionを notificationActionsへ追加します。

    3. notificationOptions["actions"] に notificationActionsをセットします。

  26. notificationを 通知の作成により notificationTitle, notificationOptions, origin, baseURL, fallbackTimestampを指定して生成します。例外が発生した場合は失敗を返します。

  27. notificationのナビゲーションURLがnullの場合は失敗を返します。

  28. notificationのactionsのいずれかのナビゲーションURLがnullの場合は失敗を返します。

  29. mutableをfalseとします。

  30. message["mutable"]が存在し、真偽値の場合は mutableにmessage["mutable"]をセットします。

  31. (notification, mutable) を返します。

3.4 プッシュ購読

プッシュサブスクリプションとは、 ユーザー エージェントとプッシュサービスとの間で、Webアプリケーションに代わって確立されるメッセージ配信コンテキストです。

プッシュサブスクリプションには、関連付けられたスコープがあり、これはURLです。

プッシュサブスクリプションがウィンドウからアクセス可能なスコープを持つとみなされる条件は、そのスコープの パスがリストであり、そのサイズが1で、かつスコープの パス[0]が空 文字列であることです。

注記

すなわち、パス 構成要素を含むURLは、 シリアル化すると"/"になります。

プッシュサブスクリプションには、関連付けられたプッシュエンドポイントがあります。これは必ず、 プッシュサービスによって公開され、アプリケーション サーバーが プッシュメッセージを送信できる絶対URLでなければなりません。プッシュエンドポイントは必ず、プッシュ サブスクリプションを一意に識別しなければなりません。

プッシュサブスクリプションには、任意で 関連付けられたサブスクリプションの有効期限 時刻を設定できます。設定されている場合、その値は必ず、1970年1月1日 00:00:00 UTCからの ミリ秒数で表される、サブスクリプションが非アクティブ化される時刻でなければなりません。ユーザーエージェントは、 可能な限り、プッシュサブスクリプションの有効期限が切れる前に更新を試みるべきです。

プッシュサブスクリプションには、関連付けられたP-256 ECDH鍵ペアと、 認証シークレットがあり、[RFC8291]に従う。

ユーザーエージェントが何らかの理由でプッシュサブスクリプションの鍵を変更する必要があり、 かつそのプッシュサブスクリプションの関連付けられたサービスワーカー登録 がnullでない場合、 ユーザーエージェントは、その更新をプッシュ サブスクリプションに対して行わなければならない。

プッシュサブスクリプションを作成するには、PushSubscriptionOptionsInit optionsDictionaryを与えて、次を行う:

  1. subscriptionを、新しいPushSubscriptionとする。
  2. optionsを、新たに作成したPushSubscriptionOptions オブジェクトとし、その属性を対応するメンバーおよび値で初期化する optionsDictionary。
  3. subscriptionのoptions属性をoptionsに設定する。
  4. subscriptionのP-256 ECDH鍵ペアを、新しいP-256 ECDH鍵ペアを生成した結果に設定する[ANSI-X9-62]。
  5. subscriptionの認証シークレットを、生成した 新しい 認証シークレットの結果に設定する。これは[RFC8291]のセクション 3.2で定義されるオクテット列である。
  6. 新しいプッシュサブスクリプションを要求する。 optionsのapplicationServerKey 属性が設定されている場合は、それを含める。 設定する。あらゆる例外を再スローする。
  7. プッシュサブスクリプション要求が正常に完了した場合:
    1. subscriptionのendpoint属性を、 プッシュ サブスクリプションのプッシュエンドポイントに設定する。
    2. プッシュサブスクリプションによって提供されている場合、subscriptionの expirationTimeを設定する。
  8. subscriptionを返す。

3.4.1 サービスワーカー登録との関係

プッシュサブスクリプションの関連付けられたサービスワーカー登録とは、 サービスワーカー 登録であり、そのスコープURLが 等しい、そのプッシュサブスクリプションのスコープを持つもの(存在する場合)である。 それ以外の場合はnullである。

逆に、サービスワーカー 登録の関連付けられたプッシュ サブスクリプションとは、プッシュサブスクリプションであり、そのスコープが 等しい、そのサービスワーカー 登録のスコープURLを持つもの(存在する場合)であり、それ以外の場合は nullである。

3.4.2 購読の更新

ユーザーエージェントまたはプッシュサービスは、たとえば一定の期間が経過したなどの理由により、更新してもよいことを選択できる。更新する対象は、プッシュ サブスクリプションであり、その関連付けられたサービスワーカー 登録がnullでない場合、いつでも 更新できる。

この場合、ユーザーエージェントは、必ず、プッシュサブスクリプションを作成する 手順を、現在のPushSubscriptionOptionsの作成時に 提供された プッシュサブスクリプションを与えて実行し、新しいプッシュサブスクリプションの スコープを、元のサブスクリプションのスコープに設定しなければならない。 新しいプッシュサブスクリプションは、必ず、 元のサブスクリプションとは異なる 鍵ペアを持たなければならない。

成功した場合、ユーザーエージェントは次に、"pushsubscriptionchange" イベントを発火しなければならない。その際、サービスワーカー 登録として、プッシュ サブスクリプションに関連付けられたものをregistrationとし、初期の プッシュサブスクリプションを表すPushSubscriptionインスタンスをoldSubscriptionとし、 PushSubscription 新しいプッシュサブスクリプションを表すインスタンスを newSubscriptionとする。

変更がアプリケーションサーバーに伝播する時間を確保するため、ユーザー エージェントは、更新後の短い期間、古いプッシュサブスクリプション宛てのメッセージを引き続き受け入れてもよい。 更新されたプッシュ サブスクリプション宛てのメッセージが受信された後は、古いプッシュサブスクリプションはすべて無効化されなければならない。無効化される。

ユーザーエージェントがプッシュサブスクリプションを更新できない場合、定期的に更新を再試行するべきである。 プッシュサブスクリプションがそれ以上 使用 できなくなった場合、たとえば有効期限が切れた場合、ユーザーエージェントは、 "pushsubscriptionchange"イベントを 発火しなければならず、サービスワーカー 登録 として、プッシュサブスクリプションに関連付けられたものをregistrationとし、PushSubscription 無効化されるプッシュサブスクリプションを表すインスタンスを oldSubscription とし、newSubscriptionにはnullを指定する。

3.4.3 購読の非アクティブ化

プッシュサブスクリプションが無効化された場合、 ユーザーエージェントとプッシュサービスの両方は、その 詳細について保存されているすべてのコピーを削除しなければならない。 このプッシュ サブスクリプションに対する後続のプッシュメッセージは、 配信されてはならない。

プッシュサブスクリプションにウィンドウからアクセス可能なスコープがない場合、その関連付けられた サービスワーカー登録が登録解除されたときに、無効化されなければならない。その関連付けられたサービスワーカー 登録が 登録解除されたときである。ただし、プッシュサブスクリプションは、それより前に無効化されてもよい。

3.5 プッシュサービス

プッシュサービスという用語は、アプリケーション サーバーがWebアプリケーションにプッシュメッセージを送信できるようにするシステムを指す。プッシュサービスは、 それが提供するプッシュ サブスクリプションのためのプッシュエンドポイントまたはエンドポイントを提供する。

ユーザーエージェントは、プッシュ サブスクリプションの作成に使用されるプッシュサービスに接続する。ユーザーエージェントは、利用可能なプッシュサービスの選択肢を制限してもよい。 その理由には、サービスの 可用性(特定の国のファイアウォール、 または職場などのネットワークによってサービスがブロックされるかどうかを含む)、信頼性、バッテリー寿命への影響などの性能に関する懸念、および メタデータを特定のプッシュサービスへ送る、または送らないようにするための契約が含まれる。

3.6 許可

Push APIは、強力な機能であり、 名前 "push" によって識別されます。

Permissions仕様との統合のため、 この仕様は PushPermissionDescriptor permission descriptor type を定義します。

WebIDLdictionary PushPermissionDescriptor : PermissionDescriptor {
  boolean userVisibleOnly = false;
};

userVisibleOnlyは、 userVisibleOnly と同じ意味です。

{name: "push", userVisibleOnly: false} は、 {name: "push", userVisibleOnly: true} よりも 強いです。

4. セキュリティおよびプライバシーに関する考慮事項

プッシュメッセージの内容は暗号化される[RFC8291]。しかし、プッシュ サービスは、アプリケーション サーバーからユーザーエージェントへプッシュサブスクリプションを介して送信されるメッセージのメタデータには、依然としてさらされる。 これには、メッセージの タイミング、頻度、およびサイズが含まれる。ユーザーエージェントが禁止する場合があるプッシュサービスの変更以外に、 現在知られている唯一の緩和策は、パディングによって見かけ上のメッセージ サイズを増加させることである。

プッシュメッセージが、Webアプリケーションと同一オリジンを持つアプリケーションサーバー によって送信されたという保証はない。アプリケーションサーバーは、 プッシュサブスクリプションを使用するために必要な詳細を、自らの 裁量で第三者と共有できる。

以下の要件は、可能な限りユーザーのプライバシーとセキュリティを保護すること、および その目標を満たすことを条件として、 アプリケーションサーバーとユーザーとの通信の完全性を保護することを意図している。

Push APIは、開発者が提供したイベントハンドラーを実行するために、サービスワーカー 登録に関連付けられたサービスワーカーを起動しなければならない場合がある。これにより、 ネットワークトラフィックなどのリソース使用が発生する可能性があり、ユーザーエージェントは、それを プッシュサブスクリプションを作成したWebアプリケーションに帰属させるべきである。

ユーザー エージェントは、許可を取得するとき、または許可状態を決定するときに、PushSubscriptionOptionsを考慮してもよい。

許可が取り消された場合、ユーザーエージェントは、その許可で作成されたサブスクリプションについて 「pushsubscriptionchange」イベントを発火してもよく、 プッシュサブスクリプションに関連付けられたサービスワーカー 登録を registrationとし、PushSubscriptionインスタンスで プッシュサブスクリプションを表すものを oldSubscriptionとし、newSubscriptionをnullとする。ユーザー エージェントは、 影響を受けるサブスクリプションを並行して無効化しなければならない。

プッシュエンドポイントは、ユーザーに関する情報を プッシュサービス以外の主体が導出できるように、たとえばユーザーのデバイス、身元、位置などを公開してはならない。正確な要件については、 [RFC8030]のプライバシーに関する考慮事項を参照されたい。

無効化されたプッシュサブスクリプションのプッシュエンドポイントは、 新しいプッシュサブスクリプションに再利用されてはならない。これにより、ユーザーが削除できない永続的な 識別子が作成されることを防ぐ。また、ある プッシュサブスクリプションの詳細を再利用して、別のプッシュメッセージを送信することも防ぐ。 プッシュサブスクリプションへ。

5. プッシュフレームワーク

このセクションは規範的ではありません。

プッシュメッセージは、アプリケーションサーバーからウェブアプリケーションへ以下の手順で送信されます:

この全体的なフレームワークにより、アプリケーションサーバーは、サービス ワーカーを、アプリケーションサーバーでのイベントに応答して起動できます。それらの イベントに関する 情報は、プッシュメッセージに含めることができ、これによりWebアプリケーションは、 ネットワーク 要求を開始する必要なく、それらのイベントに適切に対応できる可能性があります。

以下のコードと図は Push API の仮想的な利用例を示します。

5.1 例

このセクションは規範的ではありません。

// https://example.com/serviceworker.js
this.onpush = event => {
  console.log(event.data);
  // ここから IndexedDB へデータを書き込んだり、開いているウィンドウへ送信したり、通知を表示したりできます。
}

// https://example.com/webapp.js
// 非同期関数内...
try {
  const serviceWorkerRegistration = await navigator.serviceWorker.register(
    "serviceworker.js"
  );
  const pushSubscription = await serviceWorkerRegistration.pushManager.subscribe();
  // アプリケーションサーバーが必要とするプッシュ購読の詳細
  // を取得できたので、例えば XMLHttpRequest で送信できます。
  console.log(pushSubscription.endpoint);
  console.log(pushSubscription.getKey("p256dh"));
  console.log(pushSubscription.getKey("auth"));
} catch (err) {
  // 本番環境では、エラー情報をアプリケーションサーバーへ報告するのも有用です。
  console.log(error);
}

5.2 シーケンス図

このセクションは規範的ではありません。

購読、プッシュメッセージ配信、購読解除の例のイベントフロー
図 1 購読、プッシュメッセージ配信、購読解除の例のイベントフロー

5.3 プッシュサービスの利用

PushSubscription に含まれるフィールドは、 アプリケーションサーバーが プッシュメッセージを送信するために必要なすべての情報です。Push API と互換性のあるプッシュサービスは プッシュエンドポイント(Web Push プロトコルに準拠)を提供します。これらのパラメータ・属性は以下の通りです:

6. PushManagerAttribute ミックスイン

この仕様は Window および ServiceWorkerRegistration オブジェクトを PushManagerAttribute ミックスインによって拡張します。 [HTML] [SERVICE-WORKERS]

WebIDL[SecureContext]
interface mixin PushManagerAttribute {
  readonly attribute PushManager pushManager;
};
Window includes PushManagerAttribute;
ServiceWorkerRegistration includes PushManagerAttribute;

Window および ServiceWorkerRegistration オブジェクトは、関連する PushManager オブジェクトを持ちます。

pushManager のgetter手順は、this の関連する PushManager オブジェクトを返します。

Window オブジェクトでは、PushManager の service worker registration は null です。

ServiceWorkerRegistration オブジェクトでは、PushManager の service worker registration は、 サービスワーカー登録によって表される ServiceWorkerRegistration オブジェクトです。

7. PushManager インターフェース

PushManager インターフェイスは、プッシュサービスへのアクセス操作を定義します。

WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushManager {
  [SameObject] static readonly attribute FrozenArray<DOMString> supportedContentEncodings;

  Promise<PushSubscription> subscribe(optional PushSubscriptionOptionsInit options = {});
  Promise<PushSubscription?> getSubscription();
  Promise<PermissionState> permissionState(optional PushSubscriptionOptionsInit options = {});
};

PushManager には、関連する サービスワーカー登録があり、null または サービスワーカー登録です。

supportedContentEncodings 属性は、プッシュメッセージのペイロード暗号化に使用できるサポートされているコンテンツコーディングのシーケンスを公開します。コンテンツコーディングは、プッシュサービスからプッシュメッセージの送信を要求する際に、Content-Encodingヘッダーで示されます。

ユーザーエージェントは、[RFC8291]で定義される aes128gcm コンテンツコーディングを必ずサポートしなければならず、互換性のために以前のドラフトで定義されたコンテンツコーディングをサポートしてもよいです。

7.1 subscribe() メソッド

subscribe() メソッドの手順は以下のとおりです:

  1. promiseを新しいpromiseとする。
  2. globalをthisの関連する グローバルオブジェクトとする。
  3. scopeをnullとする。
  4. registrationをnullとする。
  5. thisのサービスワーカー登録がnullの場合:
    1. scopeを、基本URLパーサーを "/"および globalの関連付けられた DocumentのURLを与えて実行した結果に設定する。
  6. それ以外の場合:
    1. 表明:thisのサービスワーカー 登録はサービス ワーカー登録である。
    2. registrationをthisのサービスワーカー 登録に設定する。
  7. scopeが失敗であるか、またはURLであって、そのスキームが"https"でない場合、 次に グローバル タスクをキューに入れる。ネットワーキング タスクソース上でglobalを使用して拒否する promiseを"NotAllowedError" DOMExceptionで拒否し、 これらの手順を終了する。
  8. options["userVisibleOnly"] がfalseであり、ユーザー エージェントがtrueであることを要求する場合、グローバル タスクをキューに入れる。ネットワーキング タスクソース上でglobalを使用して拒否するpromiseを"NotAllowedError" DOMExceptionで拒否し、 これらの手順を終了する。
  9. options["applicationServerKey"] がnullであり、 プッシュサービスがnon-nullであることを要求する場合、グローバル タスクをキューに入れる。 ネットワーキング タスクソース上でglobalを使用して拒否するpromiseを "NotSupportedError" DOMExceptionで拒否し、 これらの手順を終了する。
  10. options["applicationServerKey"] がnon-nullの場合:
    1. options["applicationServerKey"] が文字列である場合、 その値を、ArrayBufferで、 次の結果として得られるオクテット列を含むものに設定する: options["applicationServerKey"] を base64urlエンコーディング[RFC7515]を使用して復号する。
    2. 復号に失敗した場合、グローバル タスクをキューに入れる。ネットワーキング タスクソース上で globalを使用して拒否するpromiseを"InvalidCharacterError" DOMException で拒否し、これらの手順を終了する。
    3. options["applicationServerKey"] が P-256曲線上の有効な点を記述していることを確認する。その値が無効である場合、グローバル タスクをキューに入れる ネットワーキング タスクソース上でglobalを使用して拒否するpromiseを "InvalidAccessError" DOMException で拒否し、これらの手順を終了する。
  11. これらの手順を並行して実行する:
    1. subscriptionをnullとする。
    2. scopeがnon-nullの場合:
      1. プッシュサブスクリプションで、 ウィンドウからアクセス可能な スコープを持ち、そのスコープが 等しい scopeであるものが存在する場合、subscriptionをそのプッシュサブスクリプションに設定する。
    3. それ以外の場合:
      1. 表明: registrationはnon-nullである。
      2. registrationのアクティブ ワーカーがnullである場合、 グローバル タスクをキューに入れる。ネットワーキング タスクソース上でglobalを使用して 拒否する promiseを"InvalidStateError" DOMException で拒否し、 これらの手順を終了する。
      3. registrationの関連付けられたプッシュサブスクリプション がnon-nullである場合、 subscriptionをregistrationの関連付けられた プッシュサブスクリプションに設定する。
      4. scopeをregistrationのスコープURLに設定する。
    4. permissionを、"push"を使用する 許可を要求する結果とする。
    5. permissionが"denied"の場合、 グローバル タスクをキューに入れる。 ユーザー インタラクションタスクソース上でglobalを使用して拒否するpromiseを "NotAllowedError" DOMException で拒否し、これらの手順を終了する。
    6. subscriptionがnon-nullの場合:
      1. subscriptionにエラーがある場合、グローバル タスクをキューに入れる。 ネットワーキング タスクソース上でglobalを使用して拒否するpromiseを "AbortError" DOMException で拒否し、これらの手順を終了する。
      2. options引数をsubscriptionのoptions属性と比較する。 BufferSource 値の内容は、 参照ではなく等価性について比較される。
      3. optionsのいずれかの属性に、 subscriptionに保存されている値とは異なる値が含まれる場合、グローバル タスクをキューに入れる。ネットワーキング タスクソース上で globalを使用して拒否するpromiseを "InvalidStateError" DOMException で拒否し、これらの手順を終了する。
      4. グローバル タスクをキューに入れる。ネットワーキング タスクソース上でglobalを使用して、 解決する promiseをsubscriptionで解決し、これらの手順を終了する。
    7. 表明: subscriptionはnullであり、scopeはURLである。
    8. subscriptionを、optionsを指定してプッシュサブスクリプションを作成することを試みた結果に設定する。 サブスクリプションの作成がスローする例外場合、グローバル タスクをキューに入れる。ネットワーキング タスクソース上でglobalを使用して拒否する promiseをその例外で拒否し、これらの 手順を終了する。
    9. subscriptionのスコープをscopeに設定する。
    10. グローバル タスクをキューに入れる。ネットワーキング タスクソース上でglobalを使用して、 解決する promiseを、subscriptionに対応するPushSubscriptionで 解決する。
  12. promiseを返す。

getSubscription()メソッドの手順は次のとおり:

  1. promiseを新しいpromiseとする。
  2. globalをthisの関連する グローバルオブジェクトとする。
  3. windowScopeをnullとする。
  4. registrationをnullとする。
  5. thisのサービスワーカー登録がnullの場合、windowScopeを 基本URLパーサーを "/"およびglobalの 関連付けられた DocumentのURLを与えて実行した結果に設定する。
  6. それ以外の場合:
    1. 表明:thisのサービスワーカー 登録はサービス ワーカー登録である。
    2. registrationをthisのサービスワーカー 登録に設定する。
  7. これらの手順を並行して実行する:
    1. subscriptionをnullとする。
    2. windowScopeがnon-nullの場合:
      1. プッシュサブスクリプションで、 そのスコープが windowScopeであるものが存在する場合、subscriptionをそのプッシュサブスクリプションに設定する。
    3. それ以外の場合:
      1. 表明: registrationはnon-nullである。
      2. registrationの関連付けられたプッシュサブスクリプション がnon-nullである場合、 subscriptionをregistrationの関連付けられた プッシュサブスクリプションに設定する。
    4. subscriptionがnullの場合、promiseをnullで解決する。
    5. subscriptionにエラーがある場合、promiseをDOMExceptionで拒否する。 その名前は"AbortError"であり、 これらの手順を終了する。
    6. promiseを、subscriptionに対応するPushSubscriptionで 解決する。
  8. promiseを返す。

permissionState() メソッドの手順は次の通り:

  1. promise を 新しい promise にする。

  2. global を this の 関連グローバルオブジェクト にする。

  3. 並列で:

    1. state を "push" の 許可状態 にする。

    2. グローバルタスクをキューに入れる:networking task source 上で、global に対して promise を state で解決するためにキューする。

  4. promise を返す。

プッシュサービスの利用許可は永続可能であり、有効な許可があれば以降のサブスクリプションで再確認不要です。

許可を求める必要がある場合は、subscribe() メソッドを呼び出して取得します。

7.2 PushSubscriptionOptions インターフェース

WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushSubscriptionOptions {
  readonly attribute boolean userVisibleOnly;
  [SameObject] readonly attribute ArrayBuffer? applicationServerKey;
};

userVisibleOnly 属性は、取得時に初期化値を返します。

applicationServerKey 属性は、取得時に初期化値を返します。

存在する場合、applicationServerKey の値は、 P-256 楕円曲線 [DSS] 上の点を含んでいる 必要があります。この点は [ANSI-X9-62] 付録Aで説明されている非圧縮形式(すなわち 0x04 オクテットで始まる 65 オクテット)でエンコードされます。 DOMString として提供される場合、その値は 必ず base64url エンコーディング [RFC7515] を用いてエンコードされている必要があります。

ユーザーエージェントは、applicationServerKey が存在しない場合に、pushサービス が運用上必要とする場合、サブスクリプションの試行を拒否する 場合があります。

applicationServerKey の値は、 メッセージ暗号化 [RFC8291] に使用される値とは 異なるものでなければなりません。

7.3 PushSubscriptionOptionsInit 辞書

WebIDLdictionary PushSubscriptionOptionsInit {
  boolean userVisibleOnly = false;
  (BufferSource or DOMString)? applicationServerKey = null;
};

userVisibleOnlyメンバーは、 trueに設定されると、プッシュ サブスクリプションが、たとえばWeb通知を表示することによって、その効果がユーザーに見えるようにされるプッシュメッセージにのみ使用されることを示す。 [NOTIFICATIONS]

PushSubscriptionOptionsInitは、 プッシュサブスクリプションに関連付けられた追加のオプションを表す。ユーザーエージェントは、 ユーザーから明示的な許可を要求するときに、これらのオプションを考慮してもよい。 オプションが考慮される場合、 ユーザー エージェントは、受信するプッシュメッセージに対してそれを強制するべきである。

これらのオプションは任意であり、ユーザーエージェントは、その サブセットのみをサポートすることを選択してもよい。ユーザーエージェントは、サポートしていないオプションを公開してはならない。

一度設定されると、プッシュサブスクリプションのオプションは変更できない。既存のプッシュ サブスクリプションは、unsubscribeを介して購読解除し、新しいオプションを持つ プッシュサブスクリプションを作成できる。

applicationServerKeyメンバーは、ユーザー エージェントが プッシュサービスとのプッシュサブスクリプションを確立するときに使用される。 applicationServerKey オプションには、アプリケーションサーバーの楕円曲線公開 鍵が含まれる。これは、アプリケーションサーバーが [RFC8292]で定義されているように、このプッシュ サブスクリプションにプッシュメッセージを送信するとき、自身を認証するために使用する鍵であり、 プッシュサービスは、対応する秘密鍵が 認証トークンの生成に使用されない限り、あらゆる プッシュメッセージを拒否する。

8. PushSubscription インターフェース

PushSubscriptionオブジェクトは、プッシュサブスクリプションを表す。

WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushSubscription {
  readonly attribute USVString endpoint;
  readonly attribute EpochTimeStamp? expirationTime;
  [SameObject] readonly attribute PushSubscriptionOptions options;
  ArrayBuffer? getKey(PushEncryptionKeyName name);
  Promise<boolean> unsubscribe();

  PushSubscriptionJSON toJSON();
};

dictionary PushSubscriptionKeys {
  USVString p256dh;
  USVString auth;
};

dictionary PushSubscriptionJSON {
  USVString endpoint;
  EpochTimeStamp? expirationTime = null;
  PushSubscriptionKeys keys;
};

endpoint属性を取得するとき、ユーザーエージェントは、 プッシュ エンドポイントに関連付けられたプッシュサブスクリプションを返さなければならない。ユーザー エージェントは、 入力に依存する分岐を含まないシリアライズ方法(すなわち、 定数時間のもの)を使用しなければならない。

expirationTime属性を取得するとき、ユーザー エージェントは、 プッシュサブスクリプションに関連付けられたサブスクリプション有効期限時刻が存在する場合はそれを返しなければならず、 それ以外の場合はnullを返す。

options属性を取得するとき、ユーザーエージェントは、 プッシュ サブスクリプションに関連付けられたオプションを表すPushSubscriptionOptionsオブジェクトを返さなければならない。

getKey(name) メソッドの手順は次のとおり:

  1. keyを新しいArrayBufferオブジェクトとする。
  2. nameが"p256dh"の場合:
    1. keyの内容を、thisの P-256 ECDH鍵ペアの公開鍵をシリアライズした値に設定する。この際、[ANSI-X9-62] 附属書 Aで定義されている非圧縮形式(すなわち、0x04オクテットで始まる65オクテットの列)を、[RFC8291]で 指定されているとおり使用する。
  3. それ以外の場合:
    1. 表明:nameは"auth"である。
    2. keyの内容を、thisの認証シークレットの値のコピーに設定する。
  4. keyを返す。

unsubscribe()メソッドは、呼び出されたとき、 次の手順を実行しなければならない:

  1. promiseを新しい promiseとする。
  2. promiseを返し、次の手順を非同期に続行する。
  3. プッシュサブスクリプションがすでに無効化されている場合、promiseを falseで解決し、これらの手順を終了する。
  4. 次の手順を並行して実行する:
    1. 無効化する、プッシュ サブスクリプションを。ユーザーエージェントは、そのプッシュ サブスクリプションに対して、これ以降いかなるプッシュメッセージも配信してはならない。

      ユーザーエージェントが、プッシュサービスに プッシュ サブスクリプションを無効化するよう要求できなかった場合、たとえばネットワーク 障害のためである場合、合理的な 期間、プッシュサービスへの要求を再試行するべきである。

  5. promiseをtrueで解決する。

toJSON()メソッドは、呼び出されたとき、次の手順を実行しなければならない:

  1. jsonを新しいPushSubscriptionJSON辞書とする。
  2. json["endpoint"]を、endpoint属性を取得することを thisに対して行った結果に設定する。
  3. json["expirationTime"]を、 expirationTime属性を取得することをthisに対して行った結果に設定する。
  4. keysを新しいPushSubscriptionKeys辞書とする。
  5. keys["p256dh"]を、getKey("p256dh")によって返された 値を、USVStringとして、パディングなしのURLセーフbase64エンコーディング [RFC4648]したものに設定する。
  6. keys["auth"]を、getKey("auth")によって返された 値を、USVStringとして、パディングなしのURLセーフbase64エンコーディング [RFC4648]したものに設定する。
  7. json["keys"]をkeysに設定する。
  8. jsonを返す。

PushSubscriptionJSON辞書は、 PushSubscriptionのJSON型を表す。ECMAScriptでは、これは JSON.stringify() 関数を通じてJSON文字列に変換できる。

keysレコードには、サポートされている各 PushEncryptionKeyName エントリについて、その値のURLセーフbase64エンコード表現 [RFC4648]へのエントリが含まれる。

PushSubscriptionのオプションは シリアライズされないことに注意されたい。

8.1 PushEncryptionKeyName 列挙体

プッシュメッセージの暗号化に使用される暗号化鍵は、Webアプリケーションに getKey()メソッドまたは PushSubscriptionのシリアライザーを通じて提供される。各鍵には、 PushEncryptionKeyName 列挙型の値を使用して名前が付けられる。

WebIDLenum PushEncryptionKeyName {
  "p256dh",
  "auth"
};

p256dh 値は [RFC8291]で記述されるP-256 ECDH ディフィー・ヘルマン公開鍵の取得に使います。

auth 値は [RFC8291]で記述される認証用シークレットの取得に使います。

9. PushMessageData インターフェース

WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushMessageData {
  ArrayBuffer arrayBuffer();
  Blob blob();
  Uint8Array bytes();
  any json();
  USVString text();
};

PushMessageData オブジェクトは、作成時に設定される bytes(バイト列)を持ちます。

arrayBuffer() メソッドは、ArrayBuffer を返します。その内容は this の bytes です。ArrayBuffer オブジェクトの生成時に例外が発生した場合は再スローします。

blob() メソッドは、新しい Blob オブジェクトを返します。その内容は this の bytes です。

bytes() メソッドは、新しい Uint8Array を返します。これは ArrayBuffer によってバックされており、内容は this の bytes です。ArrayBuffer オブジェクトの生成時に例外が発生した場合は再スローします。

json() メソッドは、JSONバイト列をJavaScript値にパースを this の bytes に対して実行した結果を返します。

text() メソッドは、UTF-8デコード を this の bytes に対して実行した結果を返します。

バイト列を抽出するには、objectに対して以下の手順を実行します:

  1. bytes を空のバイト列で初期化する。
  2. object の型によって分岐する:
    BufferSource
    bytes に object の内容のコピーを設定する。
    USVString
    bytes に utf-8エンコードの結果を設定する。
  3. bytes を返す。

10. イベント

10.1 ServiceWorkerGlobalScope インターフェースへの拡張

Service Worker仕様は、ServiceWorkerGlobalScope インターフェースを定義しています [SERVICE-WORKERS]。この仕様はこれを拡張します。

WebIDL[Exposed=ServiceWorker, SecureContext]
partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onpush;
  attribute EventHandler onpushsubscriptionchange;
};

onpush 属性は イベントハンドラIDL属性であり、 対応する イベントハンドライベントタイプは "push" です。 "push" イベントは プッシュメッセージが プッシュ購読に対して受信されたことを示します。

onpushsubscriptionchange 属性は イベントハンドラIDL属性であり、 対応する イベントハンドライベントタイプは "pushsubscriptionchange" です。

10.2 PushEvent インターフェース

WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushEvent : ExtendableEvent {
  constructor(DOMString type, optional PushEventInit eventInitDict = {});
  readonly attribute PushMessageData? data;
  readonly attribute Notification? notification;
};

dictionary PushEventInit : ExtendableEventInit {
  PushMessageDataInit? data = null;
  Notification? notification = null;
};

typedef (BufferSource or USVString) PushMessageDataInit;

constructor の PushEvent インターフェース、または PushEvent インターフェースを継承するインターフェースが呼び出されたとき、通常の イベント構築手順に加えて以下の手順を実行します:

  1. eventInitDict の data メンバーが存在しない場合、イベントの data 属性を null に設定し、この手順を終了します。
  2. b を バイト列を抽出するによって eventInitDict の "data" メンバーから得た結果とします。
  3. イベントの data 属性に、PushMessageData インスタンス(bytes が b)を設定します。

data 属性は初期化時の値を返します。

notification 属性は初期化時の値を返します。

user agentがpush serviceからpush messageを受信すると、 それはMUST次のステップを実行します。

  1. subscriptionを、push messageに対応するアクティブなpush subscriptionとします。

  2. registrationをsubscriptionのassociated service worker registrationとします。

  3. bytesをnullとします。

  4. もしpush messageがペイロードを含む場合:

    1. subscriptionに関連付けられたキーペアからの秘密鍵と[RFC8291]で説明されているプロセスを使用して、push messageのペイロードを復号化します。bytesを結果のbyte sequenceに設定します。

    2. もし、何らかの理由でpush messageのペイロードを復号化できなかった場合、acknowledge push messageし、これらのステップを中止します。

      注記

      pushイベントは、プッシュ メッセージが正常に プッシュサブスクリプションに関連付けられた鍵ペアを使用して復号されなかった場合、発火されない。

  5. もしbytesがnullでない場合:

    1. baseURLをsubscriptionのscopeとします。

    2. originをbaseURLのoriginとします。

    3. fallbackTimestampをcurrent coarsened wall timeとします。

    4. declarativeResultを、bytes、origin、 baseURL、およびfallbackTimestampが与えられた場合のdeclarative push message parserを実行した結果とします。

    5. もしdeclarativeResultがfailureでない場合:

      1. notificationをdeclarativeResultのnotificationとします。

      2. notificationのservice worker registrationをregistrationに設定します。

      3. notificationShownをfalseとします。

      4. もしdeclarativeResultのmutable がtrueで、registrationがnullでない場合:

        1. resultを、registration、null、およびnotificationを表す新しいNotification オブジェクトが与えられた場合のfiring a push eventの結果とします。

        2. もしresultがfailureでない場合、notificationShownをresultのnotification shownに設定します。

      5. notificationShownがfalseの場合、通知 表示手順を notificationとnullを与えて実行する。

        注記

        環境 設定オブジェクトがないため、nullが渡される。これにより、 notificationのアイコンなどのリソースが、 サービス ワーカーを介さずに取得されることも保証される。

      6. Acknowledge push messageし、これらのステップを中止します。

  6. もしregistrationがnullの場合、これらのステップを中止します。

  7. dataを、PushMessageDataオブジェクトとします。このオブジェクトのbytesは、もしbytesがnullでない場合はbytes、それ以外の場合はnullです。

  8. resultを、registration、data、およびnullが与えられた場合のfiring a push eventの結果とします。

  9. もしresultがfailureで、同じpush messageがservice worker registrationに複数回配信されたにもかかわらず成功しなかった場合、acknowledge push messageします。

  10. もしresultがfailureでない場合、acknowledge push messageします。

pushイベント結果は、 タプルであり、 notification shown(boolean)を含みます。

pushイベントの発火は、 Service Worker登録 registration、 PushMessageData オブジェクトまたは null data、 notification または null notification を受け取り、以下の手順を実行します。失敗または pushイベント結果を返します。

  1. notificationResult を null で初期化します。

  2. registration の showNotification()が正常に呼び出されたか を false に設定します。

  3. 機能的イベントの発火で "push" を PushEvent 型で registration に対して以下のプロパティで発火する:

    data
    data
    notification
    notification

    その後 dispatchedEvent を使って以下の手順を並列で実行:

    1. extend lifetime promises のすべてのpromiseが解決されるまで待機する。

    2. 正常に解決されなければ notificationResult を失敗に設定する。

    3. そうでなければ notificationResult を registration の showNotification()が正常に呼び出されたか の値に設定する。

  4. notificationResult が null でなくなるまで待機する。

  5. notificationResult が失敗なら失敗を返す。

  6. Assert: notificationResult は boolean である。

  7. (notificationResult) を返す。

プッシュメッセージを確認応答するとは、プッシュメッセージ pushMessageを与えられたとき、pushMessageの受信を [RFC8030]に従って確認応答することを意味する。

プッシュメッセージを確認応答すると、プッシュサービスは メッセージの配信を停止し、アプリケーションサーバーに成功を報告する。これにより、 同じ プッシュメッセージがプッシュサービスによって無期限に再試行されることを防ぐ。

確認応答することは、アプリケーションサーバーが誤って プッシュメッセージの配信成功を示す 配信確認を受信する可能性があることも意味する。したがって、 確認応答する前に複数回の拒否を許可するべきであり、少なくとも 3回の試行を許可することが推奨される。

10.4 pushsubscriptionchange イベント

pushsubscriptionchangeイベントは、 プッシュサブスクリプションの変更を示す。 これは、たとえば更新、取り消し、または喪失されたために、アプリケーションの制御外で 引き起こされたものである。

「pushsubscriptionchange」イベントを発火するには、サービスワーカー 登録であるregistration、newSubscription、および oldSubscriptionが与えられたとき、ユーザー エージェントは、機能イベントを発火しなければならない。 名前は「pushsubscriptionchange」とし、 PushSubscriptionChangeEventを registration上で次のプロパティとともに使用する:

newSubscription
newSubscription
oldSubscription
oldSubscription
注記

新しいプッシュサブスクリプションの詳細をアプリケーション サーバーに送信するときは、[WEB-BACKGROUND-SYNC]のような、より信頼性の高い同期機構の使用を検討されたい。 ユーザーは、fetchが失敗する可能性のある不安定なネットワーク状況に置かれる場合がある。

10.4.1 PushSubscriptionChangeEvent インターフェース

WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushSubscriptionChangeEvent : ExtendableEvent {
  constructor(DOMString type, optional PushSubscriptionChangeEventInit eventInitDict = {});
  readonly attribute PushSubscription? newSubscription;
  readonly attribute PushSubscription? oldSubscription;
};

newSubscription 属性は、取得時に初期化された値を返します。

oldSubscription 属性は、取得時に初期化された値を返します。

10.4.2 PushSubscriptionChangeEventInit インターフェース

WebIDLdictionary PushSubscriptionChangeEventInit : ExtendableEventInit {
  PushSubscription newSubscription = null;
  PushSubscription oldSubscription = null;
};

newSubscriptionメンバーは、プッシュサブスクリプションの詳細を示し、 pushsubscriptionchangeイベントの呼び出し時に有効なものである。 新しいプッシュサブスクリプションを確立できなかった場合、値は nullになる。たとえば、 Webアプリケーションが明示的な許可を失った場合である。

oldSubscriptionメンバーは、今後使用すべきでは ないプッシュサブスクリプションの詳細を示す。ユーザーエージェントが 完全な詳細一式を 提供できない場合、たとえばデータベースが部分的に破損している場合、値はnullになる。

11. アクセシビリティ

Push API は、プッシュサービスから受信したデータを提示する手段を自身では提供しません。代わりに、Push APIは他のAPI ― 主に Notifications API Standard ― に依存し、受信した情報をエンドユーザーに提示します。そのため、Push API自体にはアクセシビリティ要件はありません。ただし、[NOTIFICATIONS] などの仕様では、通知をアクセシブルな方法で提示するための指針が提供されています。

さらに、アクセシブルなインターフェースの提示には、プッシュメッセージで伝達できる以上の情報が必要になる場合があります。プッシュメッセージは少量のコンテンツや識別子の伝達に最適です。より大きなリソースはサーバーから取得する必要があります。

12. 適合性

この仕様のセクションで非規範的と明記されている部分に加え、全ての作成ガイドライン、図、例、注記は非規範的です。それ以外の全ては規範的です。

この文書における MAY、MUST、MUST NOT、SHOULD、SHOULD NOT という用語は、 BCP 14 [RFC2119] [RFC8174] に記載された通り、ここに示すように全て大文字で現れた場合にのみ、その意味で解釈されます。

この仕様では、含まれるインターフェースを実装する単一の製品 ― ユーザーエージェント ― に適用される適合性基準を定義します。

A. IDL インデックス

WebIDLdictionary PushPermissionDescriptor : PermissionDescriptor {
  boolean userVisibleOnly = false;
};

[SecureContext]
interface mixin PushManagerAttribute {
  readonly attribute PushManager pushManager;
};
Window includes PushManagerAttribute;
ServiceWorkerRegistration includes PushManagerAttribute;

[Exposed=(Window,Worker), SecureContext]
interface PushManager {
  [SameObject] static readonly attribute FrozenArray<DOMString> supportedContentEncodings;

  Promise<PushSubscription> subscribe(optional PushSubscriptionOptionsInit options = {});
  Promise<PushSubscription?> getSubscription();
  Promise<PermissionState> permissionState(optional PushSubscriptionOptionsInit options = {});
};

[Exposed=(Window,Worker), SecureContext]
interface PushSubscriptionOptions {
  readonly attribute boolean userVisibleOnly;
  [SameObject] readonly attribute ArrayBuffer? applicationServerKey;
};

dictionary PushSubscriptionOptionsInit {
  boolean userVisibleOnly = false;
  (BufferSource or DOMString)? applicationServerKey = null;
};

[Exposed=(Window,Worker), SecureContext]
interface PushSubscription {
  readonly attribute USVString endpoint;
  readonly attribute EpochTimeStamp? expirationTime;
  [SameObject] readonly attribute PushSubscriptionOptions options;
  ArrayBuffer? getKey(PushEncryptionKeyName name);
  Promise<boolean> unsubscribe();

  PushSubscriptionJSON toJSON();
};

dictionary PushSubscriptionKeys {
  USVString p256dh;
  USVString auth;
};

dictionary PushSubscriptionJSON {
  USVString endpoint;
  EpochTimeStamp? expirationTime = null;
  PushSubscriptionKeys keys;
};

enum PushEncryptionKeyName {
  "p256dh",
  "auth"
};

[Exposed=ServiceWorker, SecureContext]
interface PushMessageData {
  ArrayBuffer arrayBuffer();
  Blob blob();
  Uint8Array bytes();
  any json();
  USVString text();
};

[Exposed=ServiceWorker, SecureContext]
partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onpush;
  attribute EventHandler onpushsubscriptionchange;
};

[Exposed=ServiceWorker, SecureContext]
interface PushEvent : ExtendableEvent {
  constructor(DOMString type, optional PushEventInit eventInitDict = {});
  readonly attribute PushMessageData? data;
  readonly attribute Notification? notification;
};

dictionary PushEventInit : ExtendableEventInit {
  PushMessageDataInit? data = null;
  Notification? notification = null;
};

typedef (BufferSource or USVString) PushMessageDataInit;

[Exposed=ServiceWorker, SecureContext]
interface PushSubscriptionChangeEvent : ExtendableEvent {
  constructor(DOMString type, optional PushSubscriptionChangeEventInit eventInitDict = {});
  readonly attribute PushSubscription? newSubscription;
  readonly attribute PushSubscription? oldSubscription;
};

dictionary PushSubscriptionChangeEventInit : ExtendableEventInit {
  PushSubscription newSubscription = null;
  PushSubscription oldSubscription = null;
};

B. 謝辞

編集者は、Firefox OS Pushメッセージソリューションを実装したMozillaおよびTelefónica Digitalのチーム、そして本ドキュメントに重要な技術的助言を提供した以下の方々に感謝の意を表します:Antonio Amaya、Miguel García Arribas、Ben Bangert、Kit Cambridge、José Manuel Cantera、JR Conlin、Albert Crespell、Matt Gaunt、Phil Jenvey、Guillermo López、Nikhil Marathe、John Mellor、Pınar Özlen、Fernando R. Sela、Shijun Sun、Doug Turner。

C. 参考文献

C.1 規範参考文献

[ANSI-X9-62]
金融サービス業界向け公開鍵 暗号方式、楕円曲線デジタル署名 アルゴリズム(ECDSA)。ANSI。2005年。URL:https://webstore.ansi.org/RecordDetail.aspx?sku=ANSI+X9.62%3a2005
[dom]
DOM標準。Anne van Kesteren。WHATWG。 現行標準。URL:https://dom.spec.whatwg.org/
[DSS]
FIPS PUB 186-5:デジタル 署名標準(DSS)。米国商務省/国立 標準技術研究所。2023年2月3日。国家標準。URL:https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf
[ecmascript]
ECMAScript言語仕様。 Ecma International。URL:https://tc39.es/ecma262/multipage/
[encoding]
Encoding標準。Anne van Kesteren。 WHATWG。現行標準。URL:https://encoding.spec.whatwg.org/
[fileapi]
File API。Marijn Kruisselbrink。W3C。2026年 9月12日。W3C作業草案。URL:https://www.w3.org/TR/FileAPI/
[hr-time]
高精度時間。Yoav Weiss。W3C。2026年9月1日。 W3C作業草案。URL:https://www.w3.org/TR/hr-time-3/
[HTML]
HTML標準。Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters。WHATWG。現行 標準。URL:https://html.spec.whatwg.org/multipage/
[infra]
Infra標準。Anne van Kesteren; Domenic Denicola。WHATWG。現行標準。URL:https://infra.spec.whatwg.org/
[NOTIFICATIONS]
Notifications API標準。Anne van Kesteren。WHATWG。現行標準。URL:https://notifications.spec.whatwg.org/
[Permissions]
Permissions。Marcos Caceres; Mike Taylor。W3C。2025年10月6日。W3C作業草案。URL:https://www.w3.org/TR/permissions/
[RFC2119]
要求レベルを示すためにRFCで使用する キーワード。S. Bradner。IETF。1997年3月。現行のベストプラクティス。URL:https://www.rfc-editor.org/info/rfc2119/
[RFC4648]
Base16、Base32、およびBase64データ エンコーディング。S. Josefsson。IETF。2006年10月。提案標準。URL:https://www.rfc-editor.org/info/rfc4648/
[RFC7515]
JSON Web Signature (JWS)。M. Jones; J. Bradley; N. Sakimura。IETF。2015年5月。提案標準。URL:https://www.rfc-editor.org/info/rfc7515/
[RFC8030]
HTTP Pushを使用した汎用イベント配信。M. Thomson; E. Damaggio; B. Raymor, Ed.。IETF。2016年12月。提案 標準。URL:https://www.rfc-editor.org/info/rfc8030/
[RFC8174]
RFC 2119キーワードにおける大文字と小文字の曖昧さ。B. Leiba。IETF。2017年5月。現行のベストプラクティス。URL:https://www.rfc-editor.org/info/rfc8174/
[RFC8291]
Web Push用メッセージ暗号化。 M. Thomson。IETF。2017年11月。提案標準。URL:https://www.rfc-editor.org/info/rfc8291/
[RFC8292]
Web Push用の自主的アプリケーションサーバー識別 (VAPID)。M. Thomson; P. Beverloo。IETF。2017年11月。提案 標準。URL:https://www.rfc-editor.org/info/rfc8292/
[RFC9110]
HTTPセマンティクス。R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.。IETF。2022年6月。インターネット標準。URL:https://httpwg.org/specs/rfc9110.html
[SERVICE-WORKERS]
Service Workers Nightly。Monica CHINTALA; Yoshisato Yanagisawa。W3C。2026年9月17日。CRD。URL:https://www.w3.org/TR/service-workers/
[url]
URL標準。Anne van Kesteren。WHATWG。 現行標準。URL:https://url.spec.whatwg.org/
[WEBIDL]
Web IDL標準。Edgar Chen; Timothy Gu。 WHATWG。現行標準。URL:https://webidl.spec.whatwg.org/

C.2 参考文献

[Fetch]
Fetch標準。Anne van Kesteren。WHATWG。 現行標準。URL:https://fetch.spec.whatwg.org/
[WEB-BACKGROUND-SYNC]
Webバックグラウンド 同期。W3C。コミュニティグループ報告書草案。URL:https://wicg.github.io/background-sync/spec/
[WebSockets]
WebSockets標準。Adam Rice。 WHATWG。現行標準。URL:https://websockets.spec.whatwg.org/