Laravel中使用google/apiclient单次请求推送通知至多设备
Laravel中通过Google API Client实现FCM单次请求多设备推送
我已经在Laravel项目中集成了google/apiclient,需要实现单次请求向多个设备发送FCM推送通知,不想用foreach循环为每个设备token单独创建请求。现有单设备推送代码和循环推送的代码,但循环方式会产生大量请求,求更优的解决方案。
单设备推送代码
$notification = new Notification([ 'title' => $data['title'], 'body' => $data['message'] ]); $message = new Message([ 'notification' => $notification, 'data' => $data, 'token' => $token ]); $request = new FirebaseCloudMessaging\SendMessageRequest(); $request->setMessage($message); $messaging = new FirebaseCloudMessaging($this->client); $response = $messaging->projects_messages->send('projects/my-project', $request);
不推荐的循环推送方式
foreach ($tokens as $token){ $message = new Message([ 'notification' => $notification, 'data' => $data, 'token' => $token ]); $request = new FirebaseCloudMessaging\SendMessageRequest(); $request->setMessage($message); $messaging = new FirebaseCloudMessaging($this->client); $response = $messaging->projects_messages->send('projects/my-project', $request); }
解决方案:使用FCM Multicast消息(单次请求推多设备)
FCM官方支持通过tokens参数批量传入设备token数组,实现单次请求推送至多个设备,具体修改如下:
修改后的代码
$notification = new Notification([ 'title' => $data['title'], 'body' => $data['message'] ]); // 用tokens参数替代单个token,传入多设备token数组 $message = new Message([ 'notification' => $notification, 'data' => $data, 'tokens' => $tokens // 这里传入你的设备token数组 ]); $request = new FirebaseCloudMessaging\SendMessageRequest(); $request->setMessage($message); $messaging = new FirebaseCloudMessaging($this->client); // 单次请求完成多设备推送 $response = $messaging->projects_messages->send('projects/my-project', $request);
注意事项
- 单次Multicast消息最多支持500个设备token,如果你的token数组长度超过500,需要用
array_chunk分割成每500个一组,再循环发送每组(每组仍是单次请求):$tokenGroups = array_chunk($tokens, 500); foreach ($tokenGroups as $group) { $message = new Message([ 'notification' => $notification, 'data' => $data, 'tokens' => $group ]); $request = new FirebaseCloudMessaging\SendMessageRequest(); $request->setMessage($message); $response = $messaging->projects_messages->send('projects/my-project', $request); // 可在此处理每组的推送结果 } - 推送响应中会包含每个设备的推送状态,可解析
$response来排查无效token或推送失败的情况。
内容的提问来源于stack exchange,提问作者Shriyank
相关产品推荐
相关产品推荐

