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

安卓GCM推送通知:新通知接收时替换旧通知的解决方案求助

解决GCM推送通知被旧通知替换的问题

嘿,我一眼就看出问题所在啦!你遇到的新通知被旧通知覆盖的情况,是因为GCM(现在其实已经升级为FCM了)默认会把具有相同collapse_key或者未指定唯一通知标识的消息合并替换掉。下面给你具体的解决方案和修改后的代码:

问题根源

当你发送通知消息(直接在payload里包含notification字段)时,如果没有指定tag参数,Android系统会默认用同一个通知ID来展示所有通知,新的就会覆盖旧的;另外如果设置了重复的collapse_key,也会导致相同key的消息被合并。

解决方案

这里给你两种最直接的解决方式:

方式1:给通知添加唯一的tag(推荐)

在你的推送payload里加入tag字段,每个通知用不同的唯一值(比如UUID、时间戳或者业务ID),这样Android系统会把它们当作不同的通知展示,不会覆盖。

方式2:发送数据消息,让客户端自主控制通知

把推送内容放在data字段里,而不是notification字段,这样客户端收到消息后,可以自己创建通知并指定唯一的通知ID,完全掌控展示逻辑。

修改后的代码示例

下面是用方式1修改后的PHP代码,我给你补全了关键部分:

<?php
// API access key from Google API's Console
function sendNotification($token, $message) {
    $url = 'https://android.googleapis.com/gcm/send';
    
    // 生成唯一的tag,这里用时间戳+随机数保证唯一性
    $uniqueTag = time() . rand(1000, 9999);
    
    $msg = array(
        'body' => $message,
        'title' => '你的通知标题', // 补全你的标题内容
        'tag' => $uniqueTag // 关键:添加唯一tag,避免通知被覆盖
    );
    
    $fields = array(
        'to' => $token,
        'notification' => $msg,
        // 如果不需要合并消息,可以去掉collapse_key,或者每次设置不同的值
        // 'collapse_key' => 'your_collapse_key'
    );
    
    $headers = array(
        'Authorization: key=YOUR_GCM_API_KEY', // 替换成你的API密钥
        'Content-Type: application/json'
    );
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    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($fields));
    
    $result = curl_exec($ch);
    if ($result === FALSE) {
        die('Curl failed: ' . curl_error($ch));
    }
    curl_close($ch);
    return $result;
}
?>

额外说明

  • 如果用方式2,你需要把$fields里的notification换成data,比如:

    $fields = array(
        'to' => $token,
        'data' => array(
            'body' => $message,
            'title' => '你的通知标题',
            'unique_id' => $uniqueTag // 给客户端传唯一标识,用于创建通知时指定ID
        )
    );
    

    然后在Android客户端的onMessageReceived方法里,用这个unique_id作为通知ID来创建通知。

  • 另外,建议你升级到FCM的API(https://fcm.googleapis.com/fcm/send),GCM已经被弃用了,FCM功能更完善。

内容的提问来源于stack exchange,提问作者Rijwandeltax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:52:13