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節に従い情報開示が必要です。
この文書は 2023年11月3日 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ドキュメントデータを持つプッシュメッセージです。ユーザーエージェントは、各受信プッシュメッセージを機会的に解析し、宣言的プッシュメッセージかどうかを宣言的プッシュメッセージパーサーを用いて判定します。
宣言的プッシュメッセージは、サービスワーカーの関与なしで通知の作成・表示を可能にします。ただし、アプリケーションサーバーが望めばサービスワーカーも関与可能です。その場合、プッシュメッセージの宣言的性質は、例えばストレージのプレッシャー等でサービスワーカーが破棄された場合のバックアップとして機能します。また、通知データの送信によりオブジェクト指向的なアプローチを提供します。
{
"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
真偽値。
silent
真偽値。
requireInteraction
真偽値。
NotificationOptions
辞書との一貫性のためrequire_interaction
とは名付けられていません。
data
任意のJSON値。
actions
以下のメンバーを持つJSONオブジェクトの配列で、すべてNotificationAction
辞書から派生しており、同時に管理されます。
action
(必須)
文字列。
title
(必須)
文字列。
navigate
(必須)
URLを保持する文字列。
icon
URLを保持する文字列。
mutable
真偽値。trueの場合、Notification
オブジェクト(宣言的プッシュメッセージで記述されたもの)を含むpush
イベントがサービスワーカー(存在する場合)へ
dispatch されます。
宣言的プッシュメッセージパーサー結果は、タプルであり、 notification( 通知)と mutable(真偽値)から成ります。
宣言的プッシュメッセージパーサーは、バイト列
bytes、オリジン
origin、URL
baseURL、
EpochTimeStamp
fallbackTimestampを受け取り、以下の手順を実行します。失敗または宣言的プッシュメッセージパーサー結果を返します。
messageを、バイト列からInfra値へのJSON解析をbytesに対して行った結果とします。例外が発生した場合、失敗を返します。
messageがマップでない場合、失敗を返します。
message["web_push
"]が存在しない、または8030でない場合、失敗を返します。
message["notification
"]が存在しない場合、失敗を返します。
notificationInputをmessage["notification
"]とします。
notificationInputがマップでない場合、失敗を返します。
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
"]が存在し、リストであり、
各要素が32ビット符号なし整数の場合、
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["data
"]に対して実行した結果を設定します。
notificationInput["actions
"]が存在し、リストの場合:
notificationActionsを« »とします。
各actionInputを
notificationInput["actions
"]からイテレートします:
actionNavigateを
actionInput["navigate
"]を変換したものとします。
notificationActionをNotificationAction
辞書
«[ "action
"
→ actionInput["action
"],
"title
"
→ actionInput["title
"],
"navigate
"
→ actionNavigate ]»とします。
actionInput["icon
"]が存在し、文字列の場合、
notificationAction["icon
"]
にactionInput["icon
"]を変換して設定します。
追加 notificationActionをnotificationActionsに追加します。
notificationOptions["actions
"]
にnotificationActionsを設定します。
notificationを、通知の作成を notificationTitle、notificationOptions、origin、 baseURL、fallbackTimestampで実行した結果とします。例外が発生した場合、失敗を返します。
notificationのナビゲーションURLがnullの場合、失敗を返します。
notificationのactionsに含まれる任意の通知アクションのナビゲーションURLがnullの場合、失敗を返します。
mutableをfalseとします。
message["mutable
"]が存在しし、
message["mutable
"]が真偽値の場合、mutableをmessage["mutable
"]に設定します。
(notification, mutable)を返します。
プッシュ購読は、ウェブアプリケーションのためにユーザーエージェントとプッシュサービスの間に確立されるメッセージ配信コンテキストです。各プッシュ購読はサービスワーカー登録に関連付けられ、サービスワーカー登録には最大1つのプッシュ購読のみが関連付けられます。
プッシュ購読には、プッシュエンドポイントが関連付けられます。これはプッシュサービスによって公開される絶対URLであり、アプリケーションサーバーがプッシュメッセージを送信できる場所です。プッシュエンドポイントはプッシュ購読を一意に識別する必要があります。
プッシュ購読には、購読有効期限が関連付けられる場合があります。設定されている場合、これは1970年1月1日00:00:00 UTCからのミリ秒単位の時刻で、購読が無効化される時刻です。ユーザーエージェントは購読の有効期限前に購読更新を試みるべきです。
プッシュ購読には、P-256 ECDH鍵ペアと認証シークレットの内部スロットがあり、[RFC8291]に準拠しています。これらのスロットはプッシュ購読作成時に必ず設定される必要があります。
ユーザーエージェントが何らかの理由で鍵を変更する必要がある場合、"pushsubscriptionchange"イベントを、関連するサービスワーカー登録(registration)、旧鍵を持つPushSubscription
インスタンス(oldSubscription)、新鍵を持つPushSubscription
インスタンス(newSubscription)で発火する必要があります。
プッシュ購読の作成は、PushSubscriptionOptionsInit
optionsDictionaryを受け取って以下の手順で実行されます:
PushSubscription
とします。
PushSubscriptionOptions
オブジェクトとし、その属性をoptionsDictionaryの対応するメンバーと値で初期化します。
options
属性にoptionsを設定します。
getKey
()
メソッドで"p256dh
"を引数に取得できます。
getKey
()
メソッドで"auth
"を引数に取得できます。
applicationServerKey
属性が設定されている場合はoptionsから含めます。例外が発生した場合は再スローします。
endpoint
属性に、プッシュ購読のプッシュエンドポイントを設定します。
expirationTime
を設定します。
ユーザーエージェントまたはプッシュサービスは、購読更新をいつでも行うことができます(例えば、一定期間経過後など)。
この場合、ユーザーエージェントは、現在のプッシュ購読作成時に提供されたPushSubscriptionOptions
でプッシュ購読の作成手順を実行する必要があります。新しいプッシュ購読は元の購読とは異なる鍵ペアを持つ必要があります。
成功した場合、ユーザーエージェントは必ず"pushsubscriptionchange
"イベントを発火し、サービスワーカー登録(プッシュ購読に関連付けられたもの)をregistration、初期のPushSubscription
インスタンス(プッシュ購読を表す)をoldSubscription、新しいPushSubscription
インスタンス(新しいプッシュ購読を表す)をnewSubscriptionとして指定します。
アプリケーションサーバーへの変更伝播のための猶予を与えるため、ユーザーエージェントは、更新後も短期間以前のプッシュ購読へのメッセージ受信を続ける場合があります。更新後にメッセージを受信したら、すべての古いプッシュ購読は無効化される必要があります。
ユーザーエージェントがプッシュ購読の更新に失敗した場合、定期的にリフレッシュを再試行するべきです。プッシュ購読が有効期限切れなどで利用できなくなった場合、ユーザーエージェントは必ず"pushsubscriptionchange
"イベントを発火し、サービスワーカー登録(プッシュ購読に関連付けられているもの)をregistration、無効化されるPushSubscription
インスタンス(プッシュ購読を表す)をoldSubscription、newSubscriptionにはnull
を指定します。
プッシュ購読が無効化されると、ユーザーエージェントとプッシュサービスは、その詳細の保存済みコピーを削除しなければなりません。その後、このプッシュ購読へのプッシュメッセージは配信してはなりません。
プッシュ購読は、関連付けられたサービスワーカー登録が登録解除されたときに無効化されますが、プッシュ購読はそれ以前に無効化される場合もあります。
プッシュ購読はサービスワーカー登録がクリアされると削除されます。
プッシュサービスという用語は、アプリケーションサーバーがウェブアプリケーションにプッシュメッセージを送信できるようにするシステムを指します。プッシュサービスは、そのサービスが扱うプッシュエンドポイントまたはエンドポイントを提供します。
ユーザーエージェントは、プッシュサービスに接続し、プッシュ購読を作成します。ユーザーエージェントは、利用可能なプッシュサービスの選択肢を制限する場合があります。これには、サービスの可用性(特定の国や職場ネットワークのファイアウォールによるブロックなど)、信頼性、バッテリー寿命への影響、特定のプッシュサービスへのメタデータ誘導や回避に関する契約などの性能関連の理由が含まれます。
Push APIは、強力な機能であり、名前 "push"によって識別されます。
Permissions仕様との統合のため、本仕様は
PushPermissionDescriptor
権限記述子型を定義します。
WebIDLdictionary PushPermissionDescriptor
: PermissionDescriptor {
boolean userVisibleOnly
= false;
};
userVisibleOnly
は
userVisibleOnly
と同じ意味を持ちます。
{name: "push", userVisibleOnly: false}
は
{name: "push", userVisibleOnly: true}
よりも強いです。
プッシュメッセージの内容は暗号化されます [RFC8291]。ただし、プッシュサービスは、アプリケーションサーバーからユーザーエージェントへのプッシュ購読で送信されるメッセージのメタデータには依然としてアクセス可能です。これにはメッセージのタイミング・頻度・サイズが含まれます。プッシュサービスを変更する以外に、既知の対策はメッセージサイズをパディングで増やすことのみです(ユーザーエージェントがこれを許可しない場合もあります)。
プッシュメッセージがウェブアプリケーションと同じオリジンを持つアプリケーションサーバーから送信された保証はありません。アプリケーションサーバーは、プッシュ購読の利用に必要な詳細を第三者と自由に共有可能です。
以下の要件は、可能な限りユーザーのプライバシーとセキュリティを保護し、その目的達成を前提に アプリケーションサーバーとユーザーの通信の完全性も保護することを意図しています。
ユーザーエージェントは、ユーザーの明示的な許可なしにPush
APIアクセスをウェブアプリケーションに提供してはなりません。ユーザーエージェントは、subscribe()
メソッドの各呼び出し時にユーザーインターフェースを通じて許可の同意を取得する必要があります(すでに許可が保存されている場合や事前に信頼関係がある場合を除く)。現在のブラウジングセッションを超えて許可が保持される場合、それは取り消し可能でなければなりません。
Push APIは、開発者が提供したイベントハンドラを実行するために関連するサービスワーカー登録を起動しなければならない場合があります。これによりネットワークトラフィックなどのリソース消費が発生しますが、ユーザーエージェントは、そのリソース消費をプッシュ購読を作成したウェブアプリケーションに帰属させるべきです。
ユーザーエージェントは、許可取得や許可状態判定時にPushSubscriptionOptions
を考慮してもよいです。
権限が取り消された場合、ユーザーエージェントは、その権限で作成された購読について、任意で"pushsubscriptionchange
"イベントを発火してもよいです。その際、サービスワーカー登録(プッシュ購読に関連する)をregistration、PushSubscription
インスタンス(プッシュ購読を表す)をoldSubscription、newSubscriptionにはnull
を指定します。ユーザーエージェントは必ず
影響を受ける購読を並列で無効化しなければなりません。
サービスワーカー登録が登録解除された場合、関連するプッシュ購読は必ず無効化されなければなりません。
プッシュエンドポイントは、プッシュサービス以外の主体(ユーザーのデバイス・識別・位置情報など)によってユーザーに関する情報を導出できるようにしてはなりません。詳細な要件は [RFC8030] のPrivacy Considerationsを参照してください。
無効化されたプッシュ購読のプッシュエンドポイントは、新しいプッシュ購読に再利用してはなりません。これにより、ユーザーが削除できない永続的識別子の作成や、あるプッシュ購読の詳細を利用して別のプッシュ購読にメッセージを送信することを防ぎます。
ユーザーエージェントは、Push APIがセキュアコンテキストでのみ利用可能となるよう実装しなければなりません。これにより、プッシュ購読データの取得を目的とした中間者攻撃からユーザーをより保護できます。ブラウザは開発目的のみこのルールを無視する場合があります。
このセクションは規範的ではありません。
プッシュメッセージは、以下のようにアプリケーションサーバーからウェブアプリケーションに送信されます:
この全体的なフレームワークにより、アプリケーションサーバー側のイベントに応じて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();
// アプリケーションサーバーに必要なpush購読の詳細が利用可能となり、例えば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]で説明されるように、アプリケーションサーバーによってプッシュ購読向けのメッセージ暗号化・認証に使用されます。
Service Worker仕様はServiceWorkerRegistration
インターフェース
[SERVICE-WORKERS]を定義しており、本仕様はそれを拡張します。
WebIDL[SecureContext]
partial interface ServiceWorkerRegistration {
readonly attribute PushManager
pushManager
;
};
pushManager
属性はPushManager
を公開し、この属性が公開される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 = {});
};
supportedContentEncodings
属性は、プッシュメッセージのペイロード暗号化に使用可能な対応コンテンツコーディングの配列を公開します。コンテンツコーディングは、プッシュサービスからプッシュメッセージ送信要求時にContent-Encoding
ヘッダフィールドで示されます。
ユーザーエージェントは、[RFC8291]で定義されたaes128gcm
コンテンツコーディングをサポートしなければならず、互換性のため現行標準の以前のバージョンで定義されたコンテンツコーディングもサポートしてよいです。
subscribe()
メソッドが呼び出された場合、以下の手順を実行しなければなりません:
userVisibleOnly
がfalse
で、ユーザーエージェントがtrue
を要求する場合、グローバルタスクをキューし、ネットワーキングタスクソースでglobalを使い、reject promise
"NotAllowedError
"
DOMException
applicationServerKey
メンバーの非null値を含まず、プッシュサービスが必須の場合、グローバルタスクをキューし、ネットワーキングタスクソースでglobalを使い、reject promise
"NotSupportedError
" DOMException
。
applicationServerKey
属性の非null値を含む場合、以下のサブステップを実行:
applicationServerKey
が
DOMString
の場合、base64urlエンコーディング
[RFC7515]でデコードし、そのオクテット列を含むArrayBuffer
にセットする。
InvalidCharacterError
"
DOMException
でステップ終了。
applicationServerKey
がP-256曲線上の有効な点か確認。有効でない場合、グローバルタスクをキューし、ネットワーキングタスクソースでglobalを使い、reject
promise "InvalidAccessError
"
DOMException
でステップ終了。
InvalidStateError
" DOMException
でステップ終了。
denied
"の場合、グローバルタスクをキューし、ユーザーインタラクションタスクソースでglobalを使い、reject promise
"NotAllowedError
" DOMException
でステップ終了。
AbortError
"
DOMException
でステップ終了。
options
属性を比較。BufferSource
値は参照でなく内容の等価性で比較する。
InvalidStateError
"
DOMException
でステップ終了。
PushSubscription
詳細で。
getSubscription
メソッドが呼び出された場合、以下の手順を実行しなければなりません:
DOMException
(名前は"AbortError
")で拒否し、手順終了。
PushSubscription
取得したプッシュ購読の詳細で解決。
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]
附属書A(65オクテット、先頭は0x04オクテット)で示される非圧縮形式。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
を初期化します。
p256dh
"公開鍵は[ANSI-X9-62]附属書A(65オクテット、先頭は0x04)で定義される非圧縮形式で符号化されます。
auth
パラメータはユーザーエージェントがアプリケーションサーバーから送信されるメッセージの認証に使うオクテット列です。
"p256dh
"および"auth
"という名前の鍵は必ずサポートされなければならず、その値は必ずユーザーエージェントが[RFC8291]に従って受信プッシュメッセージを復号するために必要なものと一致していなければなりません。
unsubscribe()
メソッドが呼び出された場合、以下の手順を実行しなければなりません:
false
で解決し、手順終了。
ユーザーエージェントがネットワーク障害等でプッシュサービスに購読無効化の要求ができなかった場合、適切な期間再試行すべきです。
true
で解決します。
toJSON()
メソッドが呼び出された場合、以下の手順を実行しなければなりません:
PushSubscriptionJSON
辞書とします。
endpoint
属性取得の結果を設定します。
expirationTime
属性取得の結果を設定します。
record<DOMString, USVString>
の新しい空インスタンスとします。PushSubscription
の内部スロットにある鍵名ごとに、鍵名で昇順に:
getKey
()
参照)。
getKey
で返される値を設定。
PushSubscriptionJSON
辞書はJSON型であり、
PushSubscription
の型を表します。ECMAScriptでは
JSON
.stringify
()
関数でJSON文字列に変換できます。
keys
レコードには
PushEncryptionKeyName
の各エントリに対応するURLセーフbase64符号化表現([RFC4648])が含まれます。
PushSubscription
のオプションは直列化されないことに注意してください。
プッシュメッセージの暗号化に使われる暗号鍵は、getKey
()
メソッドや
PushSubscription
のシリアライザーを通じてウェブアプリケーションに提供されます。各鍵はPushEncryptionKeyName
列挙型の値で命名されます。
WebIDLenum PushEncryptionKeyName
{
"p256dh
",
"auth
"
};
p256dh
値は、[RFC8291]で説明されるP-256 ECDH Diffie-Hellman公開鍵取得に使用されます。
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()
メソッドの手順は、内容がthisのbytesである新しいBlob
オブジェクトを返します。
bytes()
メソッドの手順は、内容がthisのbytesであるArrayBuffer
に裏付けられた新しいUint8Array
を返します。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
;
PushEvent
インターフェースまたは継承インターフェースのconstructor
呼び出し時、通常のイベント構築手順に加え、以下の手順を実行します:
data
メンバーが存在しない場合、イベントのdata
属性をnull
に設定し、以降の手順を終了。
data
"メンバーからバイト列を抽出する結果とする。data
属性に、新しいPushMessageData
インスタンス(bytesがb)を設定。
data
属性は初期化時の値を返します。
notification
属性は初期化時の値を返します。
ユーザーエージェントがプッシュサービスからプッシュメッセージを受信した際は、以下の手順を必ず実行します。
bytesがnullでない場合:
baseURLをregistrationのスコープURLとする。
originをbaseURLのオリジンとする。
fallbackTimestampを現在の粗化ウォールタイムとする。
declarativeResultを、宣言的プッシュメッセージパーサーをbytes, origin, baseURL, fallbackTimestampで実行した結果とする。
declarativeResultが失敗でない場合:
notificationをdeclarativeResultのnotificationとする。
notificationのサービスワーカー登録を registrationに設定。
notificationShownをfalseとする。
declarativeResultのmutable がtrueの場合:
resultをpushイベントの発火をregistration,
null, notificationの新しいNotification
オブジェクトで実行した結果とする。
resultが失敗でない場合、notificationShownをresultのnotification shownに設定。
notificationShownがfalseの場合、通知表示手順をnotificationで実行。
プッシュメッセージの受領確認を行い、手順を終了。
dataを、bytesがnullでなければbytesで初期化された新しいPushMessageData
オブジェクト、そうでなければnullとする。
resultをpushイベントの発火をregistration, data, nullで実行した結果とする。
resultが失敗で、同じプッシュメッセージが複数回サービスワーカー登録に失敗して配信された場合、プッシュメッセージの受領確認を行う。
resultが失敗でなければ、プッシュメッセージの受領確認を行う。
pushイベント結果は、タプルであり、notification shown(真偽値)を含みます。
pushイベントの発火は、サービスワーカー登録registration、
PushMessageData
オブジェクトまたはnulldata、
notificationまたはnullnotificationで、以下の手順を実行。失敗またはpushイベント結果を返す。
notificationResultをnullとする。
registrationのshowNotification()の正常呼び出し有無をfalseに設定。
「push」という機能的イベントを発火し、PushEvent
をregistration上で以下のプロパティとともに使用します:
data
notification
その後、dispatchedEventで以下の手順を並列で実行:
dispatchedEventの延長ライフタイムpromiseすべてが解決されるまで待機。
正常に解決されなければnotificationResultを失敗に設定。
正常に解決された場合、notificationResultをregistrationのshowNotification()の正常呼び出し有無に設定。
notificationResultがnullでなくなるまで待機。
notificationResultが失敗なら失敗を返す。
(notificationResult)を返す。
プッシュメッセージの受領確認は、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
になります。
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]
partial interface ServiceWorkerRegistration {
readonly attribute PushManager
pushManager
;
};
[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: