【问题标题】:Get all subscribed topics from firebase cloud messaging从 firebase 云消息传递中获取所有订阅的主题
【发布时间】:2016-06-23 09:39:07
【问题描述】:

使用新的 FirebaseMessaging,可以通过以下方式轻松取消/订阅主题:

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

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

【问题讨论】:

标签: android firebase-cloud-messaging


【解决方案1】:

我搜索了 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找到:你的项目->设置->项目设置->云消息->服务器密钥

注意:找key时要小心,不要使用不同的web api key。

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

scope 通常是"FCM"

【讨论】:

  • 对不起,错过了细节参数
  • 这是关于此的文档:developers.google.com/instance-id/reference/server 未隐藏。
  • 在应用程序中嵌入服务器密钥似乎不是很安全。有没有其他办法?
  • @bongjaechoe,作为解决方法,您可以写入设备上的缓存并在订阅和取消订阅方法的回调中更新它。
  • @최봉재,您可以创建自己的包含服务器密钥的后端。后端将把请求发送到谷歌 iid 服务器。然后移动应用只需要使用设备令牌向您自己的后端发送请求。
【解决方案2】:

对于那些想用命令行 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'
} 

【讨论】:

    【解决方案3】:

    从未以编程方式尝试过。

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

    【讨论】:

      【解决方案4】:

      这个话题仍然是相关的,在 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)")")
              }
          }
      

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

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

      流程: 用户启动应用程序->检索到的主题->迭代并传递主题以订阅功能->如果主题==真则阻止->如果主题!=真则通过

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

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

      干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-07
        • 2020-06-25
        • 2016-09-19
        • 1970-01-01
        • 2016-11-01
        • 1970-01-01
        • 2019-04-20
        相关资源
        最近更新 更多