Могут ли ваши уведомления отвечать на эти вопросы пользователей?
Если это так, я бы воспроизвел этот сценарий с помощью Firebase Realtime Database (или 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 будут потеряны, как также указано в таблице.
Вот почему я предлагаю вам заставить ваше приложение работать без уведомлений и НЕ использовать их для передачи фактических данных, а просто для уведомления пользователя о наличии новых данных. Уведомление может указывать пользователю на нужное место в приложении, но это не обязательно для основного использования приложения.
20.12.2018