我有一个Django项目,我使用Firebase云消息来启动推送通知。这是我的代码:
的index.html
<script>
var config = {
// ...
};
firebase.initializeApp(config);
const messaging = firebase.messaging();
navigator.serviceWorker.register('/static/firebase-messaging-sw.js').then((registration) => {
messaging.useServiceWorker(registration);
messaging.requestPermission().then(function() {
console.log('Notification permission granted.');
return messaging.getToken();
}).then(function(token){
$.post('/a_send_fcm_token/', {'fcm_token_web': token});
}).catch(function(err){
console.log('Error ocurred');
});
});
messaging.onMessage(function(payload) {
console.log('Hoorah'); // does not work :(
});
</script>
由于Django项目布局有一定的特殊性,我在上面的代码中使用navigator.serviceWorker.register()
函数来更改firebase-messaging-sw.js
文件的默认位置,否则该位置将位于项目的根目录中。
我的firebase-messaging-sw.js
看起来像这样:
importScripts('https://www.gstatic.com/firebasejs/4.1.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/4.1.2/firebase-messaging.js');
var config = {
// ...
};
firebase.initializeApp(config);
const messaging = firebase.messaging();
最后,我的Django视图向FCM发布了消息:
headers = {'Authorization': "key=AAAA7oE3MjY:APA91bE_M....",
'Content-type': 'application/json'}
token = ...
payload = json.dumps({"notification": {}, "token": token})
r = requests.post("https://fcm.googleapis.com/fcm/send", data=payload, headers=headers)
return True
似乎我已经正确实现了大部分内容,因为我成功从FCM获取令牌。但我无法抓住messaging.onMessage()
中的消息。它不会触发。
问题是:
为什么我的messaging.onMessage()
无效?