【发布时间】:2020-04-01 15:14:09
【问题描述】:
我正在开发一个以 firebase 作为后端的 reactJS 网站。我为用户提供的主要服务之一是每天通知。我已经实现了一个请求许可的代码,如果他们授予访问权限,则将它们存储到我的数据库中。但过了一段时间我注意到令牌即将到期。我对它进行了研究,发现了 onTokenRefresh() 方法。我也实现了。但我相信由于某种原因,它无法正常工作。如果令牌已过期,我将不会获得新令牌。我将在下面粘贴我要执行的操作的 sn-p。
在主页上,
if (!("Notification" in window)) {
//alert("This browser does not support desktop notification");
}
// Check whether notification permissions have already been granted
else if (Notification.permission === "granted") {
// Refresh logic here
this.checkForRefreshToken();
}
// Otherwise, ask the user for permission
else if (Notification.permission !== "denied") {
//Ask user here, then call another function for storing token
this.addNewToken()
}
如果用户是第一次接受通知,我调用 addNewToken() 方法
addNewToken = () => {
this.auth.onAuthStateChanged(authUser => {
const messaging = firebase.messaging();
messaging
.requestPermission()
.then(() => {
return messaging.getToken();
})
.then(token => {
firebase.database().ref('tokens').once('value')
.then(snapshots => {
let tokenExist = false
snapshots.forEach(childSnapshot => {
// console.log("Child snapshot: ", childSnapshot.key);
if (childSnapshot.val().token === token) {
tokenExist = true
return console.log('Device already registered.');
}
})
if (!tokenExist) {
// console.log('Device subscribed successfully');
return firebase.database().ref('tokens').push(token);
}
})
})
.catch(error => {
if (error.code === "messaging/permission-blocked") {
// console.log("Please Unblock Notification Request Manually");
} else {
// console.log("Error Occurred", error);
}
});
})
}
现在如果用户已经订阅,我正在检查是否调用了 onTokenRefresh(),基本上是如果令牌需要刷新。
checkForRefreshToken = () => {
this.auth.onAuthStateChanged(authUser => {
const messaging = firebase.messaging();
messaging.onTokenRefresh(() => {
messaging.getToken().then((refreshedToken) => {
const token = refreshedToken;
firebase.database().ref('tokens').once('value')
.then(snapshots => {
let tokenExist = false
snapshots.forEach(childSnapshot => {
if (childSnapshot.val().token === token) {
tokenExist = true
return console.log('Device already registered.');
}
})
if (!tokenExist) {
return firebase.database().ref('device_ids').push(token);
}
})
})
})
})
}
我不知道这里出了什么问题,但我无法获得新令牌。
出于测试目的,我有自己的设备,其令牌已过期,我部署了此代码并在设备上打开了我的网站,刷新了页面等,但我没有得到新的令牌。
另外,如果有人能帮助我如何在本地测试过期的令牌,那就太好了。 我为应用找到了不同的方法,但对于网站 (javascript) 却没有。
谢谢
【问题讨论】:
标签: javascript reactjs firebase firebase-realtime-database firebase-cloud-messaging