如何防止 FCM 在 react-native 的数据消息通知中将嵌套的 json 对象转换为字符串



我在我的反应原生项目中使用 firebase(使用打字稿(,我正确设置了所有内容,并且可以正常工作data

如下所示的消息:
{
  "to": "fcm-token",
  "data": {
    "field1": "value1",
    "field2": "value1",
    "field3": "value1"
  }
}

在我的应用程序中,我可以使用data RemoteMessage访问我的数据,如下所示:

const data: MyDataType = remoteMessage.data;
const {/* destructed fields */} = data;

但是当我的服务器将嵌套对象发送到 FCM 服务器时,它会将它们转换为字符串,因此我无法像上面那样直接访问它们。

这是我的服务器发送到 FCM 服务器的内容:

{
  "to": "fcm-token",
  "data": {
    "field1": {
      "subfield1": "subvalue1",
      "subfield2": "subvalue2",
    },
    "field2": "value1",
    "field3": "value1"
  }
}

这就是我在应用程序中得到的:

{
  "to": "fcm-token",
  "data": {
    "field1": "{"subfield1": "subvalue1","subfield2": "subvalue2"}", <--- the problem is here, it must be a nested object not string
    "field2": "value1",
    "field3": "value1"
  }
}

我将Content-Type标头设置为application/json服务器发布请求,因此我认为我的标头没有任何问题。

我做错了什么吗?如何防止 FCM 转换我的嵌套对象?

react-native-firebase 👋作者在这里,

在我们的实现中,我们不会在内部将任何东西转换为字符串,这些字符串已经作为字符串通过本机,例如在 Android 上,它使用 RemoteMessage FCM 类 - 我们在其中调用 getData() 正如你在这里看到的,它只返回字符串。

如果我想要嵌套数据,他们自己解决这个问题的方式是只有一个数据字段,我将所有数据作为单个 JSON 字符串提供,然后在接收它时我只需要 JSON.parse 单个字段即可恢复结构。

例如
const data = {
  "field1": "value1",
  "field2": "value1",
  "field3": {
    "subfield1": "subvalue1",
  }
}
const payload = {
  "to": "fcm-token",
  "data": {
    "json": JSON.stringify(data),
  }
}
const data: MyDataType = remoteMessage.data;
const { field1, field2, field3 } = JSON.parse(data.json);
console.log(field3.subfield1);
或者,您可以在发送之前使用类似的东西展平

数据对象,然后使用类似的东西在接收端取消展平。

希望这有帮助。

如果您查看 REST API 中消息类型的文档,您会发现data声明为:

"data": {
  string: string,
  ...
},

因此,data字段只能保存字符串值,而不能保存更复杂的对象。

如果要存储更复杂的值,请先将它们编码为字符串,然后在客户端上解码它们,例如使用 JSON.stringify()JSON.parse()

相关内容

  • 没有找到相关文章

最新更新