9

Service Worker を使用してアプリケーションをオフラインにすることを考えています。リソースのキャッシュですでに満足のいく結果を達成していますが、インターネットに接続しているかどうかを onfetch で確認する必要があります。そうでない場合は、リクエストを保存し、onsync でプッシュします。

将来のオンシンクがそれを助けることは理解していますが、そのための解決策が必要です-一時的であっても.

リクエストをワーカー内の配列に保存しようとしましたが、永続的ではありません-コンピューターの再起動後は機能しません(SWが機能し、オフラインコンテンツを提供している間)。

良い方向は何ですか-どういうわけかファイルのようなキャッシュに保存しますか? または、IndexedDB / SimpleDB を使用していますか ( ServiceWorker で indexedDB にアクセスしています。競合状態)?

4

1 に答える 1

23

https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analyticsに、Service Worker を使用して特定のタイプのリクエストの失敗を検出する例があります (この場合、Google アナリティクスの ping HTTP 経由GET)、 を使用して失敗をキューに入れますIndexedDB。Service Worker が起動するたびにキューが調べられ、(ネットワークが使用可能になったため) 要求が正常に「再生」された場合、その要求はキューから削除されます。Service Worker がいつ起動するかについての保証はありませんが (バックグラウンド同期イベントが将来的に役立ちます)、誰かが Web アプリをアクティブに使用している場合、Service Worker は自動的に復活すると想定できます。

これは、HTTP などの他のタイプのリクエストにも一般化できますが、考慮すべきPOST点がいくつかあります。

  • POSTHTTPがキューに入れられ、再生されることをユーザーが認識していることを確認してください。通常、 HTTPPOSTはサーバー側の状態を変更するため、X 時間前にリプレイされたリクエストの結果として何かが変化しても、ユーザーを驚かせたくありません。
  • 呼び出しているサービスによっては、HTTPPOSTに有効なAuthorizationヘッダーが必要になる場合があります。承認に OAuth 2 を使用している場合、有効期間が限られているアクセス トークンが使用される場合があります。以前に有効だった認証トークンは、リクエストを再生するまでに期限切れになる場合があります。
  • IndexedDBは、任意のデータを柔軟に保存できるため、リクエストをキューに入れるのに適しています。たとえば、HTTPPOSTの本体をあまり作業せずに保存できるはずです。使用できない場合( CordovaIndexedDBではサポートされていないと言う場合)、私が考えることができる唯一の他のオプションは、Cache Storage APIを使用して新しい「キュー」キャッシュを作成し、失敗したs を次のようにすることです。キーと空のオブジェクトを値として。Service Worker の起動時に、「キュー」キャッシュで メソッドを使用して、すべての のリストを取得し、各を呼び出して再生することができます。以前にこのアプローチを試したことはありませんが、うまくいくはずです。RequestResponsekeys()RequestsqueuedRequestfetch(queuedRequest)
于 2015-04-28T14:49:09.763 に答える