通知API

現行標準 — 最終更新

参加方法:
GitHub whatwg/notifications (新しい問題を作成, 既存の問題)
Matrixでチャット
コミット:
GitHub whatwg/notifications/commits
このコミット時点のスナップショット
テスト:
web-platform-tests notifications/ (進行中の作業)
翻訳 (規範的ではありません):
日本語
简体中文
한국어

概要

この現行標準は、エンドユーザーに通知を表示するためのAPIを定義します。通常、トップレベルの閲覧コンテキストのビューポート外で表示されます。既存の通知システムと互換性を保ちながら、プラットフォームに依存しないよう設計されています。

1. 用語

この仕様はInfra標準に依存する。 [INFRA]

この仕様で使用する一部の用語は、DOM、Fetch、High Resolution Time、HTML、 IDL、Service Workers、およびURLの各標準で定義されている。 [DOM] [FETCH] [HR-TIME] [HTML] [WEBIDL] [SERVICE-WORKERS] [URL]

2. 通知

通知とは、 抽象的な 表現であり、メッセージの配信など、何らかの出来事を表すものである。

通知には、 関連付けられた サービスワーカー登録 (null またはサービスワーカー登録) がある。初期値はnullである。

通知 には、関連付けられたタイトル (文字列) がある。

通知 には、関連付けられた 方向 ("auto"、"ltr"、 または"rtl") がある。

通知 には、関連付けられた 言語 (文字列) がある。

通知 には、関連付けられた本文 ( 文字列) がある。

通知 には、関連付けられたナビゲーションURL (nullまたはURL) がある。初期値はnullである。

通知 には、関連付けられたタグ (文字列) がある。

通知 には、関連付けられたデータ ( レコード) がある。

通知 には、関連付けられたタイムスタンプ (EpochTimeStamp) がある。

タイムスタンプは、通知が対応する実際の時刻を 示すために使用できる。例えば、通知が デバイスがオフラインであったため直ちに配信できなかったメッセージに使用される場合には過去の時刻、 あるいは、間もなく始まる会議に使用される場合には未来の時刻となり得る。

通知 には、関連付けられた オリジン (オリジン) がある。

通知 には、関連付けられた 再通知設定 (真偽値) がある。その 初期値はfalseである。trueの場合、エンドユーザーに注意を促すべきであることを示す。これは、 通知 表示手順が、既存の通知と同じ タグを持つ新しい通知について実行された後に行う。

通知 には、関連付けられた サイレント設定 (nullまたは真偽値) がある。その 初期値はnullである。trueの場合、音や振動を発生させるべきでないことを示す。nullの場合、 音や振動の発生をプラットフォームの慣例に委ねるべきであることを示す。

通知 には、関連付けられた 操作必須設定 (真偽値) がある。初期値はfalseである。trueの場合、十分に大きな画面を持つデバイスでは、 エンドユーザーが通知をアクティブ化するか閉じるまで、その通知に容易にアクセスできる状態を 維持するべきであることを示す。

通知 には、次のグラフィックを関連付けることができる: 画像 URL、 アイコン URL、および バッジ URL;ならびに、それぞれに対応する 画像リソース、アイコンリソース、および バッジリソース。

画像リソースは、次の 内容の一部として表示される画像である:通知。また、視覚的に高い 優先度で表示するべきであり、その比較対象は アイコンリソースとバッジリソースである。ただし、 表示される 状況はより限られる場合がある。

アイコンリソースは、次のものを補強する画像である: 通知 (アイコンや送信者の写真など)。

バッジリソースは、Web アプリケーション、または次のもののカテゴリを表すアイコンである:通知。これは、Webアプリケーションが多種多様な 通知を送信する場合に該当する。これは、次のものを表すために使用してもよい:通知。 これは、 次のもの自体を表示する十分な空間がない場合である:通知。また、次のものの内部に表示してもよい: 通知。ただし、その場合、視覚的な優先度は次のものより低くするべき である: 画像リソースとアイコンリソース。

開発者には、 画像、アイコン、 またはバッジを通じて、それ以外の方法ではエンド ユーザーがアクセスできない情報を 伝えないことが推奨される。特に、これらの機能をサポートしない通知プラットフォームでは無視される場合があるためである。

通知 には、関連付けられたアクション (0個以上の要素を持つリストであり、 要素は通知アクション) がある。 通知アクションは、 エンドユーザーの選択肢を表す。各 通知アクションには、次のものが関連付けられる:

名前
文字列。
タイトル
文字列。
ナビゲーションURL
nullまたはURL。初期値はnullである。
アイコンURL
nullまたはURL。初期値はnullである。
アイコンリソース
nullまたはリソース。初期値はnullである。

ユーザーは、通知自体をアクティブ化する代わりに、アクションをアクティブ化してもよい。サポートされる 最大 アクション数は、通知プラットフォームの制約内における実装定義の整数であり、0 以上である。

アクションの表示はプラットフォームに依存するため、開発者には、 確実に エンドユーザーが通知から呼び出せるアクションをWeb アプリケーション内でも利用できるようにすることが推奨される。

