1. はじめに
この節は規範的ではありません。
Web アプリケーションはしばしば信頼性の低いネットワーク(例:携帯電話)や寿命が不確かな環境(ブラウザが終了される、またはユーザーが離脱する可能性がある)で動作します。 そのため、Web アプリがコンテンツや状態をサーバーと同期し続けることが困難になります。
この API は、コンテンツ作成とサーバーおよび Web アプリ間のコンテンツ同期の間の時間を短縮することを目的としています。これは、Web アプリが定期的に状態やデータを同期する意図を、望む最小間隔とともに登録できるようにすることで実現します。サービスワーカーのイベントを通じて、ユーザーエージェントは定期的に Web アプリにネットワークリソースをダウンロードさせ、状態を更新させます。
この API はサービスワーカーに依存しているため、この API が提供する機能は セキュアコンテキスト でのみ利用可能です。
1.1. 例
ブラウジングコンテキスト から最小間隔を 1 日にして定期的なバックグラウンド同期を登録する例:
async function registerPeriodicNewsCheck() { const registration= await navigator. serviceWorker. ready; try { await registration. periodicSync. register( 'fetch-news' , { minInterval: 24 * 60 * 60 * 1000 , }); } catch { console. log( 'Periodic Sync could not be registered!' ); } }
periodicsync イベント に対して サービスワーカー 内で反応する例:
self. addEventListener( 'periodicsync' , event=> { event. waitUntil( fetchAndCacheLatestNews()); });
上の例では、fetchAndCacheLatestNews は開発者が定義した関数で、サーバーから最新のニュース記事を取得してローカルに保存します。例えばオフラインでの利用のために Cache
API を使用して保存します。
2. 概念
periodicsync イベント が
periodic
sync registration registration に対して発火したとき、その発動は関連する service worker registration の origin に対して、service worker clients のうち、フレームタイプが
"top-level"、"auxiliary"、または "nested" であるものが存在しない場合に、バックグラウンドで実行される と見なされます。
3. Service Worker 登録への拡張
service worker registration にはさらに以下が含まれます:
-
Active periodic sync registrations(map)で、各キーは
DOMString、各アイテムは periodic sync registration です。 -
Periodic sync processing queue、初期値は 新しい並列キューを開始する の結果です。
4. 構成要素
4.1. 定期同期登録
A periodic sync registration は次の要素で構成されます:
service worker registration、これは service worker registration です。
tag、これは DOMString
です。
注: Periodic Background Sync は Background Sync と名前空間を共有しないため、ある origin は同じタグで両方のタイプの登録を持つことができます。
minimum interval(long long)は、定期同期が発生する最小間隔をミリ秒単位で指定するために使用されます。minimum interval はユーザーエージェントへの提案です。
注: 実際に periodicsync イベント が発火する間隔は、これと同じかそれ以上でなければなりません。
anchor time(タイムスタンプ)は、この periodicsync イベント がこの periodic sync registration に対して以前に発火した時刻、または初回登録の時刻です。
state は
"pending"、"firing"、"suspended"、または
"reregistered-while-firing" のいずれかで、初期値は "pending" に設定されます。
4.2. 定期同期スケジューラ
periodic sync scheduler は periodicsync イベント の発火スケジューリングを担当します。
これらのトリガーに応じて、スケジューラは将来の適切な時刻に periodicsync イベント を発火させるための遅延処理をスケジュールするか、またはそのスケジュールをキャンセルします。
スケジューラは次を維持します:
-
time of last fire、これは map で、各キーは origin、各アイテムはタイムスタンプです。このマップのキーは service worker registrations に関連付けられた active periodic sync registrations の origins です。これは初期状態では空の map です。
effective minimum sync interval for origin origin(origin)は、minimum periodic sync interval for any origin に、その origin に対してユーザーエージェントが定義する量を加えたものです。
注: ユーザーエージェントが定義する量は、ユーザーのその origin へのエンゲージメント量に基づく可能性があります。この値は effective minimum sync interval for origin が呼ばれるたびに異なる場合があります。
スケジューラは 定期同期登録の処理 を行います。
注: ブラウザはリソース節約のために、アクティブな定期同期登録 が存在しない場合にこの処理ループを一時停止することがあります。
4.3. 定数
セクション § 5 プライバシーに関する考慮事項 および § 6 リソース使用 で推奨されているように、ユーザーエージェントは次も定義すべきです:
-
minimum periodic sync interval for any origin、long long、これは任意の与えられた origin に対する periodicsync イベント の最小間隔を表します。
-
minimum periodic sync interval across origins、long long、これはすべての origin にわたる periodicsync イベント の最小間隔を表します。
minimum periodic sync interval across origins は minimum periodic sync interval for any origin 以上でなければなりません。未定義の場合、これらは 43200000(ミリ秒単位で 12 時間)に設定されます。
注: 頻度に対する 2 つの上限が必要です。なぜなら、各 origin ごとに minimum periodic sync interval for any origin による制限を順守しても、ブラウザが periodicsync イベント を非常に頻繁に発火してしまうことがあるからです。例えば、多くの異なる origin に対する periodic sync registrations が存在する場合などです。minimum periodic sync interval across origins はこれらのイベントが発火する頻度に対するグローバルな上限を保証します。
ユーザーエージェントは各 periodicsync イベント に許される 最大再試行回数(数値)を定義してもよいです。これを選定する際、ユーザーエージェントは 最大再試行回数 を試行するのに必要な時間が minimum periodic sync interval for any origin より桁違いに短いことを保証するべきです。未定義の場合、この数値はゼロです。
5. プライバシーに関する考慮事項
5.1. 権限
Periodic Background Sync は、PermissionState
が、PermissionDescriptor
の name
に対して "periodic-background-sync" が granted
の場合にのみ利用可能です。さらに、ユーザーエージェントはユーザーが Periodic Background Sync を無効にする方法を提供するべきです。
Periodic Background Sync が無効になっている場合、periodicsync events は、この権限の影響を受ける periodic
sync registrations に対してディスパッチされてはなりません。(参照:§ 7.2 Respond to permission revocation)
5.2. 位置情報の追跡
バックグラウンドでの periodicsync event 内での fetch リクエストは、ユーザーがページを離れた後にクライアントの IP アドレスをサーバーに明らかにする可能性があります。ユーザーエージェントは、再試行回数と periodicsync event の継続時間に上限を設けることで追跡を制限し、ウェブサイトによってユーザーの位置が追跡される時間を短くするべきです。さらに、ユーザーエージェントは、periodicsync event の頻度に上限を設けることで永続的な位置追跡を制限するべきであり、それは個々の origin および複数の origins 全体に対して行われるべきです。
5.3. 履歴の漏洩
periodicsync event 内で、バックグラウンドで 行われる fetch リクエストは、periodic sync registration を作成したネットワークとは別のネットワーク上にあるミドルボックスにクライアントのナビゲーション履歴に関する何らかの情報を明らかにする可能性があります。例えば、クライアントが https://example.com を訪問して periodicsync event を登録したとしても、実装によってはユーザーがページから離れてネットワークを切り替えた後まで発火しない場合があります。新しいネットワーク上のミドルボックスは、periodicsync event によって行われる fetch リクエストを見る可能性があります。fetch リクエストは HTTPS で行われるためリクエストの内容は漏れませんが、フェッチ先やドメインは(DNS ルックアップやリクエストの IP アドレスを通じて)漏れる可能性があります。閲覧履歴のこのような漏洩を防ぐために、ユーザーエージェントは periodicsync events を periodic sync registration が行われたネットワーク上でのみ発火させることを選択してもよいですが、その場合は同期を機会的に行えなくなるため使い勝手が低下する点に注意する必要があります。
6. リソース使用
この節は規範的ではありません。
ウェブサイトは、periodicsync event を処理するときにネットワークからリソースをダウンロードすることが多くあります。基盤となるオペレーティングシステムは、これらのイベントをディスパッチするためにユーザーエージェントを起動し、イベントの処理を許可するためにあらかじめ定義された期間だけアプリを動作させ続ける場合があり、どちらもバッテリー消費を引き起こします。ユーザーエージェントは、ユーザーが離れた後のウェブサイトによるリソース使用を制限するために、これらのイベントの継続時間と頻度に上限を設けるべきです。
大きなリソースは、background fetch を BackgroundFetchManager
インターフェースを介して登録することでダウンロードするべきです。
加えて、ユーザーエージェントは origin に対するユーザーのエンゲージメントや、データ節約モードなどデータ消費を一時的に抑えるユーザーの意思表示を考慮して、periodicsync events の頻度を調整するべきです。
7. アルゴリズム
7.1. 定期同期登録の処理
ユーザーエージェントが開始したとき、以下の手順を並列で実行します:-
次の処理を繰り返します:
-
firedPeriodicSync を false にします。
-
firedPeriodicSync が false の間:
-
ユーザーエージェントが定義する一定時間を待ちます。
注: これは異なる periodic sync registrations の同期を単一のデバイス起動にまとめるために使えます。
-
online になるまで待ちます。
-
未だunregisteredでない各service worker registration registrationについて、 以下の手順をキューに追加し、registrationのperiodic sync 処理キューに追加する:
-
origin を origin とします。これは periodicSyncRegistration の service worker registration に関連付けられています。
-
time of last fire[origin] + effective minimum sync interval for origin(origin) が現在時刻より大きい場合、continue します。
-
registration の active periodic sync registrations にある各 periodic sync registration periodicSyncRegistration について:
-
periodicSyncRegistration の anchor time + periodicSyncRegistration の minimum interval が現在時刻より大きい場合、continue します。
-
firedPeriodicSync を true に設定します。
-
periodicsync event を発火 します(対象: periodicSyncRegistration)。
-
-
7.2. 権限取り消しへの対応
name
"periodic-background-sync" の権限が origin origin
に対して取り消された場合、ユーザーエージェントは次の手順を periodic sync processing queue にエンキューしなければなりません:
-
active periodic sync registrations に含まれる各 periodic sync registration registration について、その service worker registration が origin と同じ origin に関連付けられているものを対象とします:
-
active periodic sync registrations から registration を削除します。
-
8. API の説明
8.1. ServiceWorkerGlobalScope
インターフェースへの拡張
partial interface ServiceWorkerGlobalScope {attribute EventHandler ; };onperiodicsync
8.2. ServiceWorkerRegistration
インターフェースへの拡張
ServiceWorkerRegistration/periodicSync
In only one current engine.
OperaNoneEdge80+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS SafariNoneChrome for Android80+Android WebView80+Samsung Internet13.0+Opera MobileNone
[Exposed =(Window ,Worker )]partial interface ServiceWorkerRegistration {readonly attribute PeriodicSyncManager periodicSync ; };
ServiceWorkerRegistration
has a periodic sync manager (a PeriodicSyncManager).
The periodicSync
属性の getter はコンテキストオブジェクトの periodic sync manager
を返さなければならず、初期値は新しい PeriodicSyncManager
で、その service worker registration
はコンテキストオブジェクトの context object の service worker registration になります。
8.3.
PeriodicSyncManager
インターフェース
In only one current engine.
Opera67+Edge80+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS SafariNoneChrome for Android80+Android WebView80+Samsung Internet13.0+Opera Mobile57+
[Exposed =(Window ,Worker )]interface {PeriodicSyncManager Promise <undefined >register (DOMString ,tag optional BackgroundSyncOptions = {});options Promise <sequence <DOMString >>getTags ();Promise <undefined >unregister (DOMString ); };tag dictionary { [BackgroundSyncOptions EnforceRange ]unsigned long long = 0; };minInterval
PeriodicSyncManager
has a service worker registration (a service worker registration). In only one current engine.
Opera67+Edge80+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS SafariNoneChrome for Android80+Android WebView80+Samsung Internet13.0+Opera Mobile57+
メソッド
が呼び出されたとき、必ず新しい Promise promise を返し、次の手順を periodic sync processing queue にエンキューします:
register(tag, options)
-
serviceWorkerRegistration を、コンテキストオブジェクトに関連付けられた service worker registration とします。
-
serviceWorkerRegistration の active worker が null の場合、reject して promise を
InvalidStateErrorで拒否し、手順を中止します。 -
PermissionStateがPermissionDescriptorのname"periodic-background-sync"に対してgrantedでない場合、reject して promise をNotAllowedErrorで拒否し、手順を中止します。 -
ブール値 isBackground を true にします。
-
serviceWorkerRegistration の service worker clients の各 client について:
-
client の frame type が "
top-level" または "auxiliary" の場合、isBackground を false に設定します。
-
-
isBackground が true の場合、reject して promise を
InvalidAccessErrorで拒否し、手順を中止します。 -
currentRegistration を、serviceWorkerRegistration の active periodic sync registrations にある、periodic sync registration の中で tag が tag と等しいものがあればそれに設定し、なければ null とします。
-
currentRegistration が null の場合:
-
新しい periodic sync registration を newRegistration として作成します。
-
newRegistration の tag を tag に設定します。
-
newRegistration の minimum interval を options の
minIntervalメンバに設定します。 -
newRegistration の state を "
pending" に設定します。 -
newRegistration の service worker registration を serviceWorkerRegistration に設定します。
-
newRegistration の anchor time を現在時刻を表すタイムスタンプに設定します。
-
newRegistration を serviceWorkerRegistration の active periodic sync registrations に追加します。
-
Resolve して promise を完了させます。
-
-
そうでない場合(既存の登録がある場合):
-
currentRegistration の minimum interval が options の
minIntervalと異なる場合:-
currentRegistration の minimum interval を options の
minIntervalに設定します。
-
-
それ以外で、もし currentRegistration の state が "
firing" の場合、serviceWorkerRegistration の state を "reregistered-while-firing" に設定します。 -
Resolve して promise を完了させます。
-
In only one current engine.
Opera67+Edge80+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS SafariNoneChrome for Android80+Android WebView80+Samsung Internet13.0+Opera Mobile57+
メソッド
が呼び出されたとき、必ず新しい Promise promise を返し、次の手順を periodic sync processing queue にエンキューします:
getTags()
-
serviceWorkerRegistration を、コンテキストオブジェクトに関連付けられた service worker registration とします。
-
currentTags を新しい list とします。
-
serviceWorkerRegistration の active periodic sync registrations の各 registration について、append を使って registration の tag を currentTags に追加します。
-
Resolve して promise を currentTags で完了させます。
PeriodicSyncManager/unregister
In only one current engine.
Opera67+Edge80+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS SafariNoneChrome for Android80+Android WebView80+Samsung Internet13.0+Opera Mobile57+
メソッド
が呼び出されたとき、必ず新しい Promise promise を返し、次の手順を periodic sync processing queue にエンキューします:
unregister(tag)
-
serviceWorkerRegistration を、サービスワーカー登録であり、コンテキストオブジェクトの
PeriodicSyncManagerに関連付けられているものとする。-
currentRegistration を、serviceWorkerRegistration の 有効な periodic sync 登録の中から、その tag が tag と等しい periodic sync 登録(存在しない場合は null)とする。
-
もし currentRegistration が null でなければ、currentRegistration を serviceWorkerRegistration の 有効な periodic sync 登録 から削除する。
-
promise を解決する。
-
8.4. periodicsync イベント
PeriodicSyncEvent/PeriodicSyncEvent
現在、1つのエンジンのみでサポートされています。
Opera67+Edge80+
Edge (レガシー)なしIEなし
Android 版 FirefoxなしiOS SafariなしAndroid 版 Chrome80+Android WebView80+Samsung Internet13.0+Opera Mobile57+
現在、1つのエンジンのみでサポートされています。
Opera67+Edge80+
Edge (レガシー)なしIEなし
Android 版 FirefoxなしiOS SafariなしAndroid 版 Chrome80+Android WebView80+Samsung Internet13.0+Opera Mobile57+
dictionary :PeriodicSyncEventInit ExtendableEventInit {required DOMString ; }; [tag Exposed =ServiceWorker ]interface :PeriodicSyncEvent ExtendableEvent {(constructor DOMString ,type PeriodicSyncEventInit );init readonly attribute DOMString tag ; };
現在、1つのエンジンのみでサポートされています。
Opera67+Edge80+
Edge (レガシー)なしIEなし
Android 版 FirefoxなしiOS SafariなしAndroid 版 Chrome80+Android WebView80+Samsung Internet13.0+Opera Mobile57+
8.4.1. periodicsync イベントを発火する
注記: ユーザーエージェントは、PeriodicSyncEvent
のライフタイム延長および実行時間に対し、一般的な ExtendableEvent
よりも厳しい制限時間を課す場合があります。特に、PeriodicSyncEvent
の再試行には大幅に短いタイムリミットが設けられる場合があります。
-
serviceWorkerRegistration を registration の service worker registration とします。
-
もし registration が serviceWorkerRegistration の 有効な periodic sync registration に含まれていなければ、これらの手順を中止します。
-
retryCount を 0 にします。
-
registration の state を "
firing" に設定します。 -
次の間、繰り返します:
-
continue を false にします。
-
success を false にします。
-
ファンクショナルイベント "
periodicsync" をPeriodicSyncEventを用いて serviceWorkerRegistration 上で、tag に registration の tag を設定して発火します。dispatchedEvent(ExtendableEvent)を発火した periodicsync イベント とし、dispatchedEvent で以下の手順を実行します: -
waitUntilPromise を、すべてを待機 した dispatchedEvent の ライフタイム延長プロミス の結果とします。
-
waitUntilPromise の 成功時 には以下を実行:
-
success を true にします。
-
continue を true にします。
-
-
waitUntilPromise の 失敗時 には以下を実行:
-
continue を true にします。
-
-
並列で:
-
retryCount をインクリメントします。
-
retryCount に基づいた短いバックオフ時間待機します。
-