我正在考虑使用服务工作人员使我的应用程序脱机。我已经通过缓存资源获得了令人满意的结果,但我还必须检查是否已连接到互联网,如果没有 - 存储请求,并将其推送到同步。
我明白,未来的onsync将有助于此,但我需要 - 甚至是暂时的 - 解决方案。
我曾尝试将请求存储在worker中的数组中,但它不是持久的 - 在计算机重启后不起作用(当SW工作并提供脱机内容时)。
什么是好方向 - 以某种方式将其存储在缓存中?或者使用IndexedDB / SimpleDB(Accessing indexedDB in ServiceWorker. Race condition)?
答案 0 :(得分:21)
在https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics使用服务工作者检测某些类型的请求失败的示例(在这种情况下,Google Analytics通过HTTP GET
ping),并排队使用IndexedDB
失败。每次服务工作者启动时都会检查队列,并且如果请求可以成功重放"重播" (因为网络现在可用),它已从队列中删除。虽然无法保证服务工作者何时启动(后台同步事件将来会对此有所帮助),但您可以放心地假设,如果某人正在积极使用您的Web应用程序,则服务工作人员将自行恢复。
这可以推广到其他类型的请求,例如HTTP POST
,但有几点需要考虑:
POST
正在排队并将重播。由于HTTP POST
通常会修改服务器端状态,因此当重播请求发生X小时后,您不希望用户出现意外情况。POST
可能需要有效的Authorization
标头。如果您使用OAuth 2进行授权,则可能会使用生命周期有限的访问令牌。重播请求时,以前有效的授权令牌可能已过期。IndexedDB
是排队请求的不错选择,因为它提供了存储任意数据的灵活性,并且应该可以,例如,存储HTTP POST
的正文很多工作。如果您无法使用IndexedDB
(您说使用Cordova不支持它),那么我能想到的唯一其他选择就是尝试使用Request
{3}}创建一个新的"队列"缓存,失败的Response
s作为键,空Requests
个对象作为值。在服务工作者启动时,您可以在"队列"上使用Cache Storage API方法。缓存以获取所有queuedRequest
的列表,并为每个fetch(queuedRequest)
调用<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<Button android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Launch camera"
android:onClick="launchCamera" />
<Button android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="List of photos"
android:onClick="listPhotos" />
</LinearLayout>
进行重播。我之前没有尝试过这种方法,但我认为它应该可行。