如何在Cordova Android应用程序中使用服务工作者?

时间:2017-07-03 04:07:26

标签: android cordova service-worker

我想在我的Cordova Android添加中使用服务工作者,以便将一些图像与服务器同步。我注意到this question表示这是不可能的,因为服务工作者必须通过https:加载,而Cordova将通过file:加载文件。

另一方面,似乎是ionic supports service workers。这意味着他们已经找到了一些方法来完成这项工作。但是,我不使用离子。似乎有cordova plugin for service workers for iOS,但正如我所说,我在Android上。

目前在Cordova Android应用中使用服务工作者的最佳做法是什么,如果可能的话?

2 个答案:

答案 0 :(得分:37)

在深入研究这个问题之后,我得出结论,Android中不支持服务工作者,因为它会阻止服务工作者使用HTTP或文件协议。

Ionic框架中Service Service的支持也没有明确说明混合移动应用程序不支持它。在这种情况下,这也是一种误导。 Ionic的服务工作者支持仅在Progressive Web App的情况下才会出现,而不是在official blog

中提到的混合移动应用程序中

添加上述信息,使用Service Workers可以实现的大多数功能已作为推送通知插件等插件的一部分提供,在大多数情况下应该足够了。

最重要的是,Cordova Android和Ionic框架都不支持Service Workers。有关详细信息,请查看以下link

答案 1 :(得分:2)

我不能接受“否”的答案,因此进行了一次搜寻,看看我是否可以对此进行编码。

注意,我不确定我和OP是否有相同的问题,甚至没有相同的要求(如果没有,请道歉,但希望是)...为了清楚起见,我的情况是这样的 我最初的运气是手动获取项目(https://localhost/cordova.js和插件文件)并将其添加到Service Worker使用的缓存中。我在第一次启动和第二次启动(即使脱机运行)时都进行了此操作……因此取得了一些不错的进展。奇怪的是,在随后的运行中,一些(大多数)手动缓存的项目被删除,因此启动无法成功完成。

然后,我研究了是否可以完全绕开SW来调用localhost,您知道什么似乎可行。从本质上讲,在SW的提取处理程序中,我有一个条件子句,如果它在url中发现localhost则什么也不做。这样做的影响是,SW无法找到处理请求的获取处理程序,然后浏览器进行调用以获取资产,就好像根本没有SW。

我已经针对在线/离线启动进行了测试,并确保我可以访问cordova和某些插件,并且一切似乎都运行良好。请注意,到目前为止,所有测试都在Android上进行。

我使用的代码示例如下(为了清楚起见,在其中保留了明确的“不做任何操作”注释);

 self.addEventListener('fetch', event => {
        console.log('Fetch event for ', event.request.url);
        if (event.request.url.includes("localhost")) {
            // Do Nothing
        } else {
        event.respondWith(
          caches.match(event.request, {
           // ... do the rest of the SW handling

我想知道其他人是否尝试过此方法,然后遇到任何问题。