首页 > 解决方案 > 如何使“过期”的 Firebase 实例 ID 令牌无效

问题描述

AFAIK,Firebase 实例令牌将在以下 4 个条件下刷新:

  1. 应用删除实例 ID

  2. 应用程序在新设备上恢复

  3. 用户卸载/重新安装应用程序

  4. 用户清除应用数据

假设用户使用令牌 A 作为他的“FCM 地址”。每次他登录应用程序时,他都会将令牌 A 与该用户的 UUID 一起注册到 Firestore,以便可以向他发送用户特定的云消息。当他注销时,系统将向firestore发出请求以删除令牌A记录。

现在,当用户重新安装应用程序时,实例 id 会被刷新并生成一个新的 Token B。令牌 A 变得无用。不幸的是,如果用户在卸载之前没有注销,令牌 A 将永远保留在 Firestore 中。

任何解决方法或更明智的方法来处理这种情况?

标签: firebasefirebase-cloud-messaging

解决方案


使您的令牌注册表保持最新需要两个步骤:

  1. 从您的应用程序代码中删除过时的令牌。
  2. 检查过时的令牌并在发送消息时将其删除。

您删除不再使用的令牌的方法是#1。

第二步是在尝试向其发送消息时收到messaging/invalid-registration-token或响应时从注册表/数据库中删除令牌。functions-samples repomessaging/registration-token-not-registered包含一个很好的例子:

admin.messaging().sendToDevice(tokens, payload).then((response) => {
  // For each message check if there was an error.
  const tokensToRemove = [];
  response.results.forEach((result, index) => {
    const error = result.error;
    if (error) {
      console.error('Failure sending notification to', tokens[index], error);
      // Cleanup the tokens who are not registered anymore.
      if (error.code === 'messaging/invalid-registration-token' ||
          error.code === 'messaging/registration-token-not-registered') {
        // TODO: remove the token from your registry/database
      }
    }
  });
});

上面的代码使用了适用于 Node.js 的 Firebase Admin SDK,但同样的逻辑也可以应用于其他平台或通过 HTTPS 端点发送消息时。


推荐阅读