【问题标题】:Update Service Worker in Facebook Browser在 Facebook 浏览器中更新 Service Worker
【发布时间】:2019-11-03 00:37:35
【问题描述】:

遇到了一个问题,我们的一些用户在我们网站的 Facebook 浏览器中有一个有问题的 Service Worker。

问题:当 Facebook 应用用户访问我们在 FB 上共享的页面时,他们会在 FB 浏览器上看到我们的“您处于离线页面”。

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

对 Workbox 的引用是在 service worker 中,所以当我们更新我们的 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()ing(见上文)
  • 在 Service Worker 代码中使用 skipWaiting()
  • 在 sw.js 的标头中添加“no-cache”
  • 确保 sw.js 没有被服务器缓存
  • 删除或更改/offline 页面导致net::ERR_FAILED 错误
  • 我们怀疑我们所有的 Service Worker 修订版都可能存在一些不可见的错误,因此我们尝试了一个“空”的 Service Worker,看看这是否可行并清除其他版本

我们的分析表明:

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

没有任何效果:我们的 Service Worker 或 something 仍在返回离线页面...

【问题讨论】:

  • 非常感谢 @dogsolitude_uk 记录详细信息 - 我们遇到了同样的问题,很高兴发现我们不是唯一的问题...我已经在 developers.facebook.com/community/threads/2324574930953602 上展开了讨论,希望得到一些官方的回应。我们已经/正在运行最新版本的 Workbox (4.3.1)。您知道具体是哪个固定问题解决了您的问题(对于尚未注册 SW 的用户)吗?
  • 谢谢@leomelzer ...我们还没有找到修复或强制FB浏览器更新其缓存的方法。它根本不听!上次更新后问题似乎也变得更糟:在某些情况下,我们甚至没有获得 /offline 页面并获得 net: ERR Failed 。

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


【解决方案1】:

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

此时应广泛推出修复程序。

【讨论】:

  • 看起来像...哇。描述完美地描述了我们所看到的。谢谢杰夫!明天我会梳理报告,如果合适,我会将此标记为答案并给你赏金。
  • 这对我来说听起来很像 - Facebook 的浏览器是一个 web 视图,因此会受此影响。在我对这个问题的测试中,所有服务人员同时中断。有趣的是,取消注册 sw 对您不起作用 - 对我们来说确实如此,之后再也没有重新安装服务人员!
  • 仅供参考,我们的跟踪显示修复(或者更确切地说是使用策略来恢复实验?)现在已经推广到大约三分之二的用户,考虑到它才刚刚开始推广,这相当快一天前。根据我将引擎切换到 chrome 76 beta 的测试,该测试修复了现有已安装工作人员中的服务工作人员更新和 fetch() 调用,因此无需清理更多内容(phew)。
  • @Rowan 你是如何注销你的软件的?我们似乎无法让它做到这一点!
  • @dogsolitude_uk 我想我刚刚做了一个navigator.serviceWorker.getRegistration().then(sw =&gt; sw.unregister()) - 可以看到它取消注册,但是在损坏时不会再次注册。不过,较新版本的 Chrome 75 和 Chrome 76 对我来说效果很好!
【解决方案2】:

我们遇到了同样的问题,但呈现方式略有不同 - 我们的用户开始收到错误消息“net:: ERR FAILED”,尽管这听起来像是相同的原因。问题开始于大约 10 天前,我设法绕过缓存的唯一方法是将用户发送到该站点的新版本 - 通过删除 www。从我发送到的 URL,并使用 www 停止从 301 到此。

我也尝试了许多像您一样的解决方案,但似乎无法让服务人员联系网站 - 如果您将 Charles 放在手机和互联网之间,您将看到没有流量到达您的网站。我希望在停用一段时间后,服务工作者将被应用缓存清理,我们可以切换回来。抱歉,我无法提供更多帮助,但请放心,您并不孤单!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多