您的通知会是这些用户问题的答案吗?
如果是这样,我将使用 Firebase 实时数据库(或 Firestore)复制此场景。我会让一切都与 FB DB 一起工作,而不需要通知,然后根据需要添加通知。
Firebase 实时数据库允许您对这些数据执行离线访问,并在再次连接互联网时进行同步。您不需要将此数据保存在额外的本地数据库或 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)
})
如果您真的想在后台捕获通知数据,我会发送数据通知,因为此表来自firebase_messaging 存储库状态 http://Message%20is%20stored%20by%20FCM%20and%20delivered%20to%20app%20via%20onMessage%20when%20the%20app%20is%20brought%20back%20to%20foreground,
在 Android 上,DATA 消息通过以下方式接收onMessage
当应用程序
留在后台。
在 iOS 上,DATA 消息由 FCM 存储并通过onMessage
当应用程序返回前台时
(从该表重新编辑)
但是,如果应用程序终止且根本不运行,这些数据消息将会丢失,如表中所述。
这就是为什么我建议您让您的应用程序在没有通知的情况下运行,并且不要使用它们来传输实际数据,而只是通知用户有新数据可用。通知可以将用户指向应用程序中的正确位置,但对于应用程序的主要用途来说这不是必需的。