You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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));
}

关键修改说明

  1. 接口地址变更:将原有的messages:send替换为messages:sendAll,该接口专门用于批量发送消息。
  2. 消息结构调整:从单个message字段改为messages数组,每个元素对应一个设备的推送配置(包含该设备的token和统一的通知内容)。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:40:13