我正在尝试使用Firebase云消息传递。这真是太棒了,但是我正在努力让它为我工作。
我面临的问题是服务工作者,这是我的firebase-messaging-sw.js
:
console.log('Service worker is loaded!');
self.addEventListener('install', function(event) {
console.log('Service Worker is being installed.');
});
self.addEventListener('activate', function(event) {
console.log('Service Worker is being activated.');
});
importScripts('https://www.gstatic.com/firebasejs/3.6.5/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.6.5/firebase-messaging.js');
firebase.initializeApp({
'messagingSenderId': ' ... '
});
var messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function(payload){
console.log('Received background message: ', payload);
return self.registration.showNotification('Title', {'body': 'Body'});
});
当我发送消息时(我正在使用PHP-FCM BTW),当页面处于焦点时,通过onMessage( ... )
在浏览器中按预期收到消息,但从不在页面不是焦点或浏览器关闭;服务工作者只是没有收到消息!
“收到后台留言:......”这一行从未显示;意思是消息处理程序根本没有注册!
以下是一个示例消息响应:
{
"from": " ... ",
"collapse_key": "do_not_collapse",
"data": {
"id": "111"
},
"priority": "high",
"notification": {
"title": "Hi there",
"body": "Message body",
"badge": "1",
"color": "#ffffff"
}
}
这可能是什么问题?这让我发疯了。
答案 0 :(得分:1)
我不确定您是否可以在javascript中间定义导入根目录,我认为这些调用需要位于顶部。
FCM SDK也不支持徽章价值和颜色。如果要设置徽章,可以使用后台消息处理程序显示通知,使用普通APi并通过该APi定义徽章
答案 1 :(得分:1)
否, 已注册,但由于您选择的构造通知方式而未调用。参考FCM文档:
https://firebase.google.com/docs/cloud-messaging/js/receive
“注意:如果您在HTTP或XMPP发送请求中设置了通知字段,则这些值优先于服务工作者中指定的任何值。”
所以,你有
{
"from": " ... ",
"collapse_key": "do_not_collapse",
"data": {
"id": "111"
},
"priority": "high",
"notification": {
"title": "Hi there",
"body": "Message body",
"badge": "1",
"color": "#ffffff"
}
}
,并且此结构永远不会触发BackgroundMessageHandler。由于以这种方式发送数据,因此只需覆盖变量即可。如果要触发它,则需要像这样发送通知:
{
"from": " ... ",
"collapse_key": "do_not_collapse",
"priority": "high",
"data": {
"id": "111",
"notification": {
"title": "Hi there",
"body": "Message body",
"badge": "1",
"color": "#ffffff"
}
},
"to": "topic",
}