如何将数据库查询结果序列化为FCM推送数据并解决LaravelFCM发送报错
问题原因
你遇到的报错由两个错误导致:
- 调用
FCM::sendToTopic方法时,第四个参数传入了数据库查询得到的原始索引数组,没有使用PayloadDataBuilder构建的标准数据载荷 - FCM推送的data字段顶层必须是关联数组(键值对结构),你直接传入多条记录组成的索引数组不符合接口要求
解决方法
首先将查询到的列表数据包装为关联数组的自定义字段,再正确构建载荷发送即可,修正后的代码如下:
use App\Model\MyModel; use LaravelFCM\Message\PayloadDataBuilder; use LaravelFCM\Message\PayloadNotificationBuilder; use LaravelFCM\Facades\FCM; use LaravelFCM\Message\Topics; // 注意补充这个命名空间引入 // 其他逻辑代码 // 查询数据库得到列表数据 $listData = MyModel::where('foreign_table_id', $id)->select('col1','col2','col3')->get()->toArray(); // 包装为顶层是关联数组的结构,自定义字段items存储列表 $wrapData = [ 'items' => $listData, 'count' => count($listData) // 可按需添加其他自定义字段 ]; // 构建data载荷 $dataBuilder = new PayloadDataBuilder(); $dataBuilder->addData($wrapData); $dataPayload = $dataBuilder->build(); // 构建主题(注意变量名统一,原代码中定义的$fcmTopic后续调用时误写为$topic会导致变量未定义) $fcmTopic = new Topics(); $fcmTopic->topic('lorem_ipsum'); // 构建通知 $title = __('pn_title',['client' => 'JohnDOE']); $notificationBuilder = new PayloadNotificationBuilder($title); $notification = $notificationBuilder->build(); // 发送推送,传入构建好的data载荷和正确的主题变量 $status = FCM::sendToTopic($fcmTopic, null, $notification, $dataPayload);
安卓端接收说明
安卓应用收到推送后,从data字段中取出items字段解析,即可得到完整的数据库查询记录列表。
注意事项
FCM单条推送的总载荷大小不能超过4KB,如果查询的数据量较大,不建议直接通过推送传输全量数据,改为推送提醒告知端有新数据,由端主动调用接口拉取数据更稳妥。
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas
相关产品推荐
相关产品推荐

