Push notification 更改推送管理器订阅中的应用程序服务器密钥

Push notification 更改推送管理器订阅中的应用程序服务器密钥,push-notification,service-worker,firebase-notifications,Push Notification,Service Worker,Firebase Notifications,我使用服务工作者实现了web推送通知。我使用特定的应用程序服务器密钥收集用户订阅。假设我们更改应用程序服务器密钥,那么当我们使用“reg.pushManager.getSubscription()”获取订阅时,我们将获取使用旧应用程序服务器密钥创建的旧订阅信息。如何处理这种情况?如何从用户处获取新订阅?使用reg.pushManager.getSubscription()获取订阅,并检查当前订阅是否使用新的应用程序服务器密钥。如果没有,则对现有订阅调用unsubscribe()函数,然后再次重新

我使用服务工作者实现了web推送通知。我使用特定的应用程序服务器密钥收集用户订阅。假设我们更改应用程序服务器密钥,那么当我们使用“reg.pushManager.getSubscription()”获取订阅时,我们将获取使用旧应用程序服务器密钥创建的旧订阅信息。如何处理这种情况?如何从用户处获取新订阅?

使用
reg.pushManager.getSubscription()
获取订阅,并检查当前订阅是否使用新的应用程序服务器密钥。如果没有,则对现有订阅调用
unsubscribe()
函数,然后再次重新订阅。

使用
reg.pushManager.getSubscription()
获取订阅,并检查当前订阅是否使用新的应用程序服务器密钥。如果没有,则对现有订阅调用
unsubscribe()
函数,然后再次重新订阅。

正确启动service worker并获得权限后,调用
navigator.serviceWorker.ready
以访问
*.pushManager
对象

从这个对象中,我们调用另一个承诺来获得我们真正关心的
pushSubscription
对象

如果用户从未订阅
pushSubscription
将为
null
,否则我们将从中获取密钥并检查其是否不同,如果是这种情况,我们将取消订阅用户并再次订阅

var NEW_PUBLIC_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
    
Notification.requestPermission(function (result) {
    if (permissionResult == 'granted'){
        subscribeUser();
    }
});
    
function subscribeUser() {
    navigator.serviceWorker.ready
    .then(registration => {
        registration.pushManager.getSubscription()
        .then(pushSubscription => {
            if(!pushSubscription){
                //the user was never subscribed
                subscribe(registration);
            }
            else{
                //check if user was subscribed with a different key
                let json = pushSubscription.toJSON();
                let public_key = json.keys.p256dh;
                
                console.log(public_key);
                
                if(public_key != NEW_PUBLIC_KEY){
                    pushSubscription.unsubscribe().then(successful => {
                        // You've successfully unsubscribed
                        subscribe(registration);
                    }).catch(e => {
                        // Unsubscription failed
                    })
                }
            }
        });
    })
}

function subscribe(registration){
    registration.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: urlBase64ToUint8Array(NEW_PUBLIC_KEY)
    })
    .then(pushSubscription => {
        //successfully subscribed to push
        //save it to your DB etc....
    });
}

