首页 > 解决方案 > Firebase Cloud Messaging for web:如何发送到多个令牌?

问题描述

我希望我不会对此投反对票,我一直在尝试使用 CMS 为我的 CMS 设置网络通知Firebase,并且我注意到Google 关于该主题的 Firebase 文档非常庞大,我的意思是您会感到困惑。

到目前为止,我设法通过让浏览器询问他们是否允许向他们发送通知来添加让人们订阅通知的功能,然后在他们接受并将这些令牌存储在我的数据库中后,我得到了唯一的令牌,我还设法更改了的位置service worker和一切看起来都很好而且花花公子。

现在,我想向存储在我的数据库中的所有用户(令牌)发送通知,我认为遍历它们并分别使用CURL每个用户发送通知是一个讨厌的解决方案。我找不到有关如何在一次 CURL 调用中向我的所有令牌发送通知的文档。

到目前为止,这是我的代码:

<!-- Firebase Technologies -->
<!-- Firebase App is always required and must be first -->
<script src="https://www.gstatic.com/firebasejs/5.1.0/firebase-app.js"> 
</script>
<script src="https://www.gstatic.com/firebasejs/5.1.0/firebase- 
messaging.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "AIzaSyAR84lF2vbnfUWPZ2899dnqiTthgvfv7Ms",
authDomain: "lazemnicms.firebaseapp.com",
databaseURL: "https://lazemnicms.firebaseio.com",
projectId: "lazemnicms",
storageBucket: "lazemnicms.appspot.com",
messagingSenderId: "268754114869"
};
firebase.initializeApp(config);
messaging = firebase.messaging();
//Registering the service worker
navigator.serviceWorker.register("firebase-messaging-sw.js", {scope: "firebase-cloud-messaging-push-scope"}).then(function (registration) {

messaging.useServiceWorker(registration);

}).catch(function (err) {
  // registration failed :(
  console.log('ServiceWorker registration failed: ', err);
});

permissionGranted = false;

messaging.getToken().then(function(currentToken) {
if (currentToken) {
    console.log(currentToken);
    permissionGranted = true;
    //sendTokenToServer(currentToken);
    //updateUIForPushEnabled(currentToken);
} else {
    permissionGranted = false;
}
}).catch(function(err) {
    permissionGranted = false;
});

而且,如果用户得到了一个refreshedToken,我怎么知道这个用户的旧令牌,以便在我存储他/她的新令牌后将其从我的数据库中删除?

这些问题真的很困扰我。

提前致谢。

标签: firebasefirebase-cloud-messagingtoken

解决方案


v1 API 目前只允许一次发送到一个令牌。计划添加多播(它存在于以前的 API 中),但我没有关于何时可用的时间表。所以现在这意味着您需要为每个令牌调用 FCM API。

没有内置的东西可以知道用户以前的令牌。执行此操作的典型方法是将“最后一个已知令牌”保留在本地存储中,并在您获得新令牌时取消注册。或者,您可以在发送消息时捕获指示无效令牌的错误,并以这种方式将它们从数据库中删除(请参阅此处的示例)。这两种方法的组合可能是最好的。


推荐阅读