【发布时间】:2018-01-11 22:47:56
【问题描述】:
到目前为止,我已经使用 service worker、app manifest 和 fire-base 为我的 Angular 应用创建了推送通知服务。
我正在获取服务器密钥和 sender_id。我正在注册我的 service worker 并订阅 push_messenger。
我也在使用 google 本地服务器扩展程序 来托管我的服务器。
main.ts
Notification.requestPermission(function (status) {
console.log('Notification permission status:', status);
});
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('./service-worker.js', { scope: './' }).then(function (registration) {
// Registration was successful
console.log('ServiceWorker registration successful with scope: ', registration.scope);
console.log('registration: ', (registration));
navigator.serviceWorker.ready.then(reg => {
reg.pushManager.getSubscription().then(sub => {
if (sub == undefined) {
console.log('sub : ' + 'undefined');
navigator.serviceWorker.getRegistration().then((reg) => {
reg.pushManager.subscribe({
userVisibleOnly: true
}).then(sub => {
console.log('sub : ' + JSON.stringify(sub));
localStorage.setItem("sub", JSON.stringify(sub));
}, err => {
console.log('registration error occured: ' + err);
})
}, err => {
console.log('registration error occured: ' + err);
})
} else {
console.log('sub : ' + sub);
// subs = sub;
localStorage.setItem("sub", JSON.stringify(sub));
}
}, err => {
console.log('registration error occured: ' + err);
});
})
}).catch(function (err) {
// registration failed :(
console.log('ServiceWorker registration failed: ', err);
});
}
service-worker.js
self.addEventListener('notificationclose', function(e) {
var notification = e.notification;
var primaryKey = notification.data.primaryKey;
console.log('Closed notification: ' + primaryKey);
});
self.addEventListener('notificationclick', function(e) {
var notification = e.notification;
var primaryKey = notification.data.primaryKey;
var action = e.action;
if (action === 'close') {
notification.close();
} else {
clients.openWindow('samples/page' + primaryKey + '.html');
notification.close();
}
// TODO - close all notifications when one is clicked
});
self.addEventListener('push', function(e) {
var body;
if (e.data) {
body = e.data.text();
} else {
body = 'Push message no payload';
}
var options = {
body: body,
icon: 'images/notification-flat.png',
vibrate: [100, 50, 100],
data: {
dateOfArrival: Date.now(),
primaryKey: 1
},
actions: [
{action: 'explore', title: 'Explore this new world',
icon: 'images/checkmark.png'},
{action: 'close', title: "I don't want any of this",
icon: 'images/xmark.png'},
]
};
e.waitUntil(
self.registration.showNotification('Push Notification', options)
);
});
节点服务器
var webPush = require('web-push');
var pushSubscription = {<subscription object>}
};
var payload = 'Sup Dude!';
var options = {
gcmAPIKey: *<server key>*,
TTL: 60,
};
webPush.sendNotification(
pushSubscription,
payload,
options
);
在上面的 main.ts 中,我能够在应用初始化时获得 subscription 对象。并且能够在那一刻发送推送通知。但是当我从 chrome 打开这个相同的服务器 IP 时,我得到了一个不同的 订阅对象。有时我也会使用 chrome 获得不同的 订阅对象。
问题是我如何为所有用户发送推送通知,因为 订阅对象 会随着时间和浏览器的不同而不同。 (不能将所有数据存储到数据库中,这将是过多的存储量)
【问题讨论】:
标签: node.js angular firebase firebase-cloud-messaging firebase-notifications