无法通过 Android 发送 Firebase 通知,但可以通过 curl 工作

Posted

技术标签:

【中文标题】无法通过 Android 发送 Firebase 通知,但可以通过 curl 工作【英文标题】:Can't send firebase notification via Android but it works via curl 【发布时间】:2019-06-19 02:11:52 【问题描述】:

我正在尝试使用 Firebase 将推送通知从一台设备发送到另一台设备(它们是两个不同的项目)。 我正在使用 POST 通过 okhttp3 库调用 API。 如果我尝试使用 curl 可以发送通知,但通过 android 我收到以下错误:

"multicast_id":XXXXXXXX,"success":0,"failure":1,"canonical_ids":0,"results":["error":"MismatchSenderId"]

在 Android 中是否有一些元数据与 rest 调用一起发送? 怎么发送

这是 curl 调用(工作正常)

curl -H "Content-type: application/json" -H "Authorization:key=AXXXXX" -X POST -d '"data":"info":"abc","to":" DEV-TOKEN-XXX"' https://fcm.googleapis.com/fcm/send

在 Android 中,我只是复制了相同的场景设置标头,正文 ecc 与 okhttp3

【问题讨论】:

FWIW:您实际上不应该将服务器身份验证 api 密钥分发给您的客户端。所以只有服务器有足够的权限向设备/主题发送消息。但您可以将上游消息发送回服务器。见firebase.google.com/docs/cloud-messaging/android/upstream 老实说,我不建议给客户端足够的权限来向另一台设备发送通知。让服务器处理它(例如:设备 A 连接到具有所有凭据的服务器,然后向设备 B 发送通知) 感谢@herbert 和@ZUNJAE,你说得对,我会考虑在服务器中实现它。顺便说一句,在这种情况下,我仍然想尝试从客户端发送通知以进行测试。 【参考方案1】:

您可以使用以下方式实现此目的:

1)首先获取需要发送推送通知的设备的Token

FirebaseInstanceId.getInstance().getToken();

2)然后你需要创建具有两个键'to'和'notification'的JSON对象。你也可以使用'data'。它存储了有效负载信息。

JSONObject jsonObj = new JSONObject();
jsonObj.put("data", profileJson);
jsonObj.put("notification", notificationJson);
jsonObj.put("to", mPushToken);

3)然后进行发送推送通知的 API 调用。

RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonData.toString());
okhttp3.Request request = new okhttp3.Request.Builder()
        .header("Authorization", "key=" + R.string.firebase_legacy_server_key)
        .url("**https://fcm.googleapis.com/fcm/send**")
        .post(body)
        .build();

这将向给定的 firebase 令牌触发推送通知。

【讨论】:

notificationJson 包含什么值?【参考方案2】:

当我在 Android 中使用“旧版服务器密钥”进行休息调用时,它起作用了。 但是使用 curl 我使用“服务器密钥”并且它工作正常。 不知道为什么。

【讨论】:

以上是关于无法通过 Android 发送 Firebase 通知,但可以通过 curl 工作的主要内容,如果未能解决你的问题,请参考以下文章

通过 Firebase 从 Laravel 服务器向 Android 应用发送推送通知

尝试通过 Firebase Cloud Functions (Android) 发送通知后出现错误

使用 Firebase 函数向 Android 应用发送通知

无法将数据写入 Firebase 数据库 Android

python Python脚本通过Firebase云消息传递将可升级包的推送通知发送到iOS / Android。

使用 Java,而不是 FCM 控制台发送 Firebase 通知