一部のプラットフォームでは、 アイコンリソースを変更して、 プラットフォームの視覚的なスタイルによりよく合わせてから エンドユーザーに表示する場合がある。例えば、角を丸めたり、特定の 色で塗ったりする。開発者には、そのような場合にも適切に対応し、 色が失われたり角が切り取られたりしても重要な情報が失われないアイコンを使用することが推奨される。

非永続 通知は、通知のうち、 サービス ワーカー登録がnullであるものである。

(これは追跡ベクトルである。) 永続通知は、通知のうち、 その サービスワーカー登録がnullでないものである。


設定オブジェクトを用いて通知を作成 するには、文字列title、 NotificationOptions 辞書options、および 環境設定オブジェクトsettingsが与えられたとき:

  1. originをsettingsの オリジンとする。

  2. baseURLをsettingsの API基底URLとする。

  3. fallbackTimestampを、Unix エポックから settingsの現在の壁時計時刻までのミリ秒数を、 最も近い整数に丸めたものとする。

  4. 通知を作成するときに、title、 options、origin、baseURL、およびfallbackTimestampを与えた結果を返す。

作成する 通知を、文字列title、 NotificationOptions 辞書options、オリジン origin、URLbaseURL、およびEpochTimeStamp fallbackTimestampが与えられたとき:

  1. notificationを新しい通知とする。

  2. options["renotify"]が trueであり、かつ options["tag"]が 空文字列である場合、例外を投げる: TypeError。

  3. notificationのデータを StructuredSerializeForStorage(options["data"])に設定する。

  4. notificationのタイトルをtitleに設定する。

  5. notificationの方向を options["dir"]に設定する。

  6. notificationの言語を options["lang"]に設定する。

  7. notificationのオリジンをoriginに設定する。

  8. notificationの本文を options["body"]に設定する。

  9. options["navigate"]が 存在する場合、 構文解析する際にbaseURLを使用し、その結果が 失敗でなければ、 notificationのナビゲーションURLを戻り値に設定する。(それ以外の場合、 notificationのナビゲーションURLはnullのままとなる。)

  10. notificationのタグを options["tag"]に設定する。

  11. options["image"]が 存在する場合、 構文解析する際にbaseURLを使用し、その結果が 失敗でなければ、 notificationの画像 URLを戻り値に設定する。(それ以外の場合、 notificationの画像URLは設定されない。)

  12. options["icon"]が 存在する場合、 構文解析する際にbaseURLを使用し、その結果が 失敗でなければ、 notificationのアイコン URLを戻り値に設定する。(それ以外の場合、 notificationのアイコン URLは設定されない。)

  13. options["badge"]が 存在する場合、 構文解析する際にbaseURLを使用し、その結果が 失敗でなければ、 notificationのバッジ URLを戻り値に設定する。(それ以外の場合、 notificationのバッジURLは設定されない。)

  14. options["timestamp"]が 存在する場合、 notificationのタイムスタンプをその値に設定する。それ以外の場合、 notificationのタイムスタンプをfallbackTimestampに設定する。

  15. notificationの再通知設定を options["renotify"]に設定する。

  16. notificationのサイレント設定を options["silent"]に設定する。

  17. notificationの操作必須設定を options["requireInteraction"]に設定する。

  18. notificationのアクションを« »に設定する。

  19. options["actions"]内の各entryについて、 次の上限まで 最大アクション数としてサポートされる数だけ処理する (上限を超える エントリはスキップする):

    1. actionを新しい通知アクションとする。

    2. actionの名前を entry["action"]に設定する。

    3. actionのタイトルを entry["title"]に設定する。

    4. entry["navigate"]が 存在する場合、 構文解析する際にbaseURLを使用し、その結果が 失敗でなければ、 actionのナビゲーションURLを戻り 値に設定する。 (それ以外の場合、actionのナビゲーションURLはnullのままとなる。)

    5. entry["icon"]が 存在する場合、 構文解析する際にbaseURLを使用し、その結果が 失敗でなければ、 actionのアイコンURLを戻り値に設定する。(それ以外の場合、 actionのアイコンURLはnullのままとなる。)

    6. actionをnotificationのアクションに追加する。

  20. notificationを返す。

2.1. ライフタイムとUIの統合

ユーザーエージェントは、通知リストを保持しなければならない。これは、リストであり、0個 以上の通知を含む。

ユーザーエージェントは、クローズ 手順を、次のものについて実行するべきである: 非永続通知。これは、その通知が 作成 されてから数秒後に行う。

ユーザーエージェントは、非永続通知を、 プラットフォームの「通知センター」(利用可能な場合) に表示するべきでない。

ユーザーエージェントは、永続通知を、それが 次のものから削除されるまで永続化するべきである:通知リスト。

永続 通知では、次の close() メソッドが、その通知のいずれかのNotification オブジェクトで呼び出される場合がある。

ユーザーエージェントは、永続通知をプラットフォームの 「通知センター」(利用可能な場合) に表示するべきである。

2.2. 権限との統合

Notifications APIは、強力な機能であり、次の 名前で識別される: "notifications"。 [Permissions]

通知の権限状態を取得するには、次の 手順を実行する:

  1. permissionStateを、現在の権限 状態を取得するときに、 "notifications"を指定した結果とする。

  2. permissionStateが"prompt"である場合、"default"を返す。

  3. permissionStateを返す。

