Я использую 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.info(field3.subfield1);
В качестве альтернативы вы можете сгладить свой объект данных перед отправкой, используя что-то вроде это, а затем разгладить на принимающей стороне, используя что-то вроде это.
Надеюсь это поможет.
Если вы посмотрите документацию для тип сообщения в REST API, вы увидите, что data
объявлен как:
"data": {
string: string,
...
},
Таким образом, поле data
может содержать только строковые значения, а не более сложные объекты.
Если вы хотите хранить более сложные значения, сначала закодируйте их как строку, а затем декодируйте на клиенте, например, с помощью JSON.stringify()
и JSON.parse()
.
Чтобы избежать ошибок на определенных платформах, убедитесь, что значения соответствуют их форме. То есть в объекте
data
выше, еслиvalue1
является целым числом, вы должны удалить кавычки. То же правило для логического значения