我正在向我有fcm令牌的移动设备发送通知。在发送时,我会得到一个响应,每个fcm令牌都有一个错误。我想删除那些肯定不再有效的无效令牌,但保留这次可能失败的令牌,这些令牌将来可能仍然有效。
我使用的是node-gcm
软件包。
每个令牌的响应中error
字段的可能值是什么。为了只删除永久无效的令牌,我应该对此值进行哪些检查?
sender.send(gcmMessage, { registrationTokens: fcmTokens }, (error, response) => {
if (error) {
console.log(error);
} else {
const failedTokens = fcmTokens.filter((_, index) => response.results[index].error != null);
if (failedTokens.length) {
// If there are failed tokens, check these to know whether we should delete them.
this.clearUserFcmTokens(userID, failedTokens);
}
}
});
指示应该删除令牌的两个最常见的错误代码是messaging/invalid-registration-token
和messaging/registration-token-not-registered
。
我建议您的逻辑基于函数示例repo中的这段代码。
我从repo本身得到了答案。
他们建议检查错误是否与'NotRegistered'
匹配。
我修改了代码以检查'NotRegistered'
和'InvalidRegistration'
:
sender.send(gcmMessage, { registrationTokens: fcmTokens }, (error, response) => {
if (error) {
console.log(error);
} else {
const invalidTokenErrorKeys = ['NotRegistered', 'InvalidRegistration'];
const failedTokens = fcmTokens.filter((_, index) => response.results[index].error != null && invalidTokenErrorKeys.includes(response.results[index].error));
if (failedTokens.length) {
this.clearUserFcmTokens(userID, failedTokens);
}
}
});
错误字段的值与此链接中的HTTP代码列匹配:
https://firebase.google.com/docs/cloud-messaging/http-server-ref#error-编码
示例:InvalidRegistration
、NotRegistered
、MessageTooBig
、Unavailable
等
回购的发行和响应https://github.com/ToothlessGear/node-gcm/issues/360