2.3. 方向

この節は、HTMLのレンダリング 節で使用されるものと同等の用語で記述されている。 [HTML]

ユーザーエージェントには、次のもののテキストについてUnicodeの意味論に従うことが期待される: 通知の タイトル、本文、および タイトル (通知の各アクションのもの)。それぞれは、 表示時に、独立した1つ以上の双方向アルゴリズムの 段落の集合として扱われることが期待される。これは、双方向アルゴリズムの規則P1、 P2、およびP3に従い、例えば、段落区切りの動作のサポートも含む。 その対象はU+000A LINE FEED (LF) 文字である。次の各段落について、 タイトル、本文、および タイトル (各アクションのもの) に対し、 通知の 方向は、 高水準の上書きを 規則P2およびP3に提供する。ただし、その値が"auto"以外である場合に限る。 [BIDI]

通知の方向は、相対的な 順序も決定する。その順序は、通知のアクションを エンドユーザーに表示する際のものであり、通知プラットフォームがそれらを横に並べて表示する場合に適用される。

2.4. 言語

通知の言語は、主要言語を指定する。 その対象は、通知のタイトル、本文、 および タイトル (通知の各アクションのもの) である。その値は 文字列である。空文字列は、主要言語が不明であることを示す。それ以外の文字列はすべて、 言語タグとして解釈しなければならない。妥当性や整形式性は強制されない。 [BCP47]

開発者には、有効な言語タグのみを使用することが推奨される。

2.5. リソース

フェッチ手順は、 通知notificationと、nullまたは 環境設定オブジェクトsettingsが与えられたとき、次のとおりである:

  1. 通知プラットフォームが画像をサポートし、notificationの 画像URLが設定されている場合、通知リソースをフェッチする。その際に、 notification、notificationの画像URL、 settings、およびリソースresourceが与えられたときの次の手順を与える: notificationの画像リソースをresourceに設定する。

  2. 通知プラットフォームがアイコンをサポートし、notificationの アイコンURLが設定されている場合、通知リソースをフェッチする。その際に、 notification、notificationのアイコンURL、 settings、およびリソースresourceが与えられたときの次の手順を与える: notificationのアイコンリソースをresourceに設定する。

  3. 通知プラットフォームがバッジをサポートし、notificationの バッジURLが設定されている場合、通知リソースをフェッチする。その際に、 notification、notificationのバッジURL、 settings、およびリソースresourceが与えられたときの次の手順を与える: notificationのバッジリソースをresourceに設定する。

  4. 通知プラットフォームがアクションとアクションアイコンをサポートする場合、 各actionについて、notificationの アクションを反復する: actionのアイコンURLが nullでない場合、通知リソースをフェッチする。その際に、 notification、 actionのアイコンURL、settings、および リソースresourceが与えられたときの次の手順を与える:actionの アイコン リソースをresourceに設定する。

フェッチする 通知リソースを、通知 notification、URLurl、nullまたは 環境設定オブジェクトsettings、および アルゴリズム processResource (リソースを受け取るもの) が与えられたとき:

  1. requestを新しいリクエストとする。そのURLは url、クライアントはsettings、宛先は "image"、モードは"no-cors"、および 資格情報モードは "include"とする。

  2. settingsがnullである場合、requestのオリジンを notificationのオリジンに、requestの リファラーを"no-referrer"に、および requestの サービスワーカーモードを"none"に設定する。

    これは、ユーザーエージェントが宣言型プッシュ メッセージの 通知を表示する場合に該当する。そのような通知のリソースは、 サービスワーカーを介さずにフェッチされる。宣言型プッシュメッセージは、 それを必要としないように設計されているためである。 [PUSH-API]

  3. フェッチする際に、requestのuseParallelQueueをtrueに設定し、 processResponseConsumeBodyを、 次のものが与えられたときの以下の手順に設定する: レスポンスresponseと、null、失敗、または バイト列bytes:

    1. bytesがnullまたは失敗である場合、戻る。

    2. bytesを画像として復号することを試みる。

    3. その画像形式がサポートされている場合、復号された リソースを与えてprocessResourceを実行する。

    この意図は、このリソースを <img>と同様にフェッチすることであるが、 これには抽象化が必要である。

2.6. 通知の表示

