boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

FCM Token 验证与失效处理:构建可靠的推送通知系统


avatar
站长 2025年8月14日 1

FCM Token 验证与失效处理:构建可靠的推送通知系统

本文旨在解决在使用 Firebase Cloud Messaging (FCM) 构建 Web 应用时,如何有效验证和管理设备 Token 的问题。当用户在客户端自行取消订阅推送通知,而服务端未能及时同步状态时,会导致数据库中存在无效 Token。本文将介绍如何使用 Firebase Admin SDK 提供的 validateRegistrationTokens 方法批量验证 Token,并清理数据库中的无效条目,从而确保推送通知的准确性和有效性。

在使用 Firebase Cloud Messaging (FCM) 构建 Web 应用时,一个常见的问题是用户可能在客户端(例如 Chrome 或 Firefox)取消订阅推送通知,而服务端却无法立即得知这一变化。这会导致数据库中存储了无效的 FCM Token,进而影响推送通知的准确性和效率。为了解决这个问题,我们需要定期验证数据库中的 Token,并移除无效的条目。

Firebase Admin SDK 提供了一个强大的方法 validateRegistrationTokens,可以批量验证 FCM Token 的有效性。本文将详细介绍如何使用此方法,并提供一个 PHP 示例代码,帮助开发者构建可靠的推送通知系统。

批量验证 FCM Token

validateRegistrationTokens 方法允许一次性验证多个 Token,最多支持 500 个。该方法会返回一个包含有效、无效和未知 Token 的结果集。开发者可以根据这些结果更新数据库,移除无效 Token,并处理未知状态的 Token。

PHP 示例代码

以下是一个使用 PHP 和 Firebase Admin SDK 验证 FCM Token 的示例代码:

<?php  use KreaitFirebaseFactory; use KreaitFirebaseContractMessaging; use KreaitFirebaseExceptionMessagingException; use KreaitFirebaseExceptionFirebaseException;  class FCMTokenValidator {      private Messaging $messaging;      /**      * 构造函数      */     public function __construct() {         $factory = (new Factory)->withServiceAccount(getenv('GOOGLE_APPLICATION_CREDENTIALS'));         $this->messaging = $factory->createMessaging();     }      /**      * 验证设备注册 ID.      *      * @param string|string[] $token 要验证的 Token,可以是单个字符串或字符串数组      * @return array|bool|Exception|MessagingException|FirebaseException 验证结果      */     public function validateFCMToken( string|array $token=[] ): bool|Exception|MessagingException|array|FirebaseException {         if ($token == null || is_array($token) && (sizeof($token) === 0 || sizeof($token) > 500)) {             return false; // Token 为空或数量超出限制         } elseif (is_string($token)) {             $token = [ $token ]; // 将单个 Token 转换为数组         }          try {             return $this->messaging->validateRegistrationTokens($token);         } catch ( MessagingException | FirebaseException $e ) {             return $e; // 捕获并返回异常         }     } }  // 使用示例: $validator = new FCMTokenValidator(); $tokens = [     'valid_token_1',     'invalid_token_1',     'valid_token_2',     'invalid_token_2',     // ... up to 500 tokens ];  $validationResult = $validator->validateFCMToken($tokens);  if (is_array($validationResult)) {     // 处理验证结果     if (isset($validationResult['invalid'])) {         $invalidTokens = $validationResult['invalid'];         // 从数据库中删除这些无效 Token         foreach ($invalidTokens as $invalidToken) {             // 数据库删除逻辑             echo "Invalid token: " . $invalidToken . PHP_EOL;         }     }      if (isset($validationResult['valid'])) {         $validTokens = $validationResult['valid'];         // 可以选择更新这些有效 Token 的最后活跃时间         foreach ($validTokens as $validToken) {             // 数据库更新逻辑             echo "Valid token: " . $validToken . PHP_EOL;         }     }      if (isset($validationResult['unknown'])) {         $unknownTokens = $validationResult['unknown'];         // 对于未知状态的 Token,可以进行重试或进一步调查         foreach ($unknownTokens as $unknownToken) {             echo "Unknown token: " . $unknownToken . PHP_EOL;         }     }  } else {     // 处理异常     echo "Error: " . $validationResult->getMessage() . PHP_EOL; }  ?>

代码解释:

  1. 引入依赖: 引入 Firebase Admin SDK 相关的类。
  2. 创建 FCMTokenValidator 类: 封装 Token 验证的逻辑。
  3. 构造函数: 初始化 Firebase Messaging 客户端。
  4. validateFCMToken 方法:
    • 接收一个 Token 数组作为参数。
    • 验证 Token 数组的大小是否符合要求 (0
    • 调用 $this->messaging->validateRegistrationTokens() 方法进行批量验证。
    • 捕获并处理可能出现的异常。
  5. 使用示例:
    • 创建 FCMTokenValidator 实例。
    • 准备要验证的 Token 数组。
    • 调用 validateFCMToken 方法进行验证。
    • 根据验证结果,从数据库中删除无效 Token,更新有效 Token,并处理未知状态的 Token。

注意事项

  • 安全性: 确保 Firebase Admin SDK 的 Service Account 凭据安全存储,避免泄露。
  • 频率控制: 不要过于频繁地验证 Token,以免对 FCM 服务造成不必要的压力。建议根据应用的实际情况,设置合理的验证周期。
  • 错误处理: 在验证过程中,可能会遇到各种错误,例如网络问题、权限问题等。务必进行充分的错误处理,确保程序的健壮性。
  • 批量大小: validateRegistrationTokens 方法一次最多只能验证 500 个 Token。如果数据库中的 Token 数量超过 500,需要分批进行验证。
  • 数据库操作: 在删除或更新数据库中的 Token 时,务必谨慎操作,避免误删或数据不一致的情况。

总结

通过使用 Firebase Admin SDK 提供的 validateRegistrationTokens 方法,可以有效地验证和管理 FCM Token,确保推送通知的准确性和可靠性。开发者可以根据本文提供的示例代码,结合自身的应用场景,构建完善的 Token 验证机制,提升用户体验。 定期执行 Token 验证,清理无效 Token,可以减少无效推送,降低成本,并提高推送效率。



评论(已关闭)

评论已关闭