fcm 订阅主题

Posted

技术标签:

【中文标题】fcm 订阅主题【英文标题】:fcm subscribe to topic 【发布时间】:2018-06-17 08:59:56 【问题描述】:

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

1) 获取 FCM 实例

var messaging = firebase.messaging();

2) 获取令牌

messaging.getToken();

3) 通过ajax发送token到服务器

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:

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

【问题讨论】:

对问题有什么结论吗?想到了同样的问题。 【参考方案1】:

为了确保您的用户始终被订阅,您绝对需要使用 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);               
        );
);

【讨论】:

以上是关于fcm 订阅主题的主要内容,如果未能解决你的问题,请参考以下文章

设备可以在 FCM 中订阅的最大主题数

FCM:有没有办法订阅匹配正则表达式的所有主题?

向订阅主题的所有用户推送通知,使用 FCM Firebase 的登录用户除外

如何将用户的偏好与他们在 FCM 上订阅的主题同步?

FCM 主题缓存在旧令牌上 - 用户仍然收到推送

FCM - 发送到主题和“未注册”错误