通知 表示手順は、通知 notificationと、nullまたは環境設定オブジェクトsettingsが与えられたとき、 次のとおりである:

  1. フェッチ手順を、 notificationとsettingsを与えて実行する。

  2. すべてのフェッチの完了と、notificationの 画像リソース、 アイコンリソース、および バッジリソースが 設定されること (ある場合)、ならびに アイコン リソース (対象はnotificationの アクション) が設定されること (ある場合) を待つ。

  3. shownをfalseとする。

  4. oldNotificationを、通知のうち、 リスト 内の通知であって、そのタグが 空文字列でなく、かつ notificationのタグと等しく、 そのオリジンが 同一オリジンであるもの (比較対象はnotificationのオリジン) とする。そのような通知があればそれを使用し、 nullとするのは それ以外の場合である。

  5. oldNotificationがnullでない場合:

    1. クローズイベントを処理する。その際に、 oldNotificationを与える。

    2. 通知プラットフォームが置き換えをサポートする場合:

      1. 置き換える。oldNotificationを notificationに、次の 通知リスト内で置き換える。

      2. shownをtrueに設定する。

      通知プラットフォームには、 ネイティブの 置き換えをサポートすることが強く推奨される。これは、ユーザー体験の向上につながるためである。

    3. それ以外の場合、削除する。oldNotificationを次の 通知リストから削除する。

  6. shownがfalseである場合:

    1. 追加する。notificationを通知リストに追加する。

    2. notificationをデバイス上に表示する (例えば、適切な 通知プラットフォームAPIを呼び出すことによって)。

  7. shownがfalse、またはoldNotificationがnullでなく、かつ notificationの再通知設定がtrueである場合、任意で、 ユーザーエージェントが定義する方法でエンドユーザーに注意を促す (例えば、音を鳴らすことによって)。

  8. notificationが非永続通知である場合、タスクをキューに入れる。 そのタスクでは、イベントを発火する。名前はshowとし、対象はNotification オブジェクトであり、それが表すのは notificationである。

2.7. 通知のアクティブ化

通知notification、またはその アクションのいずれかがエンドユーザーによってアクティブ化されたとき、 基盤となる通知 プラットフォームがアクティブ化をサポートすることを前提として、ユーザーエージェントは (別途指定がない限り) 次の手順を実行しなければならない:

  1. actionをnullとする。

  2. notificationのアクションのいずれかがエンド ユーザーによってアクティブ化された場合、actionをその通知アクションに設定する。

  3. navigationURLをnotificationの ナビゲーションURLとする。

  4. actionがnullでない場合、navigationURLをactionの ナビゲーションURLに設定する。

    これは、通知アクションの ナビゲーションURLがnullである場合に、処理が 次の clickイベントへ進むよう意図的にしており、Web開発者により大きな柔軟性を提供する。

  5. navigationURLがnullでない場合:

    1. 次の2つの選択肢のうち1つを、実装定義の方法で選択する:

      ユーザーエージェントには、プラットフォームの 慣例に合わせることが強く推奨される。

    2. 戻る。

  6. notificationが永続通知である場合:

    1. actionNameを空文字列とする。

    2. actionがnullでない場合、actionNameをactionの 名前に設定する。

    3. サービスワーカー通知 イベントを発火する。名前を"notificationclick"とし、 notificationとactionNameを与える。
  7. それ以外の場合、タスクをキューに入れる。そのタスクは次の手順を実行する:

    1. intoFocusを、イベントを発火するときの結果とする。名前を clickとし、対象はNotification オブジェクト (それが表すのはnotification) とし、その cancelable 属性をtrueに初期化する。

      ユーザーエージェントには、focus() がイベント リスナー内で動作するようにすることが推奨される。そのイベントの名前はclickである。

    2. intoFocusがtrueである場合、ユーザーエージェントは、 notificationに関連する閲覧コンテキストのビューポートにフォーカスを移すべきである。

Webプラットフォーム全体で、「アクティブ化」は意図的に「クリック」と誤った名前で呼ばれている。

2.8. 通知を閉じる

通知が、基盤となる通知 プラットフォーム、または エンドユーザーによって閉じられたとき、その通知のクローズ手順を 実行しなければならない。

クローズ手順は、 与えられた通知notificationについて、次のとおりである:

  1. 通知リストが含んでいない場合、 notificationを、この手順を中止する。

  2. 処理する クローズイベントを。その際にnotificationを与える。

  3. 削除する。notificationをリスト (通知の)から削除する。

クローズ イベントを処理するには、通知notificationが与えられたとき:

  1. notificationが永続通知であり、かつ notificationが エンドユーザーによって閉じられた場合、サービスワーカー通知 イベントを発火する。名前を "notificationclose"とし、notificationを与える。

  2. notificationが非永続通知である場合、タスクをキューに入れる。 そのタスクでは、イベントを発火する。名前はcloseとし、対象はNotification オブジェクトであり、それが表すのは notificationである。

3. API

[Exposed=(Window,Worker)]
interface Notification : EventTarget {
  constructor(DOMString title, optional NotificationOptions options = {});

  static readonly attribute NotificationPermission permission;
  [Exposed=Window] static Promise<NotificationPermission> requestPermission(optional NotificationPermissionCallback deprecatedCallback);

  static readonly attribute unsigned long maxActions;

  attribute EventHandler onclick;
  attribute EventHandler onshow;
  attribute EventHandler onerror;
  attribute EventHandler onclose;

  readonly attribute DOMString title;
  readonly attribute NotificationDirection dir;
  readonly attribute DOMString lang;
  readonly attribute DOMString body;
  readonly attribute USVString navigate;
  readonly attribute DOMString tag;
  readonly attribute USVString image;
  readonly attribute USVString icon;
  readonly attribute USVString badge;
  readonly attribute EpochTimeStamp timestamp;
  readonly attribute boolean renotify;
  readonly attribute boolean? silent;
  readonly attribute boolean requireInteraction;
  [SameObject] readonly attribute any data;
  [SameObject] readonly attribute FrozenArray<NotificationAction> actions;

