FCM订阅主题

3

我想使用FCM向所有主题订阅者发送通知。首先,我需要将用户订阅到一个主题。我在做什么(我正在使用JavaScript Firebase Cloud Messaging进行网页推送通知):

1)获取FCM实例

var messaging = firebase.messaging();

2) 获取令牌

messaging.getToken();

3) 通过ajax将令牌发送到服务器

4) 订阅客户端到服务器的主题

https://iid.googleapis.com/iid/v1/IID_TOKEN/rel/topics/TOPIC_NAME

所以,我的js代码大致如下:
            var messaging = firebase.messaging();
            messaging.useServiceWorker(reg);

            messaging.requestPermission()
                .then(function () {
                    messaging.getToken()
                        .then(function (currentToken) {
                            if (currentToken) {
                                $.ajax({
                                    type   : 'POST',
                                    url    : URL_TO_SERVER_METHOD
                                    data   : {
                                        token : currentToken
                                    }
                                });

                            }
                        })
                })

如果我使用所有必要的参数向 https://fcm.googleapis.com/fcm/send 发送请求,那么我就可以在浏览器中收到通知。

一切都正常,但是我从fcm文档中了解到,令牌有时会被fcm应用程序刷新。这意味着如果令牌已经被刷新,但是用户没有使用新令牌重新订阅,他将无法收到通知。

  • 问题1:

我如何确保我的订阅者始终能收到通知?

  • 问题2:

我看到了onTokenRefresh方法的相关内容,但当浏览器关闭或计算机关闭时,它是否会被调用(我确定不会)?如何模拟令牌刷新操作?

  • 问题3:

我只能进行一次订阅(下一次使用相同的令牌不需要),但我不知道我的令牌是否过期,我是否需要重新订阅当前用户。在这种情况下我该怎么办(这与前面的问题有关)?


有关问题的任何结论吗?同样的问题在脑海中。 - Djai
1个回答

0
为确保用户始终订阅,您肯定需要使用onTokenRefresh方法。只有在用户有新令牌时,才会触发onTokenRefersh。
代码将类似于:
messaging.onTokenRefresh(function () {

    messaging.getToken()
        .then(function (refreshedToken) {
            console.log('Token refreshed.');
            // Indicate that the new Instance ID token has not yet been sent to the
            // app server.
            setTokenSentToServer(false);
            // Send Instance ID token to app server.
            sendTokenToServer(refreshedToken);
        })
        .catch(function (err) {
            console.log('Unable to retrieve refreshed token ', err);               
        });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接