安卓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
相关产品推荐
相关产品推荐