  undefined close();
};

dictionary NotificationOptions {
  NotificationDirection dir = "auto";
  DOMString lang = "";
  DOMString body = "";
  USVString navigate;
  DOMString tag = "";
  USVString image;
  USVString icon;
  USVString badge;
  EpochTimeStamp timestamp;
  boolean renotify = false;
  boolean? silent = null;
  boolean requireInteraction = false;
  any data = null;
  sequence<NotificationAction> actions = [];
};

enum NotificationPermission {
  "default",
  "denied",
  "granted"
};

enum NotificationDirection {
  "auto",
  "ltr",
  "rtl"
};

dictionary NotificationAction {
  required DOMString action;
  required DOMString title;
  USVString navigate;
  USVString icon;
};

callback NotificationPermissionCallback = undefined (NotificationPermission permission);

非永続通知は、1つのNotification オブジェクトによって表され、Notificationの コンストラクターを通じて作成できる。

永続 通知は、0個以上の Notification オブジェクトによって表され、 showNotification() メソッドを通じて作成できる。

3.1. ガベージコレクション

Notification オブジェクトは、通知リストが 含んでいるものとして対応する通知があり、かつそのオブジェクトに イベントリスナーがあり、そのtypeがclick、 show、 close、またはerrorである間は、ガベージコレクションしてはならない。

3.2. コンストラクター

new Notification(title, options) コンストラクターの手順は、次のとおりである:

  1. thisの関連するグローバルオブジェクトがServiceWorkerGlobalScope オブジェクトである 場合、例外を投げる。その例外はTypeErrorとする。

  2. options["actions"]が 空でない場合、 例外を投げる。その例外はTypeErrorとする。

    アクションは、永続 通知に対してのみサポートされる。

  3. notificationを、次の結果とする: 設定 オブジェクトを用いて通知を作成する際に、title、options、 およびthisの関連する設定オブジェクトを与えた結果。

  4. thisをnotificationに関連付ける。

  5. 次の手順を並列に実行する:

    1. 通知の権限 状態を取得する結果が "granted"でない場合、タスクをキューに入れる。そのタスクではイベントを発火する。その名前は error、対象はthisとし、 この手順を中止する。

    2. 通知表示手順を実行する。その際に、 notificationと thisの関連する設定オブジェクトを与える。

3.3. 静的メンバー

静的なpermission取得子の手順は、 通知の権限状態を取得する結果を返すことである。

標準を編集する際は、上記をコピーしないでほしい。同期的な権限処理は、 同期IOと同様に、望ましくない考え方である。

開発者には、Permissionsのquery() メソッドを 代わりに使用することが推奨される。 [Permissions]

const permission = await navigator.permissions.query({name: "notifications"});
if (permission.state === "granted") {
   // APIを使用する権限がある…
}

静的な requestPermission(deprecatedCallback) メソッドの手順は、次のとおりである:

  1. globalを現在のグローバルオブジェクトとする。

  2. promiseを新しい プロミスとする。その作成先はthisの関連するレルムとする。

  3. 次の手順を並列に実行する:

    1. permissionStateを、次の結果とする: 使用する権限を要求する際に、"notifications"を指定した結果。

    2. グローバルタスクをキューに入れる。そのDOM操作タスクソースに対して、 globalを与え、 次の手順を実行する:

      1. deprecatedCallbackが与えられている場合、呼び出す。 deprecatedCallbackを« permissionState »と "report"を指定して呼び出す。

      2. 解決をpromiseに対して、 permissionStateを値として行う。

  4. promiseを返す。

通知は、これまでのところ、エンドユーザーに事前に尋ねることが 理にかなう唯一の事例である。他のAPIの仕様は、このパターンを使用するべきではなく、代わりに より適切な数多くの 代替手段のいずれかを採用するべきである。

静的なmaxActions取得子の手順は、 サポートされる最大アクション数を返すことである。

3.4. オブジェクトメンバー

以下は、イベントハンドラー (およびそれぞれに対応する イベントハンドラーのイベント型) であり、これらは 属性として Notification オブジェクトによってサポートされなければならない。

イベントハンドラー イベントハンドラーのイベント型
onclick click
onshow show
onerror error
onclose close

close()メソッドの手順は、 クローズ手順を、thisの通知について実行することである。

title取得子の手順は、 thisの通知の タイトルを返すことである。

dir取得子の手順は、 thisの通知の 方向を返すことである。

lang取得子の手順は、 thisの通知の 言語を返すことである。

body取得子の手順は、 thisの通知の 本文を返すことである。

navigate取得子の手順は、次のとおりである:

  1. thisの 通知のナビゲーションURLが nullである場合、 空文字列を返す。

  2. thisの通知のナビゲーション URLを、 直列化して返す。

tag取得子の手順は、 thisの通知の タグを返すことである。

image取得子の手順は、次のとおりである:

  1. thisの通知の画像URLがない場合、 空文字列を返す。

  2. thisの通知の画像URLを、 直列化して返す。

icon取得子の手順は、次のとおりである:

  1. thisの通知のアイコンURLがない場合、 空文字列を返す。

  2. thisの通知のアイコンURLを、 直列化して返す。

