Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Push APIは、プッシュメッセージをプッシュサービスを介してウェブアプリケーションに送信することを可能にします。アプリケーションサーバーは、ウェブアプリケーションやユーザーエージェントが非アクティブな場合でも、いつでもプッシュメッセージを送信できます。プッシュサービスは、ユーザーエージェントへの信頼性と効率的な配信を保証します。プッシュメッセージは、ウェブアプリケーションのオリジンで実行されているService Workerに配信され、そのメッセージの情報を使ってローカル状態の更新やユーザーへの通知の表示ができます。
本仕様は、Web Push プロトコルと共に使用するために設計されています。このプロトコルは、アプリケーションサーバーやユーザーエージェントがプッシュサービスとどのように連携するかを説明しています。
このセクションは、この文書が公開された時点でのステータスについて説明します。現在のW3C 公開文書とこの技術レポートの最新改訂版は、 W3C 標準・草案一覧で確認できます。
この文書は、Web Applications Working Groupによって、勧告トラックを用いて作業草案として公開されました。
作業草案として公開されることは、W3Cおよびそのメンバーによる承認を意味するものではありません。
この文書は草案であり、今後随時更新、差し替え、または他の文書によって廃止される可能性があります。進行中の作業以外のものとしてこの文書を引用するのは適切ではありません。
この文書は、 W3C 特許ポリシーの下で運営されているグループによって作成されました。 W3Cは、 当該グループが提供する成果物に関連する特許開示の公開リストを管理しています。 このページには特許開示の方法についても記載されています。該当する特許を知っている個人は、 必須クレームを含むと考えられる場合、 W3C特許ポリシー第6節に従って情報を開示する義務があります。
この文書は 2025年8月18日 W3Cプロセス文書に従って管理されています。
このセクションは規範的ではありません。
Push APIは、ウェブアプリケーションがユーザーエージェントと非同期に通信することを可能にします。これにより、アプリケーションサーバーは、ユーザーエージェントに、情報が判明した時点で即座に時間に敏感な情報を提供できるようになり、ユーザーがウェブアプリケーションを開くのを待つ必要がなくなります。
ここで定義されているように、プッシュサービスは、いつでもプッシュメッセージの配信をサポートします。
特に、プッシュメッセージは、ウェブアプリケーションが現在ブラウザーウィンドウでアクティブでなくても配信されます。これは、ユーザーがウェブアプリケーションを閉じた場合でも、プッシュメッセージを受信した際にウェブアプリケーションが再起動できることが有益となるユースケースに関連します。例えば、プッシュメッセージは、着信WebRTC通話をユーザーに通知するために利用される場合があります。
プッシュメッセージは、ユーザーエージェントが一時的にオフラインの場合にも送信できます。これをサポートするため、プッシュサービスはユーザーエージェント向けにメッセージを保持し、ユーザーエージェントが利用可能になるまで待機します。これにより、ユーザーがオフラインの間にウェブアプリケーションが変更を検知した場合でも、ユーザーエージェントに迅速に関連情報を提供できます。プッシュメッセージは、プッシュサービスによって、ユーザーエージェントが到達可能になるまで保持され、配信されます。
Push APIはまた、ユーザーエージェントがウェブアプリケーションをアクティブに利用している間にプッシュメッセージの確実な配信を保証します。例えば、ユーザーがウェブアプリケーションを積極的に利用している場合や、ウェブアプリケーションがアクティブなワーカー、フレーム、バックグラウンドウィンドウを通じてアプリケーションサーバーと通信している場合などです。ただし、これはPush APIの主なユースケースではありません。ウェブアプリケーションは、頻度の低いメッセージのためにPush APIを選択し、アプリケーションサーバーとの常時通信を維持する必要を回避することができます。
プッシュメッセージングは、ユーザーエージェントとウェブアプリケーションの間に既にアクティブな通信チャネルが存在しない場合に最適です。プッシュメッセージの送信は、Fetch APIや [WebSockets] など、より直接的な通信手段と比較して、はるかに多くのリソースを必要とします。プッシュメッセージは通常、直接通信よりも高いレイテンシーがあり、利用に制限がかかる場合もあります。多くのプッシュサービスは、送信できるプッシュメッセージのサイズや数に制限を設けています。
Web Pushプロトコル [RFC8030]は、ユーザーエージェントまたはアプリケーションサーバーとプッシュサービス間の通信を可能にするプロトコルを説明しています。代替プロトコルをこのプロトコルの代わりに利用することもできますが、本仕様はこのプロトコルの利用を前提としています。代替プロトコルは互換性のあるセマンティクスを提供することが期待されます。
Content-Encoding
HTTPヘッダーは、
[RFC9110] の8.4節に記載されており、
プッシュメッセージ
のペイロードに適用されたコンテンツコーディングを示します。
アプリケーションサーバーという用語は、ウェブアプリケーションのサーバー側コンポーネントを指します。
プッシュメッセージは、アプリケーションサーバーからウェブアプリケーションに送信されるデータです。
プッシュメッセージは、そのメッセージが送信されたアクティブワーカーに配信されます。このワーカーは、プッシュ購読に関連付けられています。サービスワーカーが現在起動していない場合は、配信のためにワーカーが起動されます。
宣言型プッシュメッセージは、プッシュメッセージの一種であり、その データはユーザーエージェントによって解釈されるJSON文書です。 ユーザーエージェントは、受信する各 プッシュメッセージを適宜解析し、そのメッセージが宣言型プッシュメッセージであるかどうかを、 宣言型プッシュメッセージパーサーを使用して判定します。
宣言型プッシュメッセージにより、サービスワーカーを関与させずに、通知を作成して 表示できます。 それでも、アプリケーションサーバーが望む場合は、サービスワーカーを 関与させることもできます。このようなシナリオでは、 たとえばストレージの逼迫によってサービスワーカーが破棄された場合に備えて、プッシュメッセージの宣言的な性質がバックアップとして 機能します。さらに、 通知データを送信するための、よりオブジェクト指向的なアプローチも提供します。
{
"web_push": 8030,
"notification": {
"title": "Adaが「London」にメールを送信しました",
"lang": "en-US",
"dir": "ltr",
"body": "地下鉄のストライキについて聞きましたか?",
"navigate": "https://email.example/message/12"
}
}
宣言的プッシュメッセージは、以下のメンバーを持ちます。
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
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オブジェクトは宣言的プッシュメッセージで記述されたものです。
宣言的プッシュメッセージパーサー結果は、タプルであり、 notification( 通知)と mutable(真偽値)で構成されます。
宣言的プッシュメッセージパーサーは、byte sequence
bytes、origin
origin、URL
baseURL、
EpochTimeStamp
fallbackTimestampを引数として、これらの手順を実行します。結果は失敗か、宣言的プッシュメッセージパーサー結果です。
messageを、JSONバイト列をInfra値にパースした結果とします。例外が発生した場合は失敗を返します。
messageがmapでない場合は失敗を返します。
message["web_push"]が存在しない、または8030でない場合は失敗を返します。
message["notification"]が存在しない場合は失敗を返します。
notificationInputをmessage["notification"]とします。
notificationInputがmapでない場合は失敗を返します。
notificationInput["title"]が存在しない、または文字列でない場合は失敗を返します。
notificationInput["navigate"]が存在しない、または文字列でない場合は失敗を返します。
notificationTitleをnotificationInput["title"]とします。
notificationOptionsをNotificationOptions
辞書の新しいインスタンスとします。
notificationInput["dir"]が存在し、"auto"、"ltr"、"rtl"のいずれかの場合、
notificationOptions["dir"]
にnotificationInput["dir"]をセットします。
notificationInput["lang"]が存在し、文字列の場合は
notificationOptions["lang"]
に
notificationInput["lang"]をセットします。
notificationInput["body"]が存在し、文字列の場合は
notificationOptions["body"]
に
notificationInput["body"]をセットします。
notificationOptions["navigate"]
に
notificationInput["navigate"](変換済み)をセットします。
notificationInput["tag"]が存在し、文字列の場合は
notificationOptions["tag"]
に
notificationInput["tag"]をセットします。
notificationInput["image"]が存在し、文字列の場合は
notificationOptions["image"]
に
notificationInput["image"](変換済み)をセットします。
notificationInput["icon"]が存在し、文字列の場合は
notificationOptions["icon"]
に
notificationInput["icon"](変換済み)をセットします。
notificationInput["badge"]が存在し、文字列の場合は
notificationOptions["badge"]
に
notificationInput["badge"](変換済み)をセットします。
notificationInput["vibrate"]が存在し、各itemが32ビット符号なし整数のlistの場合は
notificationOptions["vibrate"]
に
notificationInput["vibrate"]をセットします。
notificationInput["timestamp"]が存在し、64ビット符号なし整数の場合は
notificationOptions["timestamp"]
に
notificationInput["timestamp"]をセットします。
notificationInput["renotify"]が存在し、真偽値の場合は
notificationOptions["renotify"]
に
notificationInput["renotify"]をセットします。
notificationInput["silent"]が存在し、真偽値の場合は
notificationOptions["silent"]
に
notificationInput["silent"]をセットします。
notificationInput["requireInteraction"]が存在し、真偽値の場合は
notificationOptions["requireInteraction"]
に
notificationInput["requireInteraction"]をセットします。
notificationInput["data"]が存在する場合は
notificationOptions["data"]
に
Infra値をJSON互換JavaScript値に変換した結果をセットします。
notificationInput["actions"]が存在し、listの場合:
notificationActionsを空リスト « » とします。
各
actionInput について
notificationInput["actions"]を反復します:
actionNavigateを
actionInput["navigate"]
(変換済み)とします。
notificationActionを
NotificationAction
辞書
«[ "action"
→ actionInput["action"],
"title"
→ actionInput["title"],
"navigate"
→ actionNavigate ]»とします。
actionInput["icon"]が存在し、文字列の場合は
notificationAction["icon"]
に
actionInput["icon"](変換済み)をセットします。
Appendで notificationActionを notificationActionsへ追加します。
notificationOptions["actions"]
に
notificationActionsをセットします。
notificationを 通知の作成により notificationTitle, notificationOptions, origin, baseURL, fallbackTimestampを指定して生成します。例外が発生した場合は失敗を返します。
notificationのナビゲーションURLがnullの場合は失敗を返します。
notificationのactionsのいずれかのナビゲーションURLがnullの場合は失敗を返します。
mutableをfalseとします。
message["mutable"]が存在し、真偽値の場合は
mutableにmessage["mutable"]をセットします。
(notification, mutable) を返します。
プッシュサブスクリプションとは、 ユーザー エージェントとプッシュサービスとの間で、Webアプリケーションに代わって確立されるメッセージ配信コンテキストです。
プッシュサブスクリプションには、関連付けられたスコープがあり、これはURLです。
プッシュサブスクリプションがウィンドウからアクセス可能なスコープを持つとみなされる条件は、そのスコープの パスがリストであり、そのサイズが1で、かつスコープの パス[0]が空 文字列であることです。
プッシュサブスクリプションには、関連付けられたプッシュエンドポイントがあります。これは必ず、 プッシュサービスによって公開され、アプリケーション サーバーが プッシュメッセージを送信できる絶対URLでなければなりません。プッシュエンドポイントは必ず、プッシュ サブスクリプションを一意に識別しなければなりません。
プッシュサブスクリプションには、任意で 関連付けられたサブスクリプションの有効期限 時刻を設定できます。設定されている場合、その値は必ず、1970年1月1日 00:00:00 UTCからの ミリ秒数で表される、サブスクリプションが非アクティブ化される時刻でなければなりません。ユーザーエージェントは、 可能な限り、プッシュサブスクリプションの有効期限が切れる前に更新を試みるべきです。
プッシュサブスクリプションには、関連付けられたP-256 ECDH鍵ペアと、 認証シークレットがあり、[RFC8291]に従う。
ユーザーエージェントが何らかの理由でプッシュサブスクリプションの鍵を変更する必要があり、 かつそのプッシュサブスクリプションの関連付けられたサービスワーカー登録 がnullでない場合、 ユーザーエージェントは、その更新をプッシュ サブスクリプションに対して行わなければならない。
プッシュサブスクリプションを作成するには、PushSubscriptionOptionsInit
optionsDictionaryを与えて、次を行う:
PushSubscriptionとする。
PushSubscriptionOptions
オブジェクトとし、その属性を対応するメンバーおよび値で初期化する
optionsDictionary。
options属性をoptionsに設定する。
applicationServerKey
属性が設定されている場合は、それを含める。
設定する。あらゆる例外を再スローする。
endpoint属性を、
プッシュ
サブスクリプションのプッシュエンドポイントに設定する。
expirationTimeを設定する。
プッシュサブスクリプションの関連付けられたサービスワーカー登録とは、 サービスワーカー 登録であり、そのスコープURLが 等しい、そのプッシュサブスクリプションのスコープを持つもの(存在する場合)である。 それ以外の場合はnullである。
プッシュサブスクリプションの関連付けられた サービスワーカー登録がnullになり得るのは、 それがウィンドウからアクセス可能なスコープを持つ場合に限られる。
逆に、サービスワーカー 登録の関連付けられたプッシュ サブスクリプションとは、プッシュサブスクリプションであり、そのスコープが 等しい、そのサービスワーカー 登録のスコープURLを持つもの(存在する場合)であり、それ以外の場合は nullである。
ユーザーエージェントまたはプッシュサービスは、たとえば一定の期間が経過したなどの理由により、更新してもよいことを選択できる。更新する対象は、プッシュ サブスクリプションであり、その関連付けられたサービスワーカー 登録がnullでない場合、いつでも 更新できる。
この場合、ユーザーエージェントは、必ず、プッシュサブスクリプションを作成する
手順を、現在のPushSubscriptionOptionsの作成時に
提供された
プッシュサブスクリプションを与えて実行し、新しいプッシュサブスクリプションの
スコープを、元のサブスクリプションのスコープに設定しなければならない。
新しいプッシュサブスクリプションは、必ず、
元のサブスクリプションとは異なる
鍵ペアを持たなければならない。
成功した場合、ユーザーエージェントは次に、"pushsubscriptionchange"
イベントを発火しなければならない。その際、サービスワーカー
登録として、プッシュ
サブスクリプションに関連付けられたものをregistrationとし、初期の
プッシュサブスクリプションを表すPushSubscriptionインスタンスをoldSubscriptionとし、
PushSubscription
新しいプッシュサブスクリプションを表すインスタンスを
newSubscriptionとする。
変更がアプリケーションサーバーに伝播する時間を確保するため、ユーザー エージェントは、更新後の短い期間、古いプッシュサブスクリプション宛てのメッセージを引き続き受け入れてもよい。 更新されたプッシュ サブスクリプション宛てのメッセージが受信された後は、古いプッシュサブスクリプションはすべて無効化されなければならない。無効化される。
ユーザーエージェントがプッシュサブスクリプションを更新できない場合、定期的に更新を再試行するべきである。
プッシュサブスクリプションがそれ以上
使用
できなくなった場合、たとえば有効期限が切れた場合、ユーザーエージェントは、
"pushsubscriptionchange"イベントを
発火しなければならず、サービスワーカー
登録
として、プッシュサブスクリプションに関連付けられたものをregistrationとし、PushSubscription
無効化されるプッシュサブスクリプションを表すインスタンスを
oldSubscription
とし、newSubscriptionにはnullを指定する。
プッシュサブスクリプションが無効化された場合、 ユーザーエージェントとプッシュサービスの両方は、その 詳細について保存されているすべてのコピーを削除しなければならない。 このプッシュ サブスクリプションに対する後続のプッシュメッセージは、 配信されてはならない。
プッシュサブスクリプションにウィンドウからアクセス可能なスコープがない場合、その関連付けられた サービスワーカー登録が登録解除されたときに、無効化されなければならない。その関連付けられたサービスワーカー 登録が 登録解除されたときである。ただし、プッシュサブスクリプションは、それより前に無効化されてもよい。
プッシュサブスクリプションにウィンドウからアクセス可能なスコープがない場合、 サービスワーカー 登録が消去されると削除される。
プッシュサービスという用語は、アプリケーション サーバーがWebアプリケーションにプッシュメッセージを送信できるようにするシステムを指す。プッシュサービスは、 それが提供するプッシュ サブスクリプションのためのプッシュエンドポイントまたはエンドポイントを提供する。
ユーザーエージェントは、プッシュ サブスクリプションの作成に使用されるプッシュサービスに接続する。ユーザーエージェントは、利用可能なプッシュサービスの選択肢を制限してもよい。 その理由には、サービスの 可用性(特定の国のファイアウォール、 または職場などのネットワークによってサービスがブロックされるかどうかを含む)、信頼性、バッテリー寿命への影響などの性能に関する懸念、および メタデータを特定のプッシュサービスへ送る、または送らないようにするための契約が含まれる。
Push APIは、強力な機能であり、 名前 "push" によって識別されます。
Permissions仕様との統合のため、
この仕様は
PushPermissionDescriptor
permission descriptor
type
を定義します。
WebIDLdictionary PushPermissionDescriptor : PermissionDescriptor {
boolean userVisibleOnly = false;
};
userVisibleOnlyは、
userVisibleOnly
と同じ意味です。
{name: "push", userVisibleOnly: false} は、
{name: "push", userVisibleOnly: true} よりも
強いです。
プッシュメッセージの内容は暗号化される[RFC8291]。しかし、プッシュ サービスは、アプリケーション サーバーからユーザーエージェントへプッシュサブスクリプションを介して送信されるメッセージのメタデータには、依然としてさらされる。 これには、メッセージの タイミング、頻度、およびサイズが含まれる。ユーザーエージェントが禁止する場合があるプッシュサービスの変更以外に、 現在知られている唯一の緩和策は、パディングによって見かけ上のメッセージ サイズを増加させることである。
プッシュメッセージが、Webアプリケーションと同一オリジンを持つアプリケーションサーバー によって送信されたという保証はない。アプリケーションサーバーは、 プッシュサブスクリプションを使用するために必要な詳細を、自らの 裁量で第三者と共有できる。
以下の要件は、可能な限りユーザーのプライバシーとセキュリティを保護すること、および その目標を満たすことを条件として、 アプリケーションサーバーとユーザーとの通信の完全性を保護することを意図している。
Push APIは、開発者が提供したイベントハンドラーを実行するために、サービスワーカー 登録に関連付けられたサービスワーカーを起動しなければならない場合がある。これにより、 ネットワークトラフィックなどのリソース使用が発生する可能性があり、ユーザーエージェントは、それを プッシュサブスクリプションを作成したWebアプリケーションに帰属させるべきである。
ユーザー
エージェントは、許可を取得するとき、または許可状態を決定するときに、PushSubscriptionOptionsを考慮してもよい。
許可が取り消された場合、ユーザーエージェントは、その許可で作成されたサブスクリプションについて
「pushsubscriptionchange」イベントを発火してもよく、
プッシュサブスクリプションに関連付けられたサービスワーカー
登録を
registrationとし、PushSubscriptionインスタンスで
プッシュサブスクリプションを表すものを
oldSubscriptionとし、newSubscriptionをnullとする。ユーザー
エージェントは、
影響を受けるサブスクリプションを並行して無効化しなければならない。
プッシュエンドポイントは、ユーザーに関する情報を プッシュサービス以外の主体が導出できるように、たとえばユーザーのデバイス、身元、位置などを公開してはならない。正確な要件については、 [RFC8030]のプライバシーに関する考慮事項を参照されたい。
無効化されたプッシュサブスクリプションのプッシュエンドポイントは、 新しいプッシュサブスクリプションに再利用されてはならない。これにより、ユーザーが削除できない永続的な 識別子が作成されることを防ぐ。また、ある プッシュサブスクリプションの詳細を再利用して、別のプッシュメッセージを送信することも防ぐ。 プッシュサブスクリプションへ。
このセクションは規範的ではありません。
プッシュメッセージは、アプリケーションサーバーからウェブアプリケーションへ以下の手順で送信されます:
この全体的なフレームワークにより、アプリケーションサーバーは、サービス ワーカーを、アプリケーションサーバーでのイベントに応答して起動できます。それらの イベントに関する 情報は、プッシュメッセージに含めることができ、これによりWebアプリケーションは、 ネットワーク 要求を開始する必要なく、それらのイベントに適切に対応できる可能性があります。
以下のコードと図は Push API の仮想的な利用例を示します。
このセクションは規範的ではありません。
// 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);
}
このセクションは規範的ではありません。
PushSubscription に含まれるフィールドは、
アプリケーションサーバーが プッシュメッセージを送信するために必要なすべての情報です。Push API と互換性のあるプッシュサービスは プッシュエンドポイント(Web Push
プロトコルに準拠)を提供します。これらのパラメータ・属性は以下の通りです:
PushSubscriptionのURLであり、
アプリケーションサーバーがプッシュメッセージのWeb
アプリケーションへの配信を要求できるようにする。
getKey()メソッドは、PushSubscription上で、
プッシュメッセージの暗号化および認証に使用される鍵材料を取得するために使用される。
この
関数を呼び出すたびに、対応する鍵の値を含む新しいArrayBufferが返され、
識別された鍵が存在しない場合はnullが返される。値
"p256dh"を渡すと、楕円曲線
Diffie-Hellman(ECDH)公開鍵が取得される。
この鍵はプッシュサブスクリプションに関連付けられている。
authの値を渡すと、アプリケーションサーバーが
そのメッセージの認証に使用する認証シークレットが返される。これらの鍵はアプリケーション
サーバーによって、
プッシュサブスクリプション用のメッセージを暗号化および認証するために使用される。これは
[RFC8291]に記載されている。
この仕様は 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
オブジェクトです。
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 コンテンツコーディングを必ずサポートしなければならず、互換性のために以前のドラフトで定義されたコンテンツコーディングをサポートしてもよいです。
subscribe() メソッドの手順は以下のとおりです:
/"および
globalの関連付けられた
DocumentのURLを与えて実行した結果に設定する。
https"でない場合、
次に
グローバル
タスクをキューに入れる。ネットワーキング
タスクソース上でglobalを使用して拒否する
promiseを"NotAllowedError" DOMExceptionで拒否し、
これらの手順を終了する。
userVisibleOnly"]
がfalseであり、ユーザー
エージェントがtrueであることを要求する場合、グローバル
タスクをキューに入れる。ネットワーキング
タスクソース上でglobalを使用して拒否するpromiseを"NotAllowedError"
DOMExceptionで拒否し、
これらの手順を終了する。
applicationServerKey"]
がnullであり、
プッシュサービスがnon-nullであることを要求する場合、グローバル
タスクをキューに入れる。
ネットワーキング
タスクソース上でglobalを使用して拒否するpromiseを
"NotSupportedError" DOMExceptionで拒否し、
これらの手順を終了する。
applicationServerKey"]
がnon-nullの場合:
applicationServerKey"]
が文字列である場合、
その値を、ArrayBufferで、
次の結果として得られるオクテット列を含むものに設定する:
options["applicationServerKey"]
を
base64urlエンコーディング[RFC7515]を使用して復号する。
InvalidCharacterError"
DOMException
で拒否し、これらの手順を終了する。
applicationServerKey"]
が
P-256曲線上の有効な点を記述していることを確認する。その値が無効である場合、グローバル
タスクをキューに入れる
ネットワーキング
タスクソース上でglobalを使用して拒否するpromiseを
"InvalidAccessError"
DOMException
で拒否し、これらの手順を終了する。
InvalidStateError"
DOMException
で拒否し、
これらの手順を終了する。
denied"の場合、
グローバル
タスクをキューに入れる。
ユーザー
インタラクションタスクソース上でglobalを使用して拒否するpromiseを
"NotAllowedError"
DOMException
で拒否し、これらの手順を終了する。
AbortError"
DOMException
で拒否し、これらの手順を終了する。
options属性と比較する。
BufferSource
値の内容は、
参照ではなく等価性について比較される。
InvalidStateError"
DOMException
で拒否し、これらの手順を終了する。
PushSubscriptionで
解決する。
getSubscription()メソッドの手順は次のとおり:
/"およびglobalの
関連付けられた
DocumentのURLを与えて実行した結果に設定する。
DOMExceptionで拒否する。
その名前は"AbortError"であり、
これらの手順を終了する。
PushSubscriptionで
解決する。
permissionState() メソッドの手順は次の通り:
promise を 新しい promise にする。
global を this の 関連グローバルオブジェクト にする。
並列で:
state を "push" の 許可状態 にする。
グローバルタスクをキューに入れる:networking task source 上で、global に対して promise を state で解決するためにキューする。
promise を返す。
プッシュサービスの利用許可は永続可能であり、有効な許可があれば以降のサブスクリプションで再確認不要です。
許可を求める必要がある場合は、subscribe() メソッドを呼び出して取得します。
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] に使用される値とは
異なるものでなければなりません。
WebIDLdictionary PushSubscriptionOptionsInit {
boolean userVisibleOnly = false;
(BufferSource or DOMString)? applicationServerKey = null;
};
userVisibleOnlyメンバーは、
trueに設定されると、プッシュ
サブスクリプションが、たとえばWeb通知を表示することによって、その効果がユーザーに見えるようにされるプッシュメッセージにのみ使用されることを示す。
[NOTIFICATIONS]
PushSubscriptionOptionsInitは、
プッシュサブスクリプションに関連付けられた追加のオプションを表す。ユーザーエージェントは、
ユーザーから明示的な許可を要求するときに、これらのオプションを考慮してもよい。
オプションが考慮される場合、
ユーザー
エージェントは、受信するプッシュメッセージに対してそれを強制するべきである。
これらのオプションは任意であり、ユーザーエージェントは、その サブセットのみをサポートすることを選択してもよい。ユーザーエージェントは、サポートしていないオプションを公開してはならない。
一度設定されると、プッシュサブスクリプションのオプションは変更できない。既存のプッシュ
サブスクリプションは、unsubscribeを介して購読解除し、新しいオプションを持つ
プッシュサブスクリプションを作成できる。
applicationServerKeyメンバーは、ユーザー
エージェントが
プッシュサービスとのプッシュサブスクリプションを確立するときに使用される。
applicationServerKey
オプションには、アプリケーションサーバーの楕円曲線公開
鍵が含まれる。これは、アプリケーションサーバーが
[RFC8292]で定義されているように、このプッシュ
サブスクリプションにプッシュメッセージを送信するとき、自身を認証するために使用する鍵であり、
プッシュサービスは、対応する秘密鍵が
認証トークンの生成に使用されない限り、あらゆる
プッシュメッセージを拒否する。
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)
メソッドの手順は次のとおり:
ArrayBufferオブジェクトとする。
p256dh"の場合:
unsubscribe()メソッドは、呼び出されたとき、
次の手順を実行しなければならない:
falseで解決し、これらの手順を終了する。
ユーザーエージェントが、プッシュサービスに プッシュ サブスクリプションを無効化するよう要求できなかった場合、たとえばネットワーク 障害のためである場合、合理的な 期間、プッシュサービスへの要求を再試行するべきである。
trueで解決する。
toJSON()メソッドは、呼び出されたとき、次の手順を実行しなければならない:
PushSubscriptionJSON辞書とする。
endpoint属性を取得することを
thisに対して行った結果に設定する。
expirationTime属性を取得することをthisに対して行った結果に設定する。
PushSubscriptionKeys辞書とする。
getKey("p256dh")によって返された
値を、USVStringとして、パディングなしのURLセーフbase64エンコーディング
[RFC4648]したものに設定する。
getKey("auth")によって返された
値を、USVStringとして、パディングなしのURLセーフbase64エンコーディング
[RFC4648]したものに設定する。
PushSubscriptionJSON辞書は、
PushSubscriptionのJSON型を表す。ECMAScriptでは、これは
JSON.stringify()
関数を通じてJSON文字列に変換できる。
keysレコードには、サポートされている各
PushEncryptionKeyName
エントリについて、その値のURLセーフbase64エンコード表現
[RFC4648]へのエントリが含まれる。
PushSubscriptionのオプションは
シリアライズされないことに注意されたい。
プッシュメッセージの暗号化に使用される暗号化鍵は、Webアプリケーションに
getKey()メソッドまたは
PushSubscriptionのシリアライザーを通じて提供される。各鍵には、
PushEncryptionKeyName
列挙型の値を使用して名前が付けられる。
WebIDLenum PushEncryptionKeyName {
"p256dh",
"auth"
};
p256dh 値は
[RFC8291]で記述されるP-256
ECDH ディフィー・ヘルマン公開鍵の取得に使います。
auth 値は
[RFC8291]で記述される認証用シークレットの取得に使います。
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に対して以下の手順を実行します:
BufferSource
USVString
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" です。
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 インターフェースを継承するインターフェースが呼び出されたとき、通常の イベント構築手順に加えて以下の手順を実行します:
data メンバーが存在しない場合、イベントの data 属性を
null に設定し、この手順を終了します。
data" メンバーから得た結果とします。data 属性に、PushMessageData インスタンス(bytes が b)を設定します。
data
属性は初期化時の値を返します。
notification 属性は初期化時の値を返します。
user agentがpush serviceからpush messageを受信すると、 それはMUST次のステップを実行します。
subscriptionを、push messageに対応するアクティブなpush subscriptionとします。
registrationをsubscriptionのassociated service worker registrationとします。
bytesをnullとします。
もしpush messageがペイロードを含む場合:
subscriptionに関連付けられたキーペアからの秘密鍵と[RFC8291]で説明されているプロセスを使用して、push messageのペイロードを復号化します。bytesを結果のbyte sequenceに設定します。
もし、何らかの理由でpush messageのペイロードを復号化できなかった場合、acknowledge push messageし、これらのステップを中止します。
pushイベントは、プッシュ
メッセージが正常に
プッシュサブスクリプションに関連付けられた鍵ペアを使用して復号されなかった場合、発火されない。
もしbytesがnullでない場合:
baseURLをsubscriptionのscopeとします。
originをbaseURLのoriginとします。
fallbackTimestampをcurrent coarsened wall timeとします。
declarativeResultを、bytes、origin、 baseURL、およびfallbackTimestampが与えられた場合のdeclarative push message parserを実行した結果とします。
もしdeclarativeResultがfailureでない場合:
notificationをdeclarativeResultのnotificationとします。
notificationのservice worker registrationをregistrationに設定します。
notificationShownをfalseとします。
もしdeclarativeResultのmutable がtrueで、registrationがnullでない場合:
resultを、registration、null、およびnotificationを表す新しいNotification
オブジェクトが与えられた場合のfiring a
push eventの結果とします。
もしresultがfailureでない場合、notificationShownをresultのnotification shownに設定します。
notificationShownがfalseの場合、通知 表示手順を notificationとnullを与えて実行する。
環境 設定オブジェクトがないため、nullが渡される。これにより、 notificationのアイコンなどのリソースが、 サービス ワーカーを介さずに取得されることも保証される。
Acknowledge push messageし、これらのステップを中止します。
もしregistrationがnullの場合、これらのステップを中止します。
dataを、PushMessageDataオブジェクトとします。このオブジェクトのbytesは、もしbytesがnullでない場合はbytes、それ以外の場合はnullです。
resultを、registration、data、およびnullが与えられた場合のfiring a push eventの結果とします。
もしresultがfailureで、同じpush messageがservice worker registrationに複数回配信されたにもかかわらず成功しなかった場合、acknowledge push messageします。
もしresultがfailureでない場合、acknowledge push messageします。
pushイベント結果は、 タプルであり、 notification shown(boolean)を含みます。
pushイベントの発火は、
Service Worker登録
registration、
PushMessageData オブジェクトまたは null data、
notification または null
notification
を受け取り、以下の手順を実行します。失敗または pushイベント結果を返します。
notificationResult を null で初期化します。
registration の showNotification()が正常に呼び出されたか
を false に設定します。
機能的イベントの発火で
"push" を PushEvent 型で
registration に対して以下のプロパティで発火する:
data
notification
その後 dispatchedEvent を使って以下の手順を並列で実行:
extend lifetime promises のすべてのpromiseが解決されるまで待機する。
正常に解決されなければ notificationResult を失敗に設定する。
そうでなければ notificationResult を registration の
showNotification()が正常に呼び出されたか
の値に設定する。
notificationResult が null でなくなるまで待機する。
notificationResult が失敗なら失敗を返す。
(notificationResult) を返す。
プッシュメッセージを確認応答するとは、プッシュメッセージ pushMessageを与えられたとき、pushMessageの受信を [RFC8030]に従って確認応答することを意味する。
プッシュメッセージを確認応答すると、プッシュサービスは メッセージの配信を停止し、アプリケーションサーバーに成功を報告する。これにより、 同じ プッシュメッセージがプッシュサービスによって無期限に再試行されることを防ぐ。
確認応答することは、アプリケーションサーバーが誤って プッシュメッセージの配信成功を示す 配信確認を受信する可能性があることも意味する。したがって、 確認応答する前に複数回の拒否を許可するべきであり、少なくとも 3回の試行を許可することが推奨される。
pushsubscriptionchangeイベントは、 プッシュサブスクリプションの変更を示す。 これは、たとえば更新、取り消し、または喪失されたために、アプリケーションの制御外で 引き起こされたものである。
「pushsubscriptionchange」イベントを発火するには、サービスワーカー
登録であるregistration、newSubscription、および
oldSubscriptionが与えられたとき、ユーザー
エージェントは、機能イベントを発火しなければならない。
名前は「pushsubscriptionchange」とし、
PushSubscriptionChangeEventを
registration上で次のプロパティとともに使用する:
newSubscription
oldSubscription
新しいプッシュサブスクリプションの詳細をアプリケーション サーバーに送信するときは、[WEB-BACKGROUND-SYNC]のような、より信頼性の高い同期機構の使用を検討されたい。 ユーザーは、fetchが失敗する可能性のある不安定なネットワーク状況に置かれる場合がある。
WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushSubscriptionChangeEvent : ExtendableEvent {
constructor(DOMString type, optional PushSubscriptionChangeEventInit eventInitDict = {});
readonly attribute PushSubscription? newSubscription;
readonly attribute PushSubscription? oldSubscription;
};
newSubscription 属性は、取得時に初期化された値を返します。
oldSubscription 属性は、取得時に初期化された値を返します。
WebIDLdictionary PushSubscriptionChangeEventInit : ExtendableEventInit {
PushSubscription newSubscription = null;
PushSubscription oldSubscription = null;
};
newSubscriptionメンバーは、プッシュサブスクリプションの詳細を示し、
pushsubscriptionchangeイベントの呼び出し時に有効なものである。
新しいプッシュサブスクリプションを確立できなかった場合、値は
nullになる。たとえば、
Webアプリケーションが明示的な許可を失った場合である。
oldSubscriptionメンバーは、今後使用すべきでは
ないプッシュサブスクリプションの詳細を示す。ユーザーエージェントが
完全な詳細一式を
提供できない場合、たとえばデータベースが部分的に破損している場合、値はnullになる。
Push API は、プッシュサービスから受信したデータを提示する手段を自身では提供しません。代わりに、Push APIは他のAPI ― 主に Notifications API Standard ― に依存し、受信した情報をエンドユーザーに提示します。そのため、Push API自体にはアクセシビリティ要件はありません。ただし、[NOTIFICATIONS] などの仕様では、通知をアクセシブルな方法で提示するための指針が提供されています。
さらに、アクセシブルなインターフェースの提示には、プッシュメッセージで伝達できる以上の情報が必要になる場合があります。プッシュメッセージは少量のコンテンツや識別子の伝達に最適です。より大きなリソースはサーバーから取得する必要があります。
この仕様のセクションで非規範的と明記されている部分に加え、全ての作成ガイドライン、図、例、注記は非規範的です。それ以外の全ては規範的です。
この文書における MAY、MUST、MUST NOT、SHOULD、SHOULD NOT という用語は、 BCP 14 [RFC2119] [RFC8174] に記載された通り、ここに示すように全て大文字で現れた場合にのみ、その意味で解釈されます。
この仕様では、含まれるインターフェースを実装する単一の製品 ― ユーザーエージェント ― に適用される適合性基準を定義します。
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;
};
編集者は、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。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: