
本文旨在解决在使用 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 示例代码,帮助开发者构建可靠的推送通知系统。
validateRegistrationTokens 方法允许一次性验证多个 Token,最多支持 500 个。该方法会返回一个包含有效、无效和未知 Token 的结果集。开发者可以根据这些结果更新数据库,移除无效 Token,并处理未知状态的 Token。
以下是一个使用 PHP 和 Firebase Admin SDK 验证 FCM Token 的示例代码:
<?php
use Kreait\Firebase\Factory;
use Kreait\Firebase\Contract\Messaging;
use Kreait\Firebase\Exception\MessagingException;
use Kreait\Firebase\Exception\FirebaseException;
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;
}
?>代码解释:
通过使用 Firebase Admin SDK 提供的 validateRegistrationTokens 方法,可以有效地验证和管理 FCM Token,确保推送通知的准确性和可靠性。开发者可以根据本文提供的示例代码,结合自身的应用场景,构建完善的 Token 验证机制,提升用户体验。 定期执行 Token 验证,清理无效 Token,可以减少无效推送,降低成本,并提高推送效率。
以上就是FCM Token 验证与失效处理:构建可靠的推送通知系统的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号