无法通过 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 应用发送通知