android - FCM:设备仅接收多个通知消息之一
问题描述
我目前正在使用 Flutter 和 Node.js 后端编写一个 Android 应用程序。
在客户端,我按照firebase_messaging 文档的前 3 个步骤将 FCM 集成到我的应用程序中。我的应用程序的逻辑根据不同的设置订阅和取消订阅多个主题(一个用户平均订阅了 12 个主题) 。
服务器逻辑应该根据条件发送各种通知消息:
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 个推送通知。但是,我一次只收到一个通知。在我重新安装应用程序并因此使用新令牌再次订阅主题后,我收到了我应该收到的所有消息。然而,几天后,它又变回了原来的行为,每次服务器发送一批消息时,我都会收到一条消息。
解决方案
在 BigQuery 的帮助下,我发现了问题所在:所有消息都具有相同collapse_key
的(应用名称)。因此,如果在服务器发送消息时我的设备上没有收到任何消息(例如,当我没有连接到 Internet 时),消息将折叠并且我只收到一条消息(最后一条消息发送)。这种行为似乎是针对通知消息的:
除通知消息外,默认情况下所有消息都是不可折叠的。
显然,这个问题没有直接的解决方案。FCM 一次只支持四个不同collapse_key
的 s,所以我不能只给每条消息一个不同的collapse_key
,因为那样我最多只能收到四个消息。
我可能不得不通过发送数据消息然后在客户端创建正确的推送通知来使用解决方法。
推荐阅读
- spring - 使用 jndi 查找的 JndiDestinationResolver 的 Bean 定义示例
- swift - CircleCI Swift 与 Postgres 连接问题
- elasticsearch - 我在从弹性搜索域中获取数据时遇到问题
- web-applications - 将 Web 应用程序与有卡的信用卡设备集成
- c# - 在 Xamarin Forms 中编辑 ListView 的选定项的标签
- android - 我无法在 firebase 和 android 中创建实时数据库
- c# - 带步长的两个数字之间的线性插值
- javascript - 使用 CloudFlare 301 重定向时,为什么脚本不呈现?
- apache-spark - 通过 spark 读取 parquet 文件时 Parquet 解码异常
- android - 以 ViewPager 作为子元素的 ExpandableListView 执行 getChildView 两次