badge取得子の手順は、次のとおりである:

  1. thisの通知のバッジURLがない場合、 空文字列を返す。

  2. thisの通知のバッジURLを、 直列化して返す。

timestamp取得子の手順は、 thisの通知の タイムスタンプを返すことである。

renotify取得子の手順は、 thisの通知の 再通知 設定を返すことである。

silent取得子の手順は、 thisの通知の サイレント 設定を返すことである。

requireInteraction取得子の手順は、 thisの通知の 操作必須設定を返すことである。

data取得子の手順は、 StructuredDeserialize(thisの通知の データ, thisの関連するレルム)を返すことである。これが例外を投げる場合、 nullを返す。

actions取得子の手順は、次のとおりである:

  1. frozenActionsを、型がNotificationActionである空のリストとする。

  2. 各entryについて、thisの通知の アクションを反復する:

    1. actionを新しいNotificationActionとする。

    2. action["action"]を entryの 名前に設定する。

    3. action["title"]を entryの タイトルに設定する。

    4. entryのナビゲーションURLがnullでない場合、 action["navigate"]を、 entryの ナビゲーションURLを直列化したものに設定する。

    5. entryのアイコンURLがnullでない場合、 action["icon"]を、 entryの アイコンURLを、 直列化したものに設定する。

    6. Object.freezeをactionに対して呼び出し、 スクリプトによる意図しない変更を防ぐ。

    7. actionをfrozenActionsに追加する。

  3. 凍結配列を作成する際にfrozenActionsを使用した結果を返す。

3.5. 例

3.5.1. ページからのイベントの使用

非永続Notification オブジェクトは、ライフサイクル中にイベントを配送する。開発者は、これらを使用して、 望ましい動作を実現できる。

clickイベントは、エンドユーザーが通知をアクティブ化したときに配送される。

var not = new Notification("Paul KalkbrennerによるGebrünn Gebrünn", { icon: "newsong.svg", tag: "song" });
not.onclick = function() { displaySong(this); };

3.5.2. サービスワーカーからのアクションの使用

永続 通知は、発火する notificationclickイベントを、ServiceWorkerGlobalScope上で。

ここでは、サービスワーカーが単一の"アーカイブ" 通知アクションを持つ通知を表示し、エンドユーザーが この一般的なタスクを Webサイトを開かずに通知から実行できるようにする (例えば、通知プラットフォームが 通知にボタンを表示する場合がある)。エンドユーザーは、通知の本文をアクティブ化して、 受信トレイを開くこともできる。

self.registration.showNotification("Aliceからの新着メール", {
  actions: [{action: 'archive', title: "アーカイブ"}]
});

self.addEventListener('notificationclick', function(event) {
  event.notification.close();
  if (event.action === 'archive') {
    silentlyArchiveEmail();
  } else {
    clients.openWindow("/inbox");
  }
}, false);

3.5.3. 複数のインスタンスでのtagメンバーの使用

Webアプリケーションは、複数のインスタンスで並行して動作することがよくある。例えば、エンドユーザーが メールアプリケーションを複数のブラウザータブで開いた場合である。デスクトップは共有リソースであるため、 通知APIは、これらのインスタンスが容易に協調するための方法を、 tagメンバーの使用によって提供する。

同じ概念的なイベントを表す通知には、同じタグを付けることができ、両方が 表示された場合、エンドユーザーが受け取る通知は1つだけとなる。

インスタンス 1                                   | インスタンス 2
                                             |
// インスタンスが新着メールに気付く。       |
new Notification("John Doeからの新着メール",   |
                 { tag: 'message1' });       |
                                             |
                                             |  // 少し後に、このインスタンスが気付く
                                             |  // 新着メールがあることに。
                                             |  new Notification("John Doeからの新着メール",
                                             |                   { tag: 'message1' });

この状況で、ユーザーエージェントがここに示すアルゴリズムに従う場合、その結果は、 単一の通知"John Doeからの新着メール"となる。

3.5.4. 使用するtagメンバーを単一の インスタンスで

tagメンバーは、アプリケーションの単一のインスタンスでも使用でき、 状態の変化に応じて、その通知を可能な限り最新の状態に保つことができる。

例えば、AliceがBobとチャットアプリケーションを使用しており、Bobが、 Aliceの不在中に複数のメッセージを送信した場合、アプリケーションは、Aliceが 各メッセージのデスクトップ通知を個別に見ないようにしたい場合がある。

// Bobが"こんにちは"と言う
new Notification("Bob: こんにちは", { tag: 'chat_Bob' });

// Bobが"今日の午後は空いている?"と言う
new Notification("Bob: こんにちは / 今日の午後は空いている?", { tag: 'chat_Bob' });

この状況の結果は、単一の通知となり、2つ目の通知が、 同じタグを持つ1つ目の通知を置き換える。通知をキューに入れるプラットフォーム (先入れ先出し) では、タグを使用することで、通知の キュー内の位置も維持できる。新しい通知を先に表示するプラットフォームでは、 同様の結果を、close() メソッドを使用して実現できる。

4. サービスワーカーAPI

dictionary GetNotificationOptions {
  DOMString tag = "";
};

