0

0

FCM Cloud Messaging:有效验证和管理设备Token

花韻仙語

花韻仙語

发布时间:2025-08-14 18:42:12

|

229人浏览过

|

来源于php中文网

原创

fcm cloud messaging:有效验证和管理设备token

本文旨在解决在使用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)

Multiavatar
Multiavatar

Multiavatar是一个免费开源的多元文化头像生成器,可以生成高达120亿个虚拟头像

下载

以下是一个使用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();
    }
}

代码解释:

  1. 引入必要的类: 引入了Kreait\Firebase\Factory,Kreait\Firebase\Contract\Messaging以及相关的异常类。
  2. 创建Firebase Messaging实例: 使用Firebase Admin SDK初始化Firebase Messaging服务。需要配置Service Account Credentials。
  3. validate_fcm_token方法:
    • 接收一个包含设备Token的数组作为参数。
    • 检查输入是否为空或者token数组是否为空或者token数组的大小是否超过500。
    • 调用$this->messaging->validateRegistrationTokens($token)方法验证Token。
    • 捕获可能发生的MessagingException或FirebaseException异常。
    • 返回验证结果。
  4. 使用示例:
    • 创建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,可以有效减少不必要的推送尝试,节省资源,并提高整体推送效率。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6220

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

822

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1071

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1367

2024.03.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

360

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2083

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

349

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

256

2023.09.05

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

33

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5.1万人学习

前端工程化(ES6模块化和webpack打包)
前端工程化(ES6模块化和webpack打包)

共24课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号