【问题标题】:How do I specify the recipient token when using RemoteMessage of Firebase Cloud Messaging?使用 Firebase Cloud Messaging 的 RemoteMessage 时如何指定收件人令牌?
【发布时间】:2019-09-08 05:44:56
【问题描述】:

我正在尝试在我的应用中为某些操作(“有人喜欢你的这个”、“有人对此发表评论”等)建立推送通知。

我尝试按照谷歌的指南here

但是当我复制代码时,它的这一部分

String response = FirebaseMessaging.getInstance().send(message);

给出一个错误,说它期待的是RemoteMessage 而不是Message。 我正在尝试将其更改为 RemoteMessage,但我无法理解:

  1. 在哪里指定收件人的令牌?我找不到与 .setToken 相同的内容。
  2. RemoteMessage.Builder() 的括号内放什么

我已经浏览了很多手册,但我找不到任何能解决它的问题。是 API 的新变化吗?

帮助我的最好方法是使用 Kotlin 生成新消息的示例 - 作为响应,该消息会根据令牌触发收件人的新推送通知(我很确定我可以处理接收我自己)。

谢谢!

编辑:

我能够让它符合它喜欢的模式,但我无法显示通知。

这是我用来发送通知的函数:

 fun sendCloudMessage(userId: String) {

        val receiverRef = FirebaseDatabase.getInstance().getReference("/users/$userId/services/firebase-token")

        receiverRef.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(p0: DataSnapshot) {

                val registrationToken = p0.getValue(String::class.java)

                Log.d("tokencomplete", p0.toString())
                Log.d("tokenonly", registrationToken)

                val fm = FirebaseMessaging.getInstance()

                fm.send(
                    RemoteMessage.Builder("$registrationToken@gcm.googleapis.com")
                        .setMessageId(Integer.toString(0))
                        .addData("my_message", "Hello World")
                        .addData("my_action", "SAY_HELLO")
                        .build()
                )
            }

        })

    }

我传递给此函数的userId 是firebase uid,并使用它获取用户正在使用的应用程序的最新令牌。我已经检查过,该部分有效,我以类似于此的格式返回令牌

ecK86WRoAh4:APA91bGQWSesCptPF_nzfkmgDe-zOYYo2Cj4XT_NeNTVaBxQakbvauOpkVFd7DCRIugMCfso5SadEUtyTRvrhdCiBpKxGGMRgUYNsUhA24f9IkmxjL5dWD

但该功能本身不会在另一台设备中触发任何通知(我正在使用两台设备试图让一个设备与另一台设备一起触发通知)。

【问题讨论】:

    标签: android firebase kotlin push-notification firebase-cloud-messaging


    【解决方案1】:

    RemoteMessage builder 构造函数中设置发件人 ID,它应该如下所示:

    RemoteMessage.Builder(token);

    编辑

    这是我使用的方法:

    public void sendMessage (final String data) {
    FirebaseMessaging fm = FirebaseMessaging.getInstance();
    
    String token = FirebaseInstanceId.getInstance().getToken();
    String msgID = DigestUtils.sha1Hex(token + System.currentTimeMillis());
    String SENDER_ID = "someID";
    
    RemoteMessage.Builder RMBuilder =
    new RemoteMessage.Builder(SENDER_ID + "@gcm.googleapis.com");
    RMBuilder.setMessageId(msgID);
    
    Map<String, Object> mapData = Utils.jsonToMap(data);
    
    for (Map.Entry<String, Object> entry : mapData.entrySet()) {
        RMBuilder.addData(entry.getKey(), entry.getValue().toString());
    }
    
    fm.send(RMBuilder.build());
    }
    

    【讨论】:

    • builder 不是一个选项,但 Builder 是。问题是当我使用它时,我得到一个不同的错误说“expected RemoreMessage but found RemoteMessage.Builder
    • 我的错,直到我在最后添加build,但我仍然无法发送它。我附上了我当前的代码,你能告诉我我错过了什么吗? *编辑:我的浏览器刚刚刷新,我看到你已经编辑了你的答案,现在正在浏览它。
    • 我查看了您的更新样本,并将其与我的进行了比较。我找不到我的不起作用的原因。你介意看看我编辑的问题吗?另外,在你的回答中,我不太明白这部分for (Map.Entry&lt;String, Object&gt; entry : mapData.entrySet()) { RMBuilder.addData(entry.getKey(), entry.getValue().toString()); }
    • 好的,所以我现在明白了,发件人 ID 实际上是我在 Firebase 中的项目 ID,这让我回到了我的第一个问题:我在哪里指定此消息的目标用户?
    • 否,发件人 id 是令牌目的地,地图是数据构建器
    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2018-12-12
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多