【问题标题】:Invalid JSON payload received. Unknown name click_action收到无效的 JSON 有效负载。未知名称 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中。

标签: json push-notification firebase-cloud-messaging service-worker progressive-web-apps


【解决方案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 messagessetting an expiration date 这样的东西。我不确定 FCM 是否支持所有标头。
  • 在我的例子中,该图标仅在尺寸小于 72px x 72px 时才有效
猜你喜欢
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多