在我们的 PWA 中触发 JavaScript 错误的这个未知的源自 Google 的客户端是啥?

Posted

技术标签:

【中文标题】在我们的 PWA 中触发 JavaScript 错误的这个未知的源自 Google 的客户端是啥?【英文标题】:What is this unknown Google-originating client that triggers JavaScript errors in our PWA?在我们的 PWA 中触发 JavaScript 错误的这个未知的源自 Google 的客户端是什么? 【发布时间】:2018-11-23 00:33:04 【问题描述】:

我们正在运行为 Chrome 和 Samsung Internet 启用推送通知的渐进式 Web 应用程序,并鼓励我们的用户将其添加到他们的主屏幕。我们严格记录和监控浏览器异常,以保持高质量的服务。

自 2018 年 5 月 22 日以来,我们注意到令人费解的 javascript 异常突然增加,这些异常源自对检测到功能的标准 Web API 的调用 以前从未失败过。

例如,以下代码会产生以下错误,尽管“push”显然是每个Permissions.query() specs 的有效值:

const permissionStatus = await navigator
  .permissions
  .query( name: 'push', userVisibleOnly: true );

???? TypeError: Failed to read the 'query' property from 'Permissions': The provided value 'push' is not a valid enum value of type PermissionName.

经过仔细检查,我们注意到所有此类错误都发生在我们实际客户的用户代理执行脚本期间。相反,我们看到一个未知的客户端在我们的用户访问后立即查询我们的应用程序:

    用户访问我们的 PWA,没有报错 用户使用“添加到主屏幕”(大部分时间),没有报错 未知客户访问我们的 PWA,报告错误。

此未知客户端执行承载特征模式的 HTTP 请求:

网址与用户访问的网址完全相同 原始 IP 地址分配给 Google, Inc.(66.102.0.0/20 或 66.249.64.0/19 范围) 推荐人是“https://www.google.com/” 用户代理字符串以某种方式匹配用户之一:相同版本的 android,相同的设备构建,相同的浏览器,但不同的浏览器版本,始终来自此列表: Chrome/66.0.3359.126(5 月 22 日 → 5 月 30 日) Chrome/66.0.3359.158(6 月 11 日 → 6 月 25 日) SamsungBrowser/3.0 Chrome/38.0.2125.102(6 月 25 日 → 6 月 27 日) SamsungBrowser/6.4 Chrome/56.0.2924.87(5 月 22 日 → 5 月 30 日,6 月 25 日) SamsungBrowser/7.0 Chrome/59.0.3071.125(5 月 22 日 → 5 月 30 日,6 月 25 日)

此外,这些请求只是间歇性地以一种看似可控的方式发生,如上图和下图所示:

这一点,以及我们在大多数情况下检测到“添加到主屏幕”的使用情况,让我们怀疑这是否可能是与 WebAPKs 相关的实验。然而,这是没有记录的,因此非常令人费解。

这个未知的源自 Google 的客户端是什么?

它的目的是什么?

开发者应该如何检测它们,应该采取什么措施?

2018 年 8 月更新: 如上所述的请求现在似乎已经完全消失了……但它们可能是我们现在看到的某种类似请求的某种原型。这些新类型的请求仍然来自 Google 服务器,并且似乎专门针对我们 PWA 的 Web Manifest,因此不再触发 JavaScript 错误。它们都带有一个 Chrome/59+ 用户代理字符串,后缀为 (via Google-Chrome-WebAPK)。尚未发现其他浏览器,例如三星 Internet。

【问题讨论】:

【参考方案1】:

这可能是一个没有push 权限的无头 Chrome(可能是预发布测试,以防你在 Play 商店中拥有它);例如。使用Pupeteer,只能override permissions,但并不能真正接受权限提示……而且一般没有附加桌面,可以推送通知。

只需trycatch 即可整理出不支持push 权限的客户端。

navigator.permissions
  .query(name: 'push', userVisibleOnly: true)
  .then(function(permissionStatus) 
      console.log('push permission state is ', permissionStatus.state);
  )
  .catch((error) => 
      console.warn(error);
  );

【讨论】:

关于 Puppeteer 的有趣琐事。我同意这可能是一个无头浏览器,并推测它是从 Google 的数据中心运行的,由实际 PWA 的“添加到主屏幕”触发,并打算在之前执行真实的 WebAPK 生成测试发射。

以上是关于在我们的 PWA 中触发 JavaScript 错误的这个未知的源自 Google 的客户端是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中使用 JavaScript 在 PWA 中显示服务器生成的图像

是否可以制作一个触发 PWA“添加到主屏幕”安装横幅的应用内按钮?

如何修复 PWA 审核中的“当 JavaScript 不可用时不提供后备内容”?

如何通过 JavaScript 显示“PWA Web 应用程序图标”的计数?

如何使用 JavaScript (PWA) 在 Android 设备上为 FCM 创建 channel_ID?

为啥使用 JavaScript 在我的 PWA 上重复该位置?