收到无效的 JSON 有效负载。未知名称 click_action
Posted
技术标签:
【中文标题】收到无效的 JSON 有效负载。未知名称 click_action【英文标题】:Invalid JSON payload received. Unknown name click_action 【发布时间】:2018-08-01 20:14:09 【问题描述】:所以我目前正在开发 PWA。
我现在正在使用推送通知,并且我已经能够使用以下非常简单的 JSON 结构接收后台和前台通知。
"message":
"token":"aValidToken",
"notification":
"title": "New Content!",
"body": "A new video has been uploaded."
我还能够添加一个包含其他信息的数据成员,并且仍然可以轻松地收到通知。
现在的问题是,如果我想向 JSON 添加另一个成员,例如 click_action,我会发布以下内容:
"message":
"token":"aValidToken",
"notification":
"title": "New Content!",
"body": "A new video has been uploaded.",
"click_action":"https://www.google.com.ar/"
我收到以下错误:
"error":
"code": 400,
"message": "Invalid JSON payload received. Unknown name \"click_action\" at 'message.notification': Cannot find field.",
"status": "INVALID_ARGUMENT",
"details": [
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
"field": "message.notification",
"description": "Invalid JSON payload received. Unknown name \"click_action\" at 'message.notification': Cannot find field."
]
]
几乎所有其他成员都会发生这种情况,例如:优先级、图标、声音、徽章等。
最后,我尝试在 setBackgroundMessageHandler(确实被调用)中硬编码 icon 和 click_action,但无济于事。没有图标出现,点击通知时没有任何反应。
messaging.setBackgroundMessageHandler( (notif) =>
const notificationTitle = notif.notification.title;
const notificationOptions =
body : notif.notification.body,
icon : '/assets/icon/icon72x72.png',
click_action : 'https://www.google.com.ar/'
;
return self.registration.showNotification(notificationTitle, notificationOptions);
);
这纯粹是一个 Ionic PWA 项目,旨在在移动浏览器和桌面上运行。我会很感激你能给我的每一个小费!谢谢!
【问题讨论】:
服务获取到 JSON 字符串后会做什么。我的猜测是它需要特定的参数,而click_action
不是一个有效的参数。
来自 Firebase 文档:> 对于从应用服务器发送的通知消息,FCM javascript API 支持 click_action
键。这通常设置为您的网络应用程序中的一个页面,这样当用户点击通知时,您的应用程序就会被带到前台。
奇数。代码和有效负载看起来不错。您可以尝试通过 Postman 测试发送消息,看看它是否显示相同的错误?这是sample
我将其作为评论留在这里,请确保您没有传递包含其他对象作为数据的对象,因为这也会触发该错误。您只能将字符串作为值传递。如果你想传递复杂的结构,确保你stringify
他们作为json把它们放在data
中。
【参考方案1】:
您似乎正在使用新的 API:https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages
但尝试使用旧版 API 中的字段: https://firebase.google.com/docs/cloud-messaging/http-server-ref
您可以使用您正在使用的 API 定义一个图标,但您的有效负载必须是:
"message":
"token": "aValidToken",
"webpush":
"notification":
"title": "New Content!",
"body": "A new video has been uploaded.",
"icon": "your_icon"
您可以找到有关 webpush 通知字段here 的更多信息。
仅供参考,您提到的大多数其他字段(优先级、声音、徽章)不在 Web 上尚不受任何 API 支持。
编辑(2018 年 5 月 10 日):新 API 现在支持所有 notification properties(优先级、图标、声音、徽章等)。详情请见this guide。
【讨论】:
优秀的工作就像一个魅力!一个快速的后续问题是......我应该在 headers 对象中发送什么? 你不需要发送任何东西,除非你需要像replacing messages 或setting an expiration date 这样的东西。我不确定 FCM 是否支持所有标头。 在我的例子中,该图标仅在尺寸小于 72px x 72px 时才有效以上是关于收到无效的 JSON 有效负载。未知名称 click_action的主要内容,如果未能解决你的问题,请参考以下文章
C# Google API - 收到无效的 JSON 有效负载
使用Apps Script API创建新的Apps脚本文件 - 错误 - 收到无效的JSON有效负载