Будут ли ваши уведомления ответами на эти вопросы пользователей?
Если это так, я бы повторил этот сценарий с базой данных Firebase Realtime (или Firestore).Я бы заставил все работать с БД FB без уведомлений, а затем добавлял бы уведомления по мере необходимости.
База данных Firebase Realtime позволяет вам выполнять автономный доступ к этим данным и синхронизируется, когда снова появляется Интернет.Вам не нужно было бы сохранять эти данные в дополнительной локальной базе данных или файле json.
В качестве уведомляющих групп или пользователей каждое устройство будет иметь fcmToken
(маркер облачных сообщений Firebase), поэтому вы будете хранить в облакеэти токены в вашем профиле пользователя и использовать их для направления ваших уведомлений.
Однако, по моему опыту, гораздо проще использовать темы как для групп, так и для отдельных пользователей.Тогда ваши уведомления будут направлены на темы, а не на конкретные токены.Например, данный пользователь подписывается на две темы, одну с именем questions.group.finance
, а другую, например, user.id.131231
.Таким образом, вам не нужно поддерживать базу данных topics
, и вы можете просто вывести их, основываясь на деталях ответов.
Это также облегчает поддержку нескольких устройств для одного и того же пользователя.
Таким образом, у вас может быть БД с такой структурой
questions
+ 001
- subject: What's ...?
- department: Finance
- user: 131231
+ answers
001
- text: That's a ...
- user: 432
ИВы можете настроить облачную функцию, которая будет запускаться при создании нового ответа.
export const answerCreate = functions.database.ref('/questions/{questionKey}/answers/{answerKey}')
.onCreate(async (snapshot, context) => {
// INCOMPLETE AND UNTESTED CODE
const questionKey = context.params.questionKey
const questionSnap = await fbadmin.database().ref(`/questions/${questionKey}`).once('value')
const question = questionSnap.val()
const answerKey = context.params.answerKey
const answer = snapshot.val()
const payload = {
notification: {
title: question.subject,
body: `${answer.user.name} replied: ${answer.text}`,
// icon: question.photoURL,
}
}
const topic = `questions.group.${question.department}`
return fbadmin.messaging().sendToTopic(topic, payload)
})
Если вы ДЕЙСТВИТЕЛЬНО хотите ЗАПИСАТЬ данные уведомлений в фоновом режиме, я бы отправлял уведомления DATA, как эта таблица из состояния репо firebase_messaging ,
На Android сообщения DATA принимаются через onMessage
, пока приложение остается в фоновом режиме.
В iOS сообщения DATA хранятся в FCM и доставляются в приложение через onMessage
, когда приложение возвращается на передний план
(отредактировано из этой таблицы)
Однако, если приложение завершено, а не работает ВСЕ, эти сообщения DATA будут потеряны, как указано в таблице.
Именно поэтому я предлагаю вам заставить ваше приложение работать без уведомлений и НЕ использоватьих для передачи фактических данных, но просто для уведомления пользователя, что есть новые данные доступны.Уведомление может указать пользователю правильное место в приложении, но оно не будет необходимым для основного использования приложения.