
本文旨在解决在使用Firebase Cloud Messaging (FCM)进行推送通知时,如何有效验证和管理设备Token的问题。当用户通过非应用内的方式取消订阅通知时,服务器无法立即得知,导致数据库中残留无效Token。本文将介绍如何使用Firebase Admin SDK提供的validateRegistrationTokens方法批量验证Token,并清理数据库中无效的Token,确保推送的有效性和用户体验。
在使用FCM进行推送通知时,一个常见的问题是如何处理无效的设备Token。用户可能通过多种方式取消订阅通知,例如在浏览器设置中禁用通知,或者卸载应用程序。这些操作不会直接通知你的服务器,导致数据库中可能存在大量无效的Token。向这些无效Token发送推送消息会浪费资源,并且可能影响推送的送达率。
Firebase Admin SDK提供了一个强大的工具来解决这个问题:validateRegistrationTokens方法。这个方法允许你批量验证设备Token的有效性,并识别出无效的Token,以便你可以从数据库中删除它们。
批量验证Token
validateRegistrationTokens方法接受一个包含设备Token的数组作为参数,并返回一个包含验证结果的对象。该对象将Token分为三类:
- valid: 有效的Token,可以正常接收推送消息。
- invalid: 无效的Token,无法接收推送消息。这些Token应该从数据库中删除。
- unknown: 无法确定有效性的Token。这些Token可能需要进一步调查。
示例代码(PHP)
以下是一个使用PHP Firebase Admin SDK验证Token的示例代码:
use Kreait/Firebase/Factory;
use Kreait/Firebase/Contract/Messaging;
use Kreait/Firebase/Exception/MessagingException;
use Kreait/Firebase/Exception/FirebaseException;
class SomeController {
/** 构造函数 */
public function __construct() {
$factory = (new Factory)->withServiceAccount(getenv('GOOGLE_APPLICATION_CREDENTIALS'));
$this->messaging = $factory->createMessaging();
}
/**
* 验证设备注册ID.
*
* @param string|string[] $token 单个token或token数组
* @return array|bool|Exception|MessagingException|FirebaseException 验证结果.
*/
public function validate_fcm_token( string|array $token=[] ): bool|Exception|MessagingException|array|FirebaseException {
if ($token == null|| is_array($token) && (sizeof($token) === 0 || sizeof($token) > 500)) {return false;}
else if (is_string($token)) {$token = [ $token ];}
try {
return $this->messaging->validateRegistrationTokens($token);
} catch ( MessagingException | FirebaseException $e ) {
return $e;
}
}
}
// 使用示例:
$controller = new SomeController();
$tokens = [
'valid_token_1',
'invalid_token_1',
'valid_token_2',
'invalid_token_2',
// ...
];
$results = $controller->validate_fcm_token($tokens);
if (is_array($results) && isset($results['invalid'])) {
$invalidTokens = $results['invalid'];
foreach ($invalidTokens as $invalidToken) {
// 从数据库中删除无效的Token
echo "Invalid token: " . $invalidToken . "/n";
// 在此处添加删除数据库记录的逻辑
}
} else {
// 处理错误情况
echo "Error validating tokens./n";
if ($results instanceof Exception) {
echo $results->getMessage();
}
}
代码解释:
- 引入必要的类: 引入了Kreait/Firebase/Factory,Kreait/Firebase/Contract/Messaging以及相关的异常类。
- 创建Firebase Messaging实例: 使用Firebase Admin SDK初始化Firebase Messaging服务。需要配置Service Account Credentials。
-
validate_fcm_token方法:
- 接收一个包含设备Token的数组作为参数。
- 检查输入是否为空或者token数组是否为空或者token数组的大小是否超过500。
- 调用$this->messaging->validateRegistrationTokens($token)方法验证Token。
- 捕获可能发生的MessagingException或FirebaseException异常。
- 返回验证结果。
-
使用示例:
- 创建SomeController实例。
- 定义一个包含需要验证的Token的数组$tokens。
- 调用validate_fcm_token方法验证Token。
- 检查返回结果,如果存在invalid数组,则遍历该数组,并从数据库中删除相应的Token。
- 处理可能发生的错误情况。
注意事项:
- 批量大小限制: validateRegistrationTokens方法一次最多可以验证500个Token。如果你的数据库中存在大量的Token,你需要将它们分成多个批次进行验证。
- 频率限制: 为了防止滥用,Firebase可能会对validateRegistrationTokens方法的调用频率进行限制。请确保你的代码遵循这些限制。
- 错误处理: 在调用validateRegistrationTokens方法时,可能会发生各种错误,例如网络错误或服务器错误。请确保你的代码能够正确处理这些错误。
- 定期执行: 建议你定期执行Token验证,例如每天或每周一次,以确保数据库中的Token始终保持最新状态。
- 安全性: 保护好你的Service Account Credentials,避免泄露,防止未经授权的访问。
总结:
通过使用Firebase Admin SDK提供的validateRegistrationTokens方法,你可以有效地验证和管理设备Token,清理数据库中无效的Token,提高推送的有效性和用户体验。请务必注意批量大小限制、频率限制和错误处理,并定期执行Token验证。 通过定期清理无效token,可以有效减少不必要的推送尝试,节省资源,并提高整体推送效率。
以上就是FCM Cloud Messaging:有效验证和管理设备Token的详细内容,更多请关注php中文网其它相关文章!