Copyright © 2025 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に設定します。
getKey()メソッドを
PushSubscriptionに対して、引数
"p256dh"を指定して呼び出すことで取得できます。
getKey()メソッドを
PushSubscriptionに対して、引数"auth"を指定して呼び出すことで取得できます。
applicationServerKey
属性がoptionsに
設定されている場合は、その属性を含めます。発生した例外を再スローします。
endpoint属性を、
プッシュ
サブスクリプションのプッシュエンドポイントに設定します。
expirationTimeを設定します。
プッシュサブスクリプションの 関連サービスワーカー登録は、 サービスワーカー登録の スコープURLが、 等しい場合のプッシュサブスクリプションの スコープであればその登録、そうでなければnullです。
プッシュサブスクリプションの 関連サービスワーカー登録は、 ウィンドウアクセシブルスコープを持つ場合のみnullとなります。
逆に、サービスワーカー登録の 関連プッシュサブスクリプションは、 プッシュサブスクリプションの スコープが 等しい場合の サービスワーカー登録の スコープURLであればそのサブスクリプション、そうでなければnullです。
ユーザーエージェントまたはプッシュサービスは、いつでも、たとえば一定期間が経過した場合などに、リフレッシュを選択して、関連サービスワーカー登録がnullでないプッシュサブスクリプションをリフレッシュすることができます。
この場合、ユーザーエージェントは、現在のプッシュサブスクリプションの作成時に指定されたPushSubscriptionOptionsを用いて、プッシュサブスクリプションを作成する手順を実行し、新しいプッシュサブスクリプションのスコープを元のサブスクリプションのスコープに設定しなければなりません。
新しいプッシュサブスクリプションは必ず元のサブスクリプションとは異なる鍵ペアを持たなければなりません。
正常に完了した場合、ユーザーエージェントは、プッシュサブスクリプションに関連付けられたサービスワーカー登録をregistration、初期のプッシュサブスクリプションを表すPushSubscriptionインスタンスをoldSubscription、新しいプッシュサブスクリプションを表すPushSubscriptionインスタンスをnewSubscriptionとして、"pushsubscriptionchange"イベントを発火しなければなりません。
変更内容をアプリケーションサーバーに反映させるための猶予期間を設けるため、ユーザーエージェントは、リフレッシュ後も短期間、古いプッシュサブスクリプションに対するメッセージの受信を許可してもよいです。リフレッシュされたプッシュサブスクリプションに対してメッセージが受信されると、すべての古いプッシュサブスクリプションは必ず非アクティブ化されなければなりません。
ユーザーエージェントがプッシュサブスクリプションのリフレッシュに失敗した場合、定期的にリフレッシュを再試行するべきです。たとえば有効期限が切れるなどして、プッシュサブスクリプションが利用できなくなった場合、ユーザーエージェントは、プッシュサブスクリプションに関連付けられたサービスワーカー登録をregistration、非アクティブ化されるプッシュサブスクリプションを表すPushSubscriptionインスタンスをoldSubscription、newSubscriptionとしてnullを指定し、"pushsubscriptionchange"イベントを発火しなければなりません。
プッシュサブスクリプションが非アクティブ化された場合、 ユーザーエージェントおよびプッシュサービスは、 保存されているその詳細のコピーを必ず削除しなければなりません。 その後、このプッシュサブスクリプションへの プッシュメッセージは 絶対に配信されてはなりません。
プッシュサブスクリプションがウィンドウからアクセス可能なスコープを持たない場合、そのプッシュサブスクリプションは必ず 非アクティブ化されなければならず、その時点は、関連付けられたサービスワーカー 登録が 登録解除されたときです。ただし、プッシュサブスクリプションは任意で非アクティブ化される時点を早めることもできます。
ウィンドウアクセシブルスコープを持たない プッシュサブスクリプションは、 サービスワーカー登録がクリアされたときに削除されます。
プッシュサービスという用語は、 アプリケーションサーバーが ウェブアプリケーションにプッシュメッセージを送信できるようにする仕組みを指します。 プッシュサービスは、その配信対象となるプッシュサブスクリプションのための プッシュエンドポイントや エンドポイントを提供します。
ユーザーエージェントは、 プッシュサービスに接続し、 プッシュサブスクリプションを作成します。 ユーザーエージェントは 利用可能なプッシュサービスの選択肢を 制限してもよいです。 その理由としては、サービスの可用性(特定の国や職場のネットワークなどでサービスがファイアウォールによってブロックされているかどうかも含む)、 信頼性、バッテリー寿命への影響、特定のプッシュサービスに メタデータの流れを誘導する、または回避するための契約など、パフォーマンス関連の懸念が挙げられます。
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とし、nullをnewSubscriptionとします。ユーザー
エージェントは必ず、
非アクティブ化処理を、影響を受けるサブスクリプションに対して並列に実行しなければなりません。
プッシュエンドポイントは、決して、 プッシュサービス以外の主体が、ユーザーのデバイス、アイデンティティ、所在地など、 ユーザーに関する情報を推測できるような情報を公開してはなりません。正確な要件については、 [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 であり、アプリケーションサーバーがウェブアプリケーションに プッシュメッセージを配信リクエストするために利用します。
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 を与えて
basic
URL parser
を実行した結果を設定する。
https" でないならば、
グローバルタスクをキューする
(networking
task source を使い、global を使って)
reject
promise に "NotAllowedError" の
DOMException
を与えて、これらの手順を終了する。
userVisibleOnly"]
が
false かつユーザーエージェントが true を必要とする場合、
グローバルタスクをキューする
(networking
task source を使い、global を使って)
reject promise
に "NotAllowedError"
DOMException
を与え、これらの手順を終了する。
applicationServerKey"]
が null かつ
push service が非 null を必要とする場合、
グローバルタスクをキューする(
networking
task source を使い、global を使って)
reject promise
に
"NotSupportedError"
DOMException
を与えて、これらの手順を終了する。
applicationServerKey"]
が非 null ならば:
applicationServerKey"]
が文字列であれば、
その値を ArrayBuffer 型にし、
options["applicationServerKey"]
を base64urlデコード([RFC7515])したオクテット列で埋める。
InvalidCharacterError"
DOMException
を与えて、これらの手順を終了する。
applicationServerKey"]
が
P-256曲線上の有効な点であることを確認する。
無効な場合は
グローバルタスクをキューする
(networking
task source、global を使って)
reject
promise に
"InvalidAccessError"
DOMException
を与えて、これらの手順を終了する。
InvalidStateError"
DOMException
を与えて、これらの手順を終了する。
denied"
であれば、
グローバルタスクをキューする
(user
interaction task source、global を使って)
reject
promise に
"NotAllowedError"
DOMException
を与えて、これらの手順を終了する。
AbortError"
DOMException
を与えて、これらの手順を終了する。
options 属性を比較する。
BufferSource
値は参照ではなく内容が等しいかを比較する。
InvalidStateError"
DOMException
を与えて、これらの手順を終了する。
PushSubscription
(subscription に対応)
を与える。
getSubscription() メソッドの手順は以下のとおりです:
/"とglobalの
関連付けられた
DocumentのURLを与えて実行した結果に設定します。
DOMException
(名前は"AbortError")で拒否し、
これらの手順を終了します。
PushSubscriptionで解決し、その値は
subscriptionに対応するものとします。
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 PushSubscriptionJSON {
USVString endpoint;
EpochTimeStamp? expirationTime = null;
record<DOMString, USVString> keys;
};
endpoint属性の取得時、ユーザーエージェントは必ず
プッシュエンドポイントを返します。
これは、プッシュ購読に関連付けられています。
ユーザーエージェントは
入力依存分岐のない(つまり定数時間の)シリアライズ手法を使用しなければなりません。
expirationTime属性の取得時、ユーザーエージェントは
必ず
プッシュ購読に関連付けられている購読有効期限を返します。
存在しない場合はnullを返します。
options属性の取得時、ユーザーエージェントは
必ず
PushSubscriptionOptionsオブジェクトを返します。
これは、プッシュ購読に関連付けられたオプションを表します。
getKey()メソッドは、暗号化および認証に使用できる鍵データを取得します。
getKey()が呼び出された際、以下の処理が行われます:
name引数で指定された鍵に対応する内部スロットを探します。nullを返します。ArrayBufferインスタンスでkeyを初期化します。
p256dh" 公開鍵は
[ANSI-X9-62]
Annex A で定義される非圧縮形式(先頭が0x04オクテット、65オクテット)でエンコードされます。
auth パラメータは ユーザーエージェントが
アプリケーションサーバーから送信されたメッセージの認証に使うオクテット列です。
"p256dh" および "auth" という鍵名は
必ずサポートしなければならず、それらの値は
[RFC8291] に従い
ユーザーエージェントが受信したプッシュメッセージの復号に必要なものと一致しなければなりません。
unsubscribe() メソッドは呼び出された際、以下の手順を必ず実行します:
falseで解決し、手順終了。
もしuser agentが、例えばネットワークの故障のために、push serviceにdeactivateをリクエストできなかった場合、push subscriptionを、妥当な時間の間、push serviceへのリクエストを再試行SHOULD。
trueで解決します。
toJSON() メソッドは呼び出された際、以下の手順を必ず実行します:
PushSubscriptionJSON 辞書とします。record<DOMString, USVString>インスタンスとして初期化します。PushSubscriptionから鍵名の順に1つずつ取り、次を実行します:
getKey()を参照)。
getKeyによって返される値とします。
USVStringとします。ユーザーエージェントは必ず、
bの値に基づいて
分岐しないシリアル化方法を使用しなければなりません。
PushSubscriptionJSON 辞書は、
JSON型としての
PushSubscriptionを表します。ECMAScriptでは
JSON.stringify()
関数で文字列に変換できます。
keys レコードは、サポートされる各
PushEncryptionKeyName
エントリーに対して、その値のURLセーフbase64エンコード表現 [RFC4648] を含みます。
PushSubscription のオプションはシリアライズされないことに注意してください。
プッシュメッセージ暗号化に利用される鍵は、
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イベントは、push
messageに関連付けられたキーペアを使用して正常に復号化されなかったpush subscriptionに対しては発生しません。
もし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が与えられた場合のnotification show stepsを実行します。
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 を [RFC8030] に従い受信したことを認識することを意味します。
プッシュメッセージの認識は、 プッシュサービスが メッセージの配信を停止し、アプリケーションサーバーに成功を報告することになります。 これにより同じ プッシュメッセージが プッシュサービスによって無限に再試行されるのを防ぎます。
認識はまた、アプリケーションサーバーが プッシュメッセージの 配信成功通知を誤って受け取る可能性があることも意味します。よって複数回の拒否を認めるべきであり、少なくとも3回の試行が推奨されます。
pushsubscriptionchange イベントは、 アプリケーションの制御外で プッシュ購読 が変更されたこと(例:更新、取り消し、喪失など)を示します。
"pushsubscriptionchange"イベントの発火は、
Service Worker登録
registration、newSubscription、oldSubscription を受け取り、
ユーザーエージェントは
機能的イベントの発火で
"pushsubscriptionchange" を
PushSubscriptionChangeEvent 型で
registration に対して以下のプロパティで発火します:
newSubscription
oldSubscription
新しいpush subscriptionの詳細をapplication serverに送信する際は、[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 メンバーは、push
subscriptionの詳細を示します。これは、pushsubscriptionchange
イベントの呼び出しごとに有効です。
この値は、たとえば、Webアプリケーションがexpress
permissionを失ったために、新しいpush subscriptionを確立できなかった場合、
nullになります。
oldSubscription メンバーは、もはや使用SHOULD
NOTでないpush subscriptionの詳細を示します。たとえば、部分的なデータベースの破損が原因で、user agentが詳細の完全なセットを提供できない場合、
値は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 PushSubscriptionJSON {
USVString endpoint;
EpochTimeStamp? expirationTime = null;
record<DOMString, USVString> 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: