我目前正在使用Flutter和Node.js后端编写一个Android应用。
在客户端,我按照firebase_messaging docs的前三个步骤将FCM集成到我的应用程序中。我的应用subscribes从多个主题(每个用户平均订阅12个主题)到unsubscribes的逻辑。
服务器逻辑应该基于conditions发送各种通知消息:
const firebase = require('firebase-admin')
firebase.initializeApp({
credential: firebase.credential.applicationDefault(),
databaseURL: 'https://<PROJECT>.firebaseio.com'
})
const title = ...
const msgList = [...]
const notifications = []
for (let msg of msgList) {
let condition = `'${msg.topicA}' in topics && '${msg.topicB}' in topics`
if (msg.topicX !== '') {
condition = `${condition} && !('${msg.topicX}' in topics)`
}
notifications.push(buildMessage(title, msg.body, condition))
}
new Promise((resolve, reject) => {
return firebase.messaging().sendAll(notifications).then(resp => {
console.log(`Sent ${resp.successCount} messages, ${resp.failureCount} failed`)
resolve()
})
}).then(() => {
firebase.app().delete()
}).catch(err => {
console.error(err)
})
function buildMessage(title, body, condition) => {
return message = {
notification: { title, body },
android: {
ttl: 24 * 60 * 60 * 1000, // 1d
notification: {
sound: 'default',
vibrate_timings: [
'0s', '0.1s',
]
}
},
condition
}
}
运行此代码时,它记录Sent 72 messages, 0 failed
。因此,我认为发送消息是可行的。发送的消息数和相应的主题以及标题至少每天更改一次。 根据我的主题订阅,我实际上应该会在手机上收到大约4条推送通知。但是,我一次只收到一个通知。重新安装该应用程序并因此使用新令牌再次订阅主题后,我收到了本应收到的所有消息。但是几天后,它又变回了原来的行为,每次服务器发送一批消息时,我都会收到一条消息。
答案 0 :(得分:1)
在BigQuery的帮助下,我找出了问题所在:所有消息都具有相同的collapse_key
(应用程序名称)。因此,如果在服务器发送消息时(例如,当我未连接到Internet时)我在设备上未收到任何消息,则这些消息将被折叠,而我只会收到一条消息(最后一条消息)发送)。此行为似乎是为了通知消息:
Non-collapsible and collapsible messages (FCM Docs):
除了通知消息外,默认情况下所有消息都是不可折叠的。
显然,没有直接解决此问题的方法。 FCM一次仅支持四个不同的collapse_key
,所以我不能只给每个消息一个不同的collapse_key
,因为那样的话我最多只能得到四个消息。
我可能不得不使用一种变通方法,即发送数据消息,然后在客户端上创建正确的推送通知。
相关:How to make a GCM / FCM notification-type message non-collapsible