如何通过FCM向多个选定设备推送消息?
解决FCM向多个特定设备批量推送消息的问题
要实现向多个特定设备推送FCM消息,你需要使用FCM的messages:sendAll接口(而非单个推送的messages:send),该接口支持一次性发送最多500条消息到不同设备。以下是修改后的代码:
public function send_fcm() { $project = "some-project"; require_once 'vendor/autoload.php'; // 初始化Google客户端并获取AccessToken $client = new Google\Client(); $client->setAuthConfig('../menicon_images/some-project-firebase-adminsdk-kgpuf-afs957ea.json'); $client->addScope('https://www.googleapis.com/auth/firebase.messaging'); $result = $client->fetchAccessTokenWithAssertion(); $accessToken = $result["access_token"]; // 替换为批量推送的接口地址 $fcmUrl = 'https://fcm.googleapis.com/v1/projects/'.$project.'/messages:sendAll'; // 通知内容 $notification = [ 'title' => "Some title", 'body' => "Some message", ]; // 要推送的目标设备Token数组 $deviceTokens = [ "token-device-1", "token-device-2", "token-device-3", // 可添加更多token,最多500个 ]; // 构造批量消息数组 $messages = []; foreach ($deviceTokens as $token) { $messages[] = [ 'token' => $token, 'notification' => $notification, // 可选:添加data字段等其他配置 ]; } $fcmNotification = [ 'messages' => $messages ]; $headers = [ 'Authorization: Bearer '.$accessToken, 'Content-Type: application/json' ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $fcmUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fcmNotification)); $result = curl_exec($ch); curl_close($ch); // 可选:处理返回结果 // var_dump(json_decode($result, true)); }
关键修改说明
- 接口地址变更:将原有的
messages:send替换为messages:sendAll,该接口专门用于批量发送消息。 - 消息结构调整:从单个
message字段改为messages数组,每个元素对应一个设备的推送配置(包含该设备的token和统一的通知内容)。 - Token数组处理:通过循环将每个设备token包装成独立的消息对象,放入批量消息数组中。
处理超过500个设备的情况
FCM的sendAll接口单次最多支持500条消息,如果你的目标设备数量超过500,需要将token数组分批处理,示例如下:
// 拆分token数组为每500个一组 $tokenBatches = array_chunk($deviceTokens, 500); foreach ($tokenBatches as $batch) { $messages = []; foreach ($batch as $token) { $messages[] = [ 'token' => $token, 'notification' => $notification, ]; } $fcmNotification = ['messages' => $messages]; // 重复上述curl发送逻辑即可 }
内容的提问来源于stack exchange,提问作者MensinBM
相关产品推荐
相关产品推荐

