还有另一种方法可以使用 Cloud Firebase Functions 解决此问题。
我将如何区分要更改的令牌,因为所有人都属于
给同一个用户?
使用 Firebase 函数,您不必这样做。在 onTokenRefresh() 中,您将新令牌发送到服务器。
例如:
用户有 3 台设备,每台设备都有一个已发送到服务器的令牌。
*** deviceTokenA/B/C 代表令牌的 UID……我们不知道它们是什么,也不知道它们属于哪个设备。
UserId:
Device Tokens:
deviceTokenA: true,
deviceTokenB: true,
deviceTokenC: true,
现在,用户在触发 deviceTokenA 的设备上。刷新令牌,并调用 onTokenRefresh(),将令牌发送到该集合。
onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
sendTokenToServer(refreshedToken);
}
sendTokenToServer(String refreshedToken) {
// send to Firebase or Firestore Database, put in the Device_Tokens collection. }
现在,您将在集合中拥有 4 个令牌。
UserId:
Device Tokens:
deviceTokenA: true, // this one has been "unregistered"
deviceTokenB: true,
deviceTokenC: true,
deviceTokenD: true, // this one has been registered.
deviceTokenA 不再适用,因为它已被刷新,并且不再附加到实际设备。
在查看设备Token时,我们仍然不知道哪些是好的,哪些是坏的,哪些令牌属于哪个设备。没关系!
那么,然后创建一个forEach循环,获取每个Token,然后给这些Token中的每一个发送一个FCM,FCM可以让我们知道哪些token发送成功了。其中之一将返回错误。如果它返回一个错误,说明令牌是错误的,我们可以捕获错误并删除该令牌,因此不会再次调用它。
// outside for Each loop
var promiseHolder = [];
// create a forEach loop, iterating through the collection of deviceTokens
// within that loop, put:
let innerPromise = admin.messaging().send(message)
.then(response => {
console.log('notification sent success: ' + response);
})
.catch((error) => {
console.log('Error sending notification: ' + error);
// if the error == bad token message, then Delete the Token.
if (error == 'Error: Requested entity was not found.') {
console.log('you matched the error, token doesn't work, handle here.');
//delete the old token
return admin.firestore()doc(`users/${userID}/device_tokens/${token_id}`).delete();
}
}
// still within forEach loop
promiseHolder.push(innerPromise);
// end the forEach Loop, and outside forEachLoop put:
return Promise.all(promiseHolder);