几年前,我通过在Firebase上注册应用程序,并使用注册号作为服务器端应用程序上manifest.json文件的一部分,在我正在处理的项目上实现了与服务工作者的推送通知。在这种情况下,我请求用户允许通知,浏览器注册一次,保存在服务器端,一切正常。
我现在正在尝试实现类似的解决方案,但使用VAPID(https://developers.google.com/web/ilt/pwa/introduction-to-push-notifications#using_vapid)。 浏览器正确注册,将注册发送到服务器端应用程序,应用程序可以发送推送通知。 我得到的问题是,至少24小时后,当我尝试向已注册的订阅发送推送通知时,我收到InvalidSubscription响应(410 NotRegistered)。 使用VAPID,几小时后浏览器注册是否会过期?每隔一定时间我是否需要重新注册?如果有,怎么样?例如,如果用户从未在一天左右的时间内重新访问该网站,我如何能够继续向他们发送通知?对于我遇到的这个问题,我找不到任何明确的参考。
这是我在SW中用来获取浏览器注册的JS代码:
function postPushReg(sub){
var rawKey = sub.getKey ? sub.getKey('p256dh') : '';
var key = rawKey ?
btoa(String.fromCharCode.apply(null, new Uint8Array(rawKey))) :
'';
var rawAuthSecret = sub.getKey ? sub.getKey('auth') : '';
var authSecret = rawAuthSecret ?
btoa(String.fromCharCode.apply(null, new Uint8Array(rawAuthSecret))) :
'';
fetch('https://XXXXX', {
method: 'post',
headers: {'Content-type': 'application/json'},
body: JSON.stringify({endpoint: sub.endpoint, key: key, authSecret: authSecret}),
});
}
self.addEventListener('install', function(event){
self.registration.pushManager.getSubscription()
.then(function(sub){
if (sub) return postPushReg(sub);
return self.registration.pushManager.subscribe({userVisibleOnly: true,
applicationServerKey: urlB64ToUint8Array('XXX')})
.then(function(sub){
postPushReg(sub);
});
});
});
self.addEventListener('push', function(e){
...
});
这是我用来发送通知的Rails / Ruby服务器端gem(webpush):
Webpush.payload_send(
message: "msg",
endpoint: j['endpoint'],
p256dh: j['key'],
auth: j['authSecret'],
vapid: {
subject: "mailto:XXXX",
public_key: "XXX",
private_key: "XXX",
}
)
同样,在最初几个小时内一切正常,然后我得到410 NotRegistered响应。
答案 0 :(得分:0)
尝试在此处发布的相同建议:Web Push with VAPID: 400/401 Unauthorized Registration,现在工作正常。我只在浏览器注册一次,2天后它仍然可以正常工作