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
イベントが、定期同期登録 registration に対して発火されたとき、そのイベントは
バックグラウンドで実行されるとみなされるのは、サービスワーカークライアントのうち、フレームタイプが "top-level",
"auxiliary" または "nested" のいずれかであるものが、オリジン、すなわちサービスワーカー登録のうち、
registrationに関連付けられたもののオリジンに存在しない場合である。
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. 権限
定期バックグラウンド同期は、PermissionState
が、PermissionDescriptor
のうち、name
が "periodic-background-sync" であるものに対するものであり、granted
である場合にのみ利用できる。
さらに、ユーザーエージェントは、ユーザーが定期バックグラウンド同期を無効にするための手段を提供するべきである。
定期バックグラウンド同期が無効になっている場合、periodicsync イベントを、定期
同期登録のうち、この権限の影響を受けるものに対して配送してはならない。(§ 7.2
権限の取り消しへの対応を参照)。
5.2. 位置情報の追跡
periodicsync イベント内のフェッチ要求は、バックグラウンド で実行されている間、ユーザーがページを離れた後でも、クライアントの IP アドレスをサーバーに明らかにする可能性がある。ユーザー エージェントは、再試行回数とperiodicsync イベントの継続時間に上限を設け、追跡を制限することで、 ウェブサイトがユーザーの位置を追跡できる時間を短縮するべきである。さらに、ユーザーエージェントは、持続的な 位置追跡を制限するため、periodicsync イベントの頻度に上限を設け、単一のオリジンについても、複数のオリジンにまたがる場合についても、その上限を適用するべきである。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 に対する権限である場合、ユーザーエージェントは次の手順をキューに追加しなければならず、追加先は定期同期
処理キューとする:
-
定期同期登録 registration のそれぞれについて、アクティブな定期同期登録 に含まれ、そのサービスワーカー 登録に関連付けられたオリジンが origin と同じであるものを対象として、次を行う:
-
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
には、定期同期マネージャー(PeriodicSyncManager)がある。
periodicSync
属性の取得子は、コンテキストオブジェクトの
定期同期マネージャーを返さなければならず、その初期値は、
新しい PeriodicSyncManager
であり、その サービスワーカー登録は、
コンテキストオブジェクトの サービスワーカー登録である。
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+
register(tag, options)
メソッドは、呼び出されたとき、新しいプロミス
promise を返し、次の手順をキューに追加しなければならず、追加先は定期同期
処理キューとする:
-
serviceWorkerRegistration を、サービスワーカー 登録のうち、コンテキスト オブジェクトの
PeriodicSyncManagerに関連付けられたものとする。 -
serviceWorkerRegistration の アクティブワーカーが null の場合、却下を promise に対して
InvalidStateErrorを伴って行い、これらの手順を中止する。 -
PermissionStateが、PermissionDescriptorのうち、nameが"periodic-background-sync"であるものに対するものであり、grantedでない場合、却下を promise に対してNotAllowedErrorを伴って行い、これらの手順を中止する。 -
isBackground を、ブール値の true とする。
-
client を、サービスワーカークライアントのうち、 serviceWorkerRegistration の オリジンに対応するもののそれぞれとして、次を行う:
-
client の フレームタイプが "
top-level" または "auxiliary" の場合、isBackground を false に設定する。
-
-
isBackground が true の場合、却下を promise に対して
InvalidAccessErrorを伴って行い、これらの手順を中止する。 -
currentRegistration を、定期同期 登録のうち、serviceWorkerRegistration の アクティブな定期同期登録 に含まれ、そのtagが tag に等しいものが存在する場合はそのもの、存在しない場合は null とする。
-
currentRegistration が null の場合:
-
newRegistration を、新しい定期同期登録とする。
-
newRegistration の tagを tag に設定する。
-
newRegistration の 最小間隔を options の
minIntervalメンバーに設定する。 -
newRegistration の 状態を "
pending" に設定する。 -
newRegistration の サービスワーカー 登録を serviceWorkerRegistration に設定する。
-
newRegistration の アンカー時刻を、現在を表すタイムスタンプ に設定する。
-
newRegistration を serviceWorkerRegistration の アクティブな定期同期 登録に追加する。
-
解決する対象を promise とする。
-
-
それ以外の場合:
-
currentRegistration の 最小間隔が options の
minIntervalメンバーと異なる場合:-
currentRegistration の 最小 間隔を options の
minIntervalメンバーに設定する。
-
-
それ以外の場合、currentRegistration の 状態が "
firing" なら、 serviceWorkerRegistration の 状態を "reregistered-while-firing" に設定する。 -
解決する対象を promise とする。
-
In only one current engine.
Opera67+Edge80+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS SafariNoneChrome for Android80+Android WebView80+Samsung Internet13.0+Opera Mobile57+
getTags()
メソッドは、呼び出されたとき、新しいプロミス
promise を返し、次の手順をキューに追加しなければならず、追加先は定期同期
処理キューとする:
-
serviceWorkerRegistration を、サービスワーカー 登録のうち、コンテキスト オブジェクトの
PeriodicSyncManagerに関連付けられたものとする。 -
currentTags を、新しいリストとする。
-
registration を、serviceWorkerRegistration の アクティブな定期同期登録の各要素として、それぞれについて、末尾に追加する対象を registration の tag とし、追加先を currentTags とする。
-
解決する対象を 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+
unregister(tag)
メソッドは、呼び出されたとき、新しいプロミス
promise を返し、次の手順をキューに追加しなければならず、追加先は定期同期
処理キューとする:
-
serviceWorkerRegistration を、サービスワーカー 登録のうち、コンテキスト オブジェクトの
PeriodicSyncManagerに関連付けられたものとする。-
currentRegistration を、定期同期登録のうち、 serviceWorkerRegistration の アクティブな定期同期 登録に含まれ、そのtagが tag に等しいものが 存在する場合はそのもの、存在しない場合は null とする。
-
currentRegistration が null でない場合、currentRegistration を serviceWorkerRegistration の アクティブな定期同期 登録から削除する。
-
解決する対象を 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 の サービスワーカー 登録とする。
-
registration が serviceWorkerRegistration の アクティブな定期同期登録に 含まれなくなっている場合、これらの手順を中止する。
-
retryCount を 0 とする。
-
registration の 状態を "
firing" に設定する。 -
true である間、次を繰り返す:
-
continue を false とする。
-
success を false とする。
-
機能イベントの発火を "
periodicsync" について、PeriodicSyncEventを使用し、serviceWorkerRegistration 上で、tagを registration の tagに設定して行う。 dispatchedEvent を、ExtendableEventとし、 配送されたperiodicsync イベントを表すものとし、次の手順を dispatchedEventを用いて実行する: -
waitUntilPromise を、すべての完了を待機した結果とし、待機対象を dispatchedEvent の 存続期間延長プロミスとする。
-
履行が waitUntilPromise に対して行われたとき、 次の手順で反応する:
-
success を true に設定する。
-
continue を true に設定する。
-
-
却下に反応する場合、却下が waitUntilPromise に対して行われたとき、 次の手順を実行する:
-
continue を true に設定する。
-
-
並行して:
-
continue が true になるまで待機する。
-
origin を、オリジンのうち、 registration の サービスワーカー 登録に関連付けられたものとする。
-
success が true の場合、最終 発火時刻を、キー origin について現在時刻に設定する。
-
success が true であるか、retryCount が最大再試行回数より大きいか、または registration の state が "
reregistered-while-firing" である場合:
-
-
retryCount を 1 増加させる。
-
retryCount に基づく短いバックオフ時間だけ待機する。
-