在Facebook浏览器中更新Service Worker

时间:2019-06-20 08:15:01

标签: facebook service-worker progressive-web-apps

遇到了一个问题,我们的某些用户从我们的网站的Facebook浏览器中坐着一辆越野车。

问题:Facebook App用户在访问我们在FB上共享的页面时,正在FB浏览器上获取我们的“您离线页面”。

该错误似乎是由于Google Workbox(3.6.1)的旧版本正在使用Chrome 75自动返回FB应用中的“您处于离线状态”页面。更新Workbox对其进行了修复。

对Workbox的引用是在服务工作者中进行的,因此,当我们更新Workbox版本(解决了该问题)时,某些用户仍然可以缓存旧版本。

如果用户清除其FB应用程序缓存或重新安装FB,那么一切都很好,他们可以看到我们的内容。但是我们想尝试强迫软件更新而不要求他们这样做。

要从FB浏览器中清除旧的Service Worker,我们尝试了以下操作:

<script>
"use strict";
console.log("Service Worker Registration");

  function isFacebookApp() {
    var ua = navigator.userAgent || navigator.vendor || window.opera;
    return (ua.indexOf("FBAN") > -1) || (ua.indexOf("FBAV") > -1);
  }

  if ("serviceWorker" in navigator) {
    if(isFacebookApp() == true) {
      console.log("Service Worker Registration: using v2, via Facebook App");
      navigator.serviceWorker.getRegistrations().then(function(registrations) {
        for(let registration of registrations) {
          console.log("Service Worker Registration: "+registration);
          registration.unregister();
        }
      });
    } else {
      console.log("Service Worker Registration: using v2, not via Facebook App");
      window.addEventListener("load", () => {
          navigator.serviceWorker.register("/sw.js");
      });
    }
  }
</script>

但是,我们的分析表明,您在“离线”页面上仍然获得点击率,并且仍在从用户那里获得报告,他们可以点击我们文章的链接。

有人可以帮忙吗?有没有一种方法可以强制FB的应用程序内浏览器更新缓存,并让我们的用户使用正常的Service Worker?

更新

到目前为止,我们已经尝试过:

  • 使用SW注册URL中的查询字符串欺骗浏览器以更新Service Worker
  • 遍历注册并进行unregister()处理(请参见上文)
  • 在Service Worker代码中使用skipWaiting()
  • 在sw.js的标头中添加“ no-cache”
  • 确保服务器未缓存sw.js
  • 删除或更改/offline页面会导致net::ERR_FAILED错误
  • 我们怀疑所有服务人员的修订版本可能都存在一些看不见的错误,因此我们尝试了一个“空”服务人员,以查看是否可行并清除其他服务

我们的分析表明:

  • Chrome Mobile 75可能是个问题
  • 自6月6日至7日以来似乎已经出现问题。

什么都没做:我们的服务工作者,或者说某事,仍在返回离线页面...

2 个答案:

答案 0 :(得分:2)

这是Chrome / Chromium WebView中的一个错误,已在https://bugs.chromium.org/p/chromium/issues/detail?id=977784中进行跟踪

此刻应该广泛推出此修复程序。

答案 1 :(得分:1)

我们遇到了相同的问题,但呈现的方式略有不同-尽管听起来像是相同的原因,但我们的用户开始收到一条错误消息“ net :: ERR FAILED”。该问题大约在10天前就开始出现,而我设法解决缓存的唯一方法是将用户引导至网站的新版本-删除www。从我要发送到的URL,然后从301停止到www。

我也尝试了很多类似的解决方案,但是似乎无法让服务人员联系该网站-如果将Charles放在手机和互联网之间,将看不到流量您的网站。我希望经过一段时间的使用后,服务工作者将被应用程序缓存清除,并且我们可以切换回去。抱歉,我无法提供更多帮助,但是请放心,您并不孤单!