使用Cloud Firebase Functions有另一种解决问题的方法。
“我如何区分要更改哪个令牌,因为所有令牌都属于同一用户?”
使用Firebase Functions,您不需要。在onTokenRefresh()中,您可以将新令牌发送到服务器。
例如:
用户拥有3台设备,每台设备都有一个已发送到服务器的令牌。
*** deviceTokenA/B/C代表令牌的UID...我们不知道它们是什么,也不知道它们属于哪个设备。
UserId:
Device Tokens:
deviceTokenA: true,
deviceTokenB: true,
deviceTokenC: true,
现在,用户正在触发设备TokenA上。Token已经更新,onTokenRefresh()被调用,并将Token发送到该集合。
onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
sendTokenToServer(refreshedToken);
}
sendTokenToServer(String refreshedToken) {
现在,您的集合中将有4个令牌。
UserId:
Device Tokens:
deviceTokenA: true, // this one has been "unregistered"
deviceTokenB: true,
deviceTokenC: true,
deviceTokenD: true, // this one has been registered.
由于已经刷新,设备标记A不再适用于实际设备。
在查看设备标记时,我们仍然不知道哪些标记可用,哪些是无效的,以及哪些标记属于哪个设备。这没关系!
因此,创建一个forEach循环,获取每个标记,然后向每个标记发送FCM,FCM可以让我们知道哪些标记已成功发送。其中一个将返回错误。如果返回错误,说明标记无效,我们可以捕获该错误并删除该标记,以便不会再次调用它。
var promiseHolder = [];
let innerPromise = admin.messaging().send(message)
.then(response => {
console.log('notification sent success: ' + response);
})
.catch((error) => {
console.log('Error sending notification: ' + error);
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);
admin.firestore()
后面缺少了一个.
,并且在.catch
语句的末尾还缺少了一个)
。没有这些代码,我的程序无法正常运行。 - siefix