2015-04-24 36 views
6

我在考慮使用服務工作人員將我的應用程序脫機。我已經在緩存資源方面取得了令人滿意的結果,但我也必須檢查我是否連接到互聯網,如果沒有,請存儲請求並將其推入onync。

我明白,未來的onsync會對此有所幫助,但我需要 - 甚至是臨時解決方案。

我試過只是將請求存儲在worker中的一個數組中,但它不是持久的 - 在計算機重新啓動後(SW工作並提供脫機內容)不起作用。

什麼是好方向 - 以某種方式將其存儲在緩存文件中?或者使用IndexedDB/SimpleDB(Accessing indexedDB in ServiceWorker. Race condition)?向服務人員存儲REST請求以同步它們

+1

這是不是很清楚你的問題。如果你的問題是IndexedDB是否可以用於離線存儲,那麼是的,它可以。如果您不知道如何執行存儲操作,以便它們支持在線和離線模式,那麼您可以在此處看到他們的建議:http://stackoverflow.com/questions/22342836/syncing-indexeddb-with-sql服務器 – dekkard

+0

謝謝,但我正在尋找一種方法來存儲POST請求內的服務工作者,當我離線爲了同步他們,當我將上線。將它們存儲在IndexedDB中可能是一個答案,但[Cordova Plugin](https://github.com/MobileChromeApps/cordova-plugin-service-worker/blob/master/README.md)不支持IndexedDB,它是現在在iOS上使用服務人員的唯一方法。 –

回答

19

有在使用服務工人以檢測某些類型的請求的失敗(在此情況下,通過HTTP GET谷歌分析坪),以及使用IndexedDB排隊失敗的https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics一個例子。每次服務工作人員啓動時都會檢查隊列,並且如果請求可以成功「重播」(因爲網絡現在可用),它將從隊列中移除。儘管服務人員何時啓動(後臺同步事件將在未來有助於這一點)並不能保證,但您可以放心地假設,如果某人正在使用您的Web應用程序,服務人員將自行恢復。

這可以推廣到其他類型的請求,例如HTTP POST S,但也有考慮幾件事情:

  • 確保用戶知道他們的HTTP POST正在排隊和意志重播。由於HTTP POST通常會修改服務器端狀態,因此如果由於X小時的重播請求而導致某些內容發生更改,則不希望用戶感到驚訝。
  • 根據您要撥打的服務,HTTP POST可能需要有效的Authorization標頭。如果您使用OAuth 2進行授權,則可能會使用壽命有限的訪問令牌。以前有效的授權令牌可能會在您重播請求時過期。
  • IndexedDB是排隊請求的好選擇,因爲它提供了存儲任意數據的靈活性,並且應該可以在不需要太多工作的情況下存儲HTTP POST的主體。如果你不能使用IndexedDB(你說它不支持使用Cordova),那麼我唯一能想到的其他選擇就是嘗試利用Cache Storage API創建一個新的「隊列」緩存,其中失敗的Request s爲鍵和空Response對象作爲值。在服務人員啓動時,您可以在「隊列」緩存中使用keys()方法獲取所有Requests的列表,並且對於每個,請撥打fetch(queuedRequest)以重播它。我以前沒有嘗試過這種方法,但我認爲它應該可行。
+1

完美答案,謝謝傑夫! –

+0

任何人都可以提供一個如何將HTTP POST正文存儲到IndexedDB中並在以後檢索它的例子嗎? – alearg