FCM:设备仅接收多个通知消息之一

时间:2020-01-16 08:35:15

标签: android firebase firebase-cloud-messaging

我目前正在使用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条推送通知。但是,我一次只收到一个通知。重新安装该应用程序并因此使用新令牌再次订阅主题后,我收到了本应收到的所有消息。但是几天后,它又变回了原来的行为,每次服务器发送一批消息时,我都会收到一条消息。

1 个答案:

答案 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