从 firebase 云消息传递中获取所有订阅的主题

Get all subscribed topics from firebase cloud messaging

使用新的 FirebaseMessaging 可以很容易地 un/subscribe 通过以下方式访问主题:

FirebaseMessaging.getInstance().subscribeToTopic();
FirebaseMessaging.getInstance().unsubscribeFromTopic();

但是有没有办法获取当前安装订阅的所有主题?

我搜索了 Android API,在 SO 上询问了相同的问题,但没有找到任何内容。 Android API 中没有任何内容可以获取特定令牌的所有主题。

但是,您可以通过 GET 请求来完成

HTTP GET 请求

https://iid.googleapis.com/iid/info/<TOKEN>?details=true
Content-Type:application/json
Authorization:key=AAA....i1nM:APA9.....81gTPXCE55....JLPEG0wZobG_ile8lI35JTzHYE5MC..BmDD_Cxj5OxB1Yh....Rs5lo3UwLNL9h-WcocGV....b5bYWNI55kzNsrHK-7GljUDtMn 

TOKEN 在 url 中:FirebaseInstanceId.getInstance().getToken(senderId, scope);

key :可以在 firebase console 中找到:您的项目 -> 设置 -> 项目设置 -> 云消息 -> 服务器密钥

注意:查找密钥时要小心,不要使用 web api 密钥不同。

senderId 可以在设置 -> 云消息 -> 发件人 ID

中找到

scope 通常是 "FCM"

对于那些想用命令行 CURL 测试它的人,请遵循我使用的语法:

#curl --location --request GET 'https://iid.googleapis.com/iid/info/yourFCMDeviceToken?details=true' \
--header 'Authorization: Bearer YourProject_CloudMessaging_ServerKey'

回复:

{
    applicationVersion: '4194309',
    application: 'com.domain.app',
    scope: '*',
    authorizedEntity: '913674269572',
    rel: { topics: { topicName: { addDate: '2020-08-19' } } },
    appSigner: 'ae7cbSomeHash23jsdfff34ac7ffd',
    platform: 'ANDROID'
} 

这个主题仍然相关,iOS SDK 中仍然没有 API。

如果您的目标是防止用户多次订阅同一主题并因此多次收到通知(例如,群组中的一条评论),我的解决方案是使用 UserDefaults 的简单本地缓存。

非常简单:

    func subscribeTo(topic: String){
        // first check that the user isn't already
        // subscribed, or they get multiple notifications
        let localFlag = UserDefaults.standard.bool(forKey: topic)
        if localFlag == true {
            print("user already subscribed to topic: \(topic)")
            return
        }
        print("attempting to subscribe user to topic: \(topic)")
        // Subscribe to comet chat push notifications through Firebase
        Messaging.messaging().subscribe(toTopic: topic) { error in
            if error == nil {
                print("subscribed CometChat user to topic: \(topic)")
                // set local flag as "already subbed"
                UserDefaults.standard.setValue(true, forKey: topic)
                return
            }
            print("attempt to subscribe CometChat user to topic \(topic) failed: \(error?.localizedDescription ?? "(no error provided)")")
        }
    }

我的应用程序流程让用户登录,然后自动获取与用户关联的主题列表,并在每次启动时 auto-subscribes 到该主题。

这样做的原因是高度保证用户会收到通知。

流程: 用户启动应用程序 -> 检索主题 -> 迭代并传递主题以订阅 func -> 如果主题 == true 则阻止 -> 如果主题 != true

通过

然后我们当然会在取消订阅时将 nil 分配给主题键的本地布尔值。

没有这种阻止/检查,取消订阅总是成功的,因为当用户不想要通知时,更保守的 UX 更好。

干杯。

从未以编程方式尝试过。

但是您可以通过转到 firebase 控制台->您的项目->云消息传递->新通知->目标->单击用户细分旁边的主题选项卡来完成,只需单击消息主题文本框,您将获得列表订阅的主题