partial interface ServiceWorkerRegistration {
  Promise<undefined> showNotification(DOMString title, optional NotificationOptions options = {});
  Promise<sequence<Notification>> getNotifications(optional GetNotificationOptions filter = {});
};

[Exposed=ServiceWorker]
interface NotificationEvent : ExtendableEvent {
  constructor(DOMString type, NotificationEventInit eventInitDict);

  readonly attribute Notification notification;
  readonly attribute DOMString action;
};

dictionary NotificationEventInit : ExtendableEventInit {
  required Notification notification;
  DOMString action = "";
};

partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onnotificationclick;
  attribute EventHandler onnotificationclose;
};

サービスワーカー登録には、関連付けられた 呼び出し済みかどうか、 showNotification()が正常に (真偽値) があり、 初期値はfalseである。

これは、Push API標準の基盤となるものである。 [PUSH-API]

showNotification(title, options) メソッドの手順は、次のとおりである:

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

  2. promiseを新しい プロミスとする。その作成先はthisの関連するレルムとする。

  3. thisのアクティブなワーカーがnullである場合、 却下をpromiseに対してTypeError を理由として行い、promiseを返す。

  4. notificationを、次の結果とする: 設定 オブジェクトを用いて通知を作成する際に、title、options、 およびthisの関連する設定オブジェクトを与えた結果。これが 例外を投げた場合、 却下をpromiseに対してその例外を理由として行い、 promiseを返す。

  5. notificationのサービスワーカー登録を thisに設定する。

  6. 次の手順を並列に実行する:

    1. 通知の権限 状態を取得する結果が "granted"でない場合、グローバルタスクをキューに入れる。その際に、 DOM操作タスクソース上で、 globalを与え、却下を promiseに対してTypeErrorを理由として行う。 そして、この手順を中止する。

    2. 通知表示手順を実行する。その際に、 notificationと thisの関連する設定オブジェクトを与える。

    3. notificationのサービスワーカー登録の 呼び出し済みかどうか、 showNotification()が正常に をtrueに設定する。

    4. グローバルタスクをキューに入れる。そのDOM操作タスクソースに対して、 globalを与え、解決を promiseに対してundefinedを値として行う。

  7. promiseを返す。

getNotifications(filter) メソッドの手順は、次のとおりである:

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

  2. realmをthisの関連するレルムとする。

  3. originをthisの関連する設定オブジェクトの オリジンとする。

  4. promiseを新しい プロミスとし、realm内に作成する。

  5. 次の手順を並列に実行する:

    1. tagをfilter["tag"]とする。

    2. notificationsをリストとする。その要素は、すべての通知のうち、 通知リスト内にあり、そのオリジンが、 同一オリジンであるもの (比較対象は origin) で、そのサービスワーカー登録がthisであり、 そのタグが、tagが 空文字列でない場合には、tagと等しいものとする。

    3. グローバルタスクをキューに入れる。そのDOM操作タスクソースに対して、 globalを与え、 次の手順を実行する:

      1. objectsをリストとする。

      2. 各通知について、 notificationsを作成 順に反復し、新しいNotification オブジェクトをrealmで作成する。それが表すのは、 通知であり、追加する対象をそのオブジェクト、追加先をobjectsとする。

      3. 解決をpromiseに対して、 objectsを値として行う。

  6. promiseを返す。

このメソッドは、0個以上の新しいNotification オブジェクトを返す。これらは、 同じ基盤となる通知を、Notification オブジェクト (すでに存在するもの) と共有して表す場合がある。


サービスワーカー通知イベントを発火するには、名前 name、および 通知notificationと、省略可能な文字列 action (既定値は 空文字列) が与えられたとき、機能イベントを発火する手順を、name、NotificationEvent、 notificationのサービスワーカー登録、および次の 初期化を与えて実行する:

notification
新しいNotification オブジェクトで、notificationを表すもの。
action
action

notification取得子の手順は、 次のことを行う: 初期化時に設定された値を返す。

action取得子の手順は、返すことである、 その 初期化時に設定された値を。

以下は、イベントハンドラー (およびそれに対応する イベントハンドラーのイベント型) であり、属性としてサポートされなければならない。 そのサポート元は、 ServiceWorkerGlobalScope オブジェクトである:

イベントハンドラー イベントハンドラーのイベント型
onnotificationclick notificationclick
onnotificationclose notificationclose

謝辞

以下の方々に感謝する: Addison Phillips, Aharon (Vladimir) Lanin, Alex Russell, Anssi Kostiainen, Arkadiusz Michalski, Boris Zbarsky, Brady Eidson, David Håsäther, Doug Turner, Drew Wilson, Ehsan Akhgari, Frederick Hirsch, Ian Hickson, Jake Archibald, James Graham, John Mellor, Jon Lee, Jonas Sicking, Kagami Sascha Rosylight, Leo Tenenbaum, Michael Cooper, Michael Henretty, Michael™ Smith, Michael van Ouwerkerk, Mike Taylor, Nicolás Satragno, Olli Pettay, Peter Beverloo, Philip Jägenstedt, Reuben Morais, Rich Tibbett, Robert Bindar, 박상현 (Sanghyun Park), Simon Pieters, Theresa O’Connor, timeless、および triple-underscore の素晴らしい活躍に対して。

