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ヘッダーは、[RFC7231]の3.1.2.2節で説明されており、プッシュメッセージのペイロードに適用されたコンテンツコーディングを示します。
アプリケーションサーバーという用語は、ウェブアプリケーションのサーバー側コンポーネントを指します。
プッシュメッセージは、アプリケーションサーバーからウェブアプリケーションに送信されるデータです。
プッシュメッセージは、そのメッセージが送信されたアクティブワーカーに配信されます。このワーカーは、プッシュ購読に関連付けられています。サービスワーカーが現在起動していない場合は、配信のためにワーカーが起動されます。
宣言的プッシュメッセージは、ユーザーエージェントが理解できるJSONドキュメントをデータにもつ プッシュメッセージです。ユーザーエージェントは、受信した プッシュメッセージごとに宣言的プッシュメッセージであるかどうかを 宣言的プッシュメッセージパーサーを使って判定します。
宣言的プッシュメッセージを利用することで、Service Worker を介さずに通知を作成・表示できます。ただし、アプリケーションサーバーの意図で Service Worker を介することもできます。そのような場合、プッシュメッセージの宣言的性質は、たとえばストレージ圧迫などで Service Worker が退去された場合のバックアップとして機能します。また、通知データの伝達によりオブジェクト指向的な手法を提供します。
{
"web_push": 8030,
"notification": {
"title": "Ada emailed ‘London’",
"lang": "en-US",
"dir": "ltr",
"body": "Did you hear about the tube strikes?",
"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) を返します。
プッシュサブスクリプションは、ウェブアプリケーションの代理として ユーザーエージェントと プッシュサービスの間で確立されるメッセージ配信のコンテキストです。
プッシュサブスクリプションには、スコープが関連付けられています。これはURLです。
プッシュサブスクリプションは、そのスコープの パスがリストでサイズが1、かつスコープの パス[0]が空文字列である場合、ウィンドウアクセシブルスコープを持つとみなされます。
プッシュサブスクリプションには、プッシュエンドポイントが関連付けられています。これは 絶対に プッシュサービスによって公開される絶対URLであり、 アプリケーションサーバーが プッシュメッセージを送信できる場所です。プッシュエンドポイントは 一意に プッシュサブスクリプションを識別する必要があります。
プッシュサブスクリプションは関連する サブスクリプション有効期限を持つ場合があります。設定されている場合、それは1970年1月1日00:00:00 UTCからのミリ秒単位の時刻であり、その時点でサブスクリプションが非アクティブ化されます。ユーザーエージェントは できるだけサブスクリプションが期限切れになる前にリフレッシュを試みるべきです。
プッシュサブスクリプションは、P-256 ECDH鍵ペアおよび認証シークレットの内部スロットを持ちます。これらは [RFC8291] に従い、必ずプッシュサブスクリプションの作成時に格納されます。
ユーザーエージェントが何らかの理由でプッシュサブスクリプションの鍵を変更する必要がある場合、 かつプッシュサブスクリプションの関連サービスワーカー登録がnullでない場合、 必ずリフレッシュを行う必要があります。
プッシュサブスクリプションを作成するには、PushSubscriptionOptionsInit
optionsDictionaryを与えられたとき:
PushSubscription
を作成する。
PushSubscriptionOptions
オブジェクトを割り当て、その属性をoptionsDictionaryの対応するメンバーと値で初期化する。
options
属性にoptionsを設定する。
getKey
()
メソッドを
p256dh
引数で呼び出すことで取得できる。
getKey
()
メソッドを
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]。しかし、プッシュサービスは、 アプリケーションサーバーが ユーザーエージェントに プッシュサブスクリプション経由で送信した メッセージのメタデータには依然としてアクセスできます。これにはメッセージのタイミング、頻度、サイズが含まれます。 プッシュサービスを変更する以外に(ユーザーエージェントが許可しない場合があります)、 既知の対策はメッセージサイズをパディングで大きく見せることのみです。
プッシュメッセージがウェブアプリケーションと同じオリジンの アプリケーションサーバーから送信されたことは保証できません。 アプリケーションサーバーは プッシュサブスクリプションを利用するために必要な詳細情報を 第三者と自身の裁量で共有可能です。
以下の要件は、可能な限りユーザーのプライバシーとセキュリティを保護することを目的としており、その目標を満たすことを前提に、アプリケーションサーバーとユーザーの通信の完全性を保護することも目的としています。
Push APIは、開発者が提供するイベントハンドラを実行するために、Service Workerの登録に関連付けられたService Workerを起動する必要がある場合があります。これにより、ネットワークトラフィックなどのリソース消費が発生し、ユーザーエージェントは、そのリソース消費をPushサブスクリプションを作成したウェブアプリケーションに帰属させるべきです。
ユーザーエージェントは、許可取得または許可状態の判定時に、PushSubscriptionOptions
を考慮してもよい。
許可が取り消された場合、ユーザーエージェントは、その許可で作成されたサブスクリプションに対して、発火してもよい"pushsubscriptionchange
"イベントを、service worker
registrationをregistration、PushSubscription
インスタンスでoldSubscription、null
でnewSubscriptionとして発火することができる。ユーザーエージェントは、該当するサブスクリプションを並行して無効化しなければならない無効化する。
Pushエンドポイントは、ユーザーのデバイス、ID、位置情報などの情報がPushサービス以外の主体によって導出されることを許可してはならない。正確な要件については [RFC8030] のプライバシーに関する考慮点を参照のこと。
無効化されたPushサブスクリプションのPushエンドポイントは、新しいPushサブスクリプションに再利用してはならない。これにより、ユーザーが削除できない永続的な識別子の作成を防ぐことができる。さらに、一つのPushサブスクリプションの詳細を使って別のPushサブスクリプションへPushメッセージを送信することも防止できる。
このセクションは規範的ではありません。
プッシュメッセージは、アプリケーションサーバーからウェブアプリケーションへ以下の手順で送信されます:
この全体的なフレームワークによって、アプリケーションサーバーは、Service Workerをイベントに応じて起動できます。イベントに関する情報は プッシュメッセージに含めることができ、ウェブアプリケーションは追加のネットワークリクエストをしなくても適切に反応できます。
以下のコードと図は 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で基本URLパーサーを実行した結果を設定する。
https
"でない場合、グローバルタスクをキューに入れる(networking
task sourceを使い、globalでpromiseをreject、例外は"NotAllowedError
"
DOMException
)。
userVisibleOnly
が false
であり、ユーザーエージェントが true
を要求する場合、グローバルタスクをキューに入れて
promise を NotAllowedError で reject。
applicationServerKey
メンバーに非null値を含まず、プッシュサービスがそれを要求する場合、グローバルタスクをキューに入れて promise を NotSupportedError で
reject。applicationServerKey
属性に非null値があれば:
applicationServerKey
が DOMString
なら、その値を base64url デコードして ArrayBuffer
にする。失敗したら InvalidCharacterError で reject。applicationServerKey
が P-256 曲線上の有効な点か確認し、無効なら InvalidAccessError で reject。denied
"
なら、グローバルタスクをキューに入れて promise を NotAllowedError で reject。options
属性を比較し、BufferSource型は値の等価性比較。PushSubscription
(subscription対応)で
resolve。
getSubscription()
メソッドの手順は以下のとおりです:
/
" と global の関連 Document
の URL を使って基本URLパーサーの結果を設定。DOMException
(名前は
"AbortError
")で
reject、手順終了。PushSubscription
(subscription対応)で
resolve。
permissionState()
メソッドは呼び出されたとき、以下の手順を必ず実行します:
PermissionDescriptor
にし、name
を
"push" で初期化。プッシュサービスの利用許可は永続可能であり、有効な許可があれば以降のサブスクリプションで再確認不要です。
許可を求める必要がある場合は、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]
Annex A で記載された非圧縮形式(先頭0x04オクテット、合計65オクテット)でエンコードされていなければなりません。
DOMString
として提供する場合は、
必ず base64urlエンコード [RFC7515] でエンコードしてください。
ユーザーエージェントは applicationServerKeyが存在しない場合で、プッシュサービスが運用上要求する場合、購読試行を拒否してもよいです。
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>
インスタンスとして初期化します。getKey
()
参照)。getKey
で返される値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: