收到无效的 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(确实被调用)中硬编码 iconclick_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有效负载

GCM 无效的 JSON 缺少有效负载

Postman 中的 JSON 帖子有效负载无效

Firebase FCM - 为啥会收到:有效负载错误,无效的“android”(或“apns”)属性

AFNetworking 序列化正斜杠使 JSON 有效负载无效