この標準は、Anne van Kesterenによって執筆されている (Apple, annevk@annevk.nl)。 以前の版は、John Gregg (Google, johnnyg@google.com) によって執筆された。

知的財産権

著作権 © WHATWG (Apple, Google, Mozilla, Microsoft)。この著作物は、クリエイティブ・コモンズ 表示 4.0 国際ライセンスの下で提供される。その一部がソースコードに組み込まれる場合、その ソースコード内の該当部分には、代わりにBSD 3-Clauseライセンスが適用される。

これは現行標準である。 特許レビュー版に関心がある方は、 現行標準レビュー草案を参照するべきである。

索引

定義される用語、この 仕様で

定義される用語、 参照によって

参考文献

規範的な参考文献

[BCP47]
Addison Phillips; Mark Davis. 識別するためのタグ、 言語を。2009年9月。現行の最良慣行。URL: https://www.rfc-editor.org/info/bcp47
[BIDI]
Manish Goregaokar मनीष गोरेगांवकर; Robin Leroy. Unicode双方向アルゴリズム。 2026年9月1日。Unicode標準附属書 #9。URL: https://www.unicode.org/reports/tr9/tr9-52.html
[DOM]
Anne van Kesteren. DOM標準。現行標準。 URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch標準。現行 標準。URL: https://fetch.spec.whatwg.org/
[HR-TIME]
Yoav Weiss. 高分解能時刻。URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; ほか。HTML標準。 現行標準。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準。現行標準。URL: https://infra.spec.whatwg.org/
[Permissions]
Marcos Caceres; Mike Taylor. 権限。URL: https://w3c.github.io/permissions/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers ナイトリー版。URL: https://w3c.github.io/ServiceWorker/
[URL]
Anne van Kesteren. URL標準。現行標準。 URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準。現行 標準。URL: https://webidl.spec.whatwg.org/

非規範的な参考文献

[PUSH-API]
Marcos Caceres; Kagami Rosylight. Push API。URL: https://w3c.github.io/push-api/

IDL索引

[Exposed=(Window,Worker)]
interface Notification : EventTarget {
  constructor(DOMString title, optional NotificationOptions options = {});

  static readonly attribute NotificationPermission permission;
  [Exposed=Window] static Promise<NotificationPermission> requestPermission(optional NotificationPermissionCallback deprecatedCallback);

  static readonly attribute unsigned long maxActions;

  attribute EventHandler onclick;
  attribute EventHandler onshow;
  attribute EventHandler onerror;
  attribute EventHandler onclose;

  readonly attribute DOMString title;
  readonly attribute NotificationDirection dir;
  readonly attribute DOMString lang;
  readonly attribute DOMString body;
  readonly attribute USVString navigate;
  readonly attribute DOMString tag;
  readonly attribute USVString image;
  readonly attribute USVString icon;
  readonly attribute USVString badge;
  readonly attribute EpochTimeStamp timestamp;
  readonly attribute boolean renotify;
  readonly attribute boolean? silent;
  readonly attribute boolean requireInteraction;
  [SameObject] readonly attribute any data;
  [SameObject] readonly attribute FrozenArray<NotificationAction> actions;

  undefined close();
};

dictionary NotificationOptions {
  NotificationDirection dir = "auto";
  DOMString lang = "";
  DOMString body = "";
  USVString navigate;
  DOMString tag = "";
  USVString image;
  USVString icon;
  USVString badge;
  EpochTimeStamp timestamp;
  boolean renotify = false;
  boolean? silent = null;
  boolean requireInteraction = false;
  any data = null;
  sequence<NotificationAction> actions = [];
};

enum NotificationPermission {
  "default",
  "denied",
  "granted"
};

enum NotificationDirection {
  "auto",
  "ltr",
  "rtl"
};

dictionary NotificationAction {
  required DOMString action;
  required DOMString title;
  USVString navigate;
  USVString icon;
};

callback NotificationPermissionCallback = undefined (NotificationPermission permission);

dictionary GetNotificationOptions {
  DOMString tag = "";
};

partial interface ServiceWorkerRegistration {
  Promise<undefined> showNotification(DOMString title, optional NotificationOptions options = {});
  Promise<sequence<Notification>> getNotifications(optional GetNotificationOptions filter = {});
};

[Exposed=ServiceWorker]
interface NotificationEvent : ExtendableEvent {
  constructor(DOMString type, NotificationEventInit eventInitDict);

  readonly attribute Notification notification;
  readonly attribute DOMString action;
};

dictionary NotificationEventInit : ExtendableEventInit {
  required Notification notification;
  DOMString action = "";
};

partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onnotificationclick;
  attribute EventHandler onnotificationclose;
};

✔MDN
⚠MDN
⚠MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
✔MDN
⚠MDN
✔MDN
⚠MDN
✔MDN
⚠MDN
✔MDN
⚠MDN
✔MDN
MDN
✔MDN
⚠MDN
✔MDN
⚠MDN
✔MDN
✔MDN
MDN
✔MDN
MDN
MDN
MDN
✔MDN
✔MDN