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

Sae*_*any 3 push-notification typescript react-native firebase-cloud-messaging react-native-firebase

我在我的 react-native 项目(使用打字稿)中使用了 firebase,我正确设置了所有内容,并且可以正常处理data如下消息:

{
  "to": "fcm-token",

  "data": {
    "field1": "value1",
    "field2": "value1",
    "field3": "value1"
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序,我可以访问我的数据使用data申请的RemoteMessage象下面这样:

const data: MyDataType = remoteMessage.data;
const {/* destructed fields */} = data;
Run Code Online (Sandbox Code Playgroud)

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

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

{
  "to": "fcm-token",

  "data": {
    "field1": {
      "subfield1": "subvalue1",
      "subfield2": "subvalue2",
    },
    "field2": "value1",
    "field3": "value1"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sal*_*kar 5

react-native-firebase 作者在这里,

在我们的实现中,我们不会在内部将任何内容转换为字符串,这些已经作为字符串转换为本地字符串,例如在 Android 上,它使用RemoteMessageFCM 类 - 我们调用getData()which 正如您在此处看到的那样仅返回字符串。

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

const data = {
  "field1": "value1",
  "field2": "value1",
  "field3": {
    "subfield1": "subvalue1",
  }
}

const payload = {
  "to": "fcm-token",
  "data": {
    "json": JSON.stringify(data),
  }
}
Run Code Online (Sandbox Code Playgroud)
const data: MyDataType = remoteMessage.data;
const { field1, field2, field3 } = JSON.parse(data.json);

console.log(field3.subfield1);
Run Code Online (Sandbox Code Playgroud)

另外,您也可以使用像发送前汇整的数据对象,然后使用类似的接收端unflatten

希望这可以帮助。