function urlBase64ToUint8Array(base64String) {
    var padding = '='.repeat((4 - base64String.length % 4) % 4);
    var base64 = (base64String + padding)
        .replace(/\-/g, '+')
        .replace(/_/g, '/');

    var rawData = window.atob(base64);
    var outputArray = new Uint8Array(rawData.length);

    for (var i = 0; i < rawData.length; ++i) {
        outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
}
var NEW_PUBLIC_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
Notification.requestPermission(函数(结果){
如果(permissionResult==“已授予”){
subscribeUser();
}
});
函数subscribeUser(){
navigator.serviceWorker.ready
。然后(注册=>{
registration.pushManager.getSubscription()
。然后(pushSubscription=>{
如果(!pushSubscription){
//用户从未订阅
认购(注册);
}
否则{
//检查用户是否使用其他密钥订阅
让json=pushSubscription.toJSON();
让public_key=json.keys.p256dh;
console.log(公钥);
if(公钥!=新公钥){
pushSubscription.unsubscripte()。然后(成功=>{
//您已成功取消订阅
认购(注册);
}).catch(e=>{
//取消订阅失败
})
}
}
});
})
}
功能订阅(注册){
registration.pushManager.subscribe({
userVisibleOnly:true,
applicationServerKey:urlBase64ToUint8Array(新的\u公钥)
})
。然后(pushSubscription=>{
//已成功订阅推送
//将其保存到数据库等。。。。
});
}
函数urlBase64ToUint8Array(base64String){
变量padding='='。重复((4-base64String.length%4)%4);
var base64=(base64String+padding)
.替换(/\-/g,“+”)
.替换(/_/g,“/”);
var rawData=window.atob(base64);
var outputArray=新的Uint8Array(rawData.length);
对于(变量i=0;i
正确启动service worker并获得权限后,调用
navigator.serviceWorker.ready
以访问
*.pushManager
对象

从这个对象中,我们调用另一个承诺来获得我们真正关心的
pushSubscription
对象

如果用户从未订阅
pushSubscription
将为
null
,否则我们将从中获取密钥并检查其是否不同,如果是这种情况,我们将取消订阅用户并再次订阅

var NEW_PUBLIC_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
    
Notification.requestPermission(function (result) {
    if (permissionResult == 'granted'){
        subscribeUser();
    }
});
    
function subscribeUser() {
    navigator.serviceWorker.ready
    .then(registration => {
        registration.pushManager.getSubscription()
        .then(pushSubscription => {
            if(!pushSubscription){
                //the user was never subscribed
                subscribe(registration);
            }
            else{
                //check if user was subscribed with a different key
                let json = pushSubscription.toJSON();
                let public_key = json.keys.p256dh;
                
                console.log(public_key);
                
                if(public_key != NEW_PUBLIC_KEY){
                    pushSubscription.unsubscribe().then(successful => {
                        // You've successfully unsubscribed
                        subscribe(registration);
                    }).catch(e => {
                        // Unsubscription failed
                    })
                }
            }
        });
    })
}

function subscribe(registration){
    registration.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: urlBase64ToUint8Array(NEW_PUBLIC_KEY)
    })
    .then(pushSubscription => {
        //successfully subscribed to push
        //save it to your DB etc....
    });
}

function urlBase64ToUint8Array(base64String) {
    var padding = '='.repeat((4 - base64String.length % 4) % 4);
    var base64 = (base64String + padding)
        .replace(/\-/g, '+')
        .replace(/_/g, '/');

    var rawData = window.atob(base64);
    var outputArray = new Uint8Array(rawData.length);

    for (var i = 0; i < rawData.length; ++i) {
        outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
}
var NEW_PUBLIC_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
Notification.requestPermission(函数(结果){
如果(permissionResult==“已授予”){
subscribeUser();
}
});
函数subscribeUser(){
navigator.serviceWorker.ready
。然后(注册=>{
registration.pushManager.getSubscription()
。然后(pushSubscription=>{
如果(!pushSubscription){
//用户从未订阅
认购(注册);
}
否则{
//检查用户是否使用其他密钥订阅
让json=pushSubscription.toJSON();
让public_key=json.keys.p256dh;
console.log(公钥);
if(公钥!=新公钥){
pushSubscription.unsubscripte()。然后(成功=>{
//您已成功取消订阅
认购(注册);
}).catch(e=>{
//取消订阅失败
})
}
}
});
})
}
功能订阅(注册){
registration.pushManager.subscribe({
userVisibleOnly:true,
applicationServerKey:urlBase64ToUint8Array(新的\u公钥)
})
。然后(pushSubscription=>{
//已成功订阅推送
//将其保存到数据库等。。。。
});
}
函数urlBase64ToUint8Array(base64String){
变量padding='='。重复((4-base64String.length%4)%4);
var base64=(base64String+padding)
.替换(/\-/g,“+”)
.替换(/_/g,“/”);
var rawData=window.atob(base64);
var outputArray=新的Uint8Array(rawData.length);
对于(变量i=0;i
check你能证实一下吗?我不能理解