我正在部署移动应用程序(适用于Android和iOS),管理员可以通过该应用程序向注册到特定主题的用户发送警报。为此,我使用实时数据库存储警报和云功能,以便向主题发送通知。
我部署了以下云功能:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNewAlertNotification = functions.database.ref('/alerts').onWrite(event => {
const getValuePromise = admin.database()
.ref('alerts')
.orderByKey()
.limitToLast(1)
.once('value');
return getValuePromise.then(snapshot => {
const { text, topics, author } = snapshotToArray(snapshot)[0];
const payload = {
data: {
title: 'Avviso',
body: text,
icon: 'ic_stat_notify',
sound: 'default',
color: '#F3E03B',
tag: 'alerts',
ticker: 'Nuovo avviso',
subtitle: 'Avvisi',
author: JSON.stringify(author)
}
};
const options = {
priority: 'high',
timeToLive: 60 * 60 * 24 * 2, // 48 hours
collapseKey: 'it.bmsoftware.caliup'
// contentAvailable: true
};
if (topics.length > 1) {
let condition = '';
topics.forEach((topic, index) => {
condition += `'${topic}' in topics`
if (index < topics.length - 1) {
condition += ' || '
}
});
console.log(`Sending alert to condition '${condition}' -> ${JSON.stringify(payload)}`);
return admin.messaging().sendToCondition(condition, payload, options);
} else if (topics.length === 1) {
let topic = topics[0];
console.log(`Sending alert to topic '${topic}' -> ${JSON.stringify(payload)}`);
return admin.messaging().sendToTopic(topic, payload, options);
} else {
console.log(`No topics found`);
}
});
});
const snapshotToArray = (snapshot) => {
let result = []
if (!snapshot || !snapshot.val())
return result
snapshot.forEach((childSnapshot) => {
let item = childSnapshot.val()
item.key = childSnapshot.key
result.push(item)
})
return result
}
当我在实时数据库上插入新消息时,上面的函数正确地获取该消息,并在日志部分(在firebase控制台上),我看到了正确的自定义日志和一个显示status 'ok'
的日志。 / p>
尽管如此,设备上没有通知。如果我直接从firebase控制台测试相同的主题,它可以正常工作,因此设备已正确注册。
我错过了云功能有什么问题吗?
答案 0 :(得分:0)
我相信如果您只发送findByView
有效负载,则应该取消注释// contentAvailable: true
,至少对于iOS而言。这样,您就可以在应用代码上自行显示和触发通知。如果您希望弹出通知而不必处理数据有效负载,则应在有效负载上传递data
对象。
通知仅限于以下字段:https://firebase.google.com/docs/reference/admin/node/admin.messaging.NotificationMessagePayload