如何防止 FCM 将嵌套的 json objects 转换为 react-native 中数据消息通知中的字符串
How to prevent FCM from converting nested json objects to string in Data Message notifications in react-native
我在我的 react-native 项目中使用 firebase(使用打字稿),我正确地设置了所有内容并且它可以正常处理 data
如下消息:
{
"to": "fcm-token",
"data": {
"field1": "value1",
"field2": "value1",
"field3": "value1"
}
}
在我的应用程序中,我可以使用 RemoteMessage
的 data
字段访问我的数据,如下所示:
const data: MyDataType = remoteMessage.data;
const {/* destructed fields */} = data;
但是 当我的服务器将嵌套的 Object 发送到 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"
}
}
我在我的服务器 post 请求中将 Content-Type
header 设置为 application/json
,所以我认为我的 header 没有任何问题s.
我是不是做错了什么?如何防止 FCM 转换我的嵌套 objects?
react-native-firebase
作者在这里,
在我们的实现中,我们不会在内部将任何内容转换为字符串,这些已经作为字符串传递给本机,例如在 Android 上,它使用 RemoteMessage
FCM class -我们称之为 getData()
的地方,如您所见,仅 here returns 字符串。
如果我想要嵌套数据只有一个数据字段,我将所有数据作为单个 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);
或者,您可以在发送之前展平数据对象,例如 this and then unflatten on the receiving end using something like this。
希望对您有所帮助。
如果您查看 message type in the REST API 的文档,您会看到 data
声明为:
"data": {
string: string,
...
},
所以data
字段只能保存字符串值,不能保存更复杂的对象。
如果要存储更复杂的值,请先将它们编码为字符串,然后在客户端对其进行解码,例如 JSON.stringify()
和 JSON.parse()
。
我在我的 react-native 项目中使用 firebase(使用打字稿),我正确地设置了所有内容并且它可以正常处理 data
如下消息:
{
"to": "fcm-token",
"data": {
"field1": "value1",
"field2": "value1",
"field3": "value1"
}
}
在我的应用程序中,我可以使用 RemoteMessage
的 data
字段访问我的数据,如下所示:
const data: MyDataType = remoteMessage.data;
const {/* destructed fields */} = data;
但是 当我的服务器将嵌套的 Object 发送到 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"
}
}
我在我的服务器 post 请求中将 Content-Type
header 设置为 application/json
,所以我认为我的 header 没有任何问题s.
我是不是做错了什么?如何防止 FCM 转换我的嵌套 objects?
react-native-firebase
作者在这里,
在我们的实现中,我们不会在内部将任何内容转换为字符串,这些已经作为字符串传递给本机,例如在 Android 上,它使用 RemoteMessage
FCM class -我们称之为 getData()
的地方,如您所见,仅 here returns 字符串。
如果我想要嵌套数据只有一个数据字段,我将所有数据作为单个 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);
或者,您可以在发送之前展平数据对象,例如 this and then unflatten on the receiving end using something like this。
希望对您有所帮助。
如果您查看 message type in the REST API 的文档,您会看到 data
声明为:
"data": {
string: string,
...
},
所以data
字段只能保存字符串值,不能保存更复杂的对象。
如果要存储更复杂的值,请先将它们编码为字符串,然后在客户端对其进行解码,例如 JSON.stringify()
和 JSON.parse()
。