您的通知会是这些用户问题的答案吗?
如果是这样,我将使用 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)
})
如果你真的想在后台捕获通知数据,我会发送 DATA 通知,因为这张表来自firebase_messaging repo states,
在 Android 上,DATA 消息通过onMessage 接收,而应用
留在后台。
在 iOS 上,DATA 消息由 FCM 存储并通过
onMessage 当应用程序回到前台时
(从该表重新编辑)
但是,如果应用程序终止,根本没有运行,这些 DATA 消息将丢失,如表中所述。
这就是为什么我建议您让您的应用在没有通知的情况下运行,而不是使用它们来传输实际数据,而只是通知用户有新数据可用。通知可以将用户指向应用程序中的正确位置,但对于应用程序的主要用途而言,这不是必需的。