从数据库中删除不再有效的 FCM 令牌

Removing no longer valid FCM tokens from a database

我正在向我有 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-tokenmessaging/registration-token-not-registered

我建议您的逻辑基于 this code in the functions-samples 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);
        }
      }
    });

错误字段的值与此 link 中的 HTTP 代码列匹配:

https://firebase.google.com/docs/cloud-messaging/http-server-ref#error-codes

示例:InvalidRegistrationNotRegisteredMessageTooBigUnavailable


关于 repo 的问题和响应 https://github.com/ToothlessGear/node-gcm/issues/360