为啥 Chrome 的 PushManager 会返回旧版 API?

Posted

技术标签:

【中文标题】为啥 Chrome 的 PushManager 会返回旧版 API?【英文标题】:Why does Chrome's PushManager return a legacy API?为什么 Chrome 的 PushManager 会返回旧版 API? 【发布时间】:2020-01-29 15:12:42 【问题描述】:

我这样调用pushManager.subscribe 函数:

return navigator.serviceWorker.register(process.env.PUBLIC_URL + '/sw-notifications.js').then(function(registration) 
  let subscribeOptions = 
    userVisibleOnly: true,
    applicationServerKey: urlBase64ToUint8Array(publicKey)
  ;

  return registration.pushManager.subscribe(subscribeOptions);
)
.then(function(pushSubscription) 
  return pushSubscription;
);

这很好用,它返回一个看起来像这样的对象:

"endpoint":"https://fcm.googleapis.com/fcm/send/foo:bar","expirationTime":null,"keys":"p256dh":"key","auth":"key"

文档说要向endpoint URL 发送一个 POST 请求以向用户发送推送通知。

很遗憾,it doesn't seem to specify 该请求使用什么样的正文。

我尝试用谷歌搜索,发现 this page 说这是旧版 API。

现在我很困惑。为什么最新 Chrome 上的 PushManager 会返回旧版 API?我应该使用其他东西吗?或者这仍然可以使用?

我正在尝试为我的网站启用推送通知,但无法弄清楚所有这些拼图是如何对齐的。

【问题讨论】:

【参考方案1】:

firebaser 在这里

FCM 旧版 API 不会以任何方式被弃用,仍然可以毫无问题地使用。

如果您开始一个新项目,我们建议您查看新的(版本化的)API,因为它提供了更多的向前兼容性。但是使用旧版 API 仍然完全没问题(在某些情况下甚至是必要的)。


更新:我问了一圈,从其中一位团队成员那里得到了详细说明:

有两种使用网络推送通知的方法。

    使用网络标准的工作方式,浏览器为您提供一个端点——这似乎就是您正在使用的。

    使用基于标准网络推送协议构建的 FCM 网络 SDK。 FCM Web SDK 使您可以更轻松地跨 Web 和移动应用程序 (ios/android) 发送消息。请参阅setting up a javascript Firebase Cloud Messaging client app 上的文档。如果您使用 FCM Web SDK,我们建议您使用新的(版本化的)API,因为它提供了更多的前向兼容性。但是使用旧版 API 完全没问题(无论如何都不会弃用)。

如果你使用的是标准的网络推送协议,你完全可以使用浏览器返回给你的端点。这个端点对于不同的浏览器是不同的(Firefox 和 Edge 会返回不同的端点)。 Chrome 的推送提供者是 FCM,在这种情况下您不必担心返回什么端点(FCM 会正确处理它并处理您的请求)。

【讨论】:

嗨。是的,我想使用新的 API,但 Chrome 的 PushManager 正在返回旧的 API。它最终会返回新的吗?如果它给了我旧的,我不确定如何使用新的。

以上是关于为啥 Chrome 的 PushManager 会返回旧版 API?的主要内容,如果未能解决你的问题,请参考以下文章

pushManager 未在移动设备上请求许可

Edge 17 - PushManager.Subscribe 失败并出现 AbortError

找不到类“PushManager”-Laravel 4.2

为啥 Chrome 会删除 localhost:80 的端口号?

为啥 Chrome 会取消 CORS OPTION 请求

为啥 Chrome 会忽略 IE 条件标签?