从GCM获得多个通知

我使用PHP一次在多个Android设备上发送通知。 所有注册ID都是唯一的,以下是我发送的CURL请求。

$url='https://android.googleapis.com/gcm/send'; $headers = array( 'Authorization: key=' . ANDROID_KEY, 'Content-Type: application/json' ); $registration_ids = [];//with multiple registration ids $notification = array( 'registration_ids' => $registration_ids, 'data' => array('notification_id' => $data['notification_id'], 'title' => $data['title'], 'message' => $data['message']) ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($notification)); $res = curl_exec($ch); 

多次调试后,我在同一台设备上找不到任何多次通知的原因(超过10次)。

有没有办法检查GCM收到的请求的日志。 任何领导将不胜感激。

在代码末尾添加

 echo json_encode($res); 

并查看CGM的结果。 也许你可以在那里看到结果,如果仍然是个问题,请将其粘贴到此处。

试试下面的代码。 我已经使用过这个并完美地工作:

 $registrationIDs[] = array();//All device tokens // Set POST variables $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => $registrationIDs, 'data' => $param, ); $headers = array( 'Authorization: key=' . $apiKey, // ANDROID PUSH NOTIFICATION API KEY; 'Content-Type: application/json' ); // Open connection $ch = curl_init(); // Set the url, number of POST vars, POST data 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_POSTFIELDS, json_encode($fields)); // Execute post $result = curl_exec($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } else { // "success notification"; } // Close connection curl_close($ch); 

如果您仍然收到多个通知。 您必须管理设备令牌。

每个设备可能有多个设备令牌。 所以你必须使用设备ID来管理它。 遵循此步骤:

  1. 注册设备令牌时必须使用设备ID(一个表中的设备ID和设备令牌的组合)进行检查。 因此,在保存检查设备ID并相应地更新令牌之前,我们可以为该设备提供最新的设备令牌。 每个设备都有唯一的设备ID。

  2. 用户登录注册设备令牌和设备ID。 当用户注销时,只需将设备令牌设为空。 因此,下次我们可以根据设备ID更新设备令牌

GCM遇到了一些问题。 这就是谷歌推出Firebase云消息传递(FCM)的原因。 从这里查看文档。

下面是我在项目中使用的示例代码。 使用您的Android设备ID和FCM服务器密钥进行测试。

 $data = array( 'to' => 'XXXXXXXXXXXdevice_idXXXXX', "priority" => "high", 'data' => [ 'title' => 'Test Title', 'body' => 'Test Body', ] ); $headers = array( "Content-Type:application/json" ); $headers[] = "Authorization:key=XXXXXXSERVER KEYXXXXXXXXXX"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://fcm.googleapis.com/fcm/send"); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_TIMEOUT, 5 ); curl_setopt($ch, CURLOPT_HEADER, false); //curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); $result = curl_exec($ch); curl_close($ch); 

如果您打印$result variable您将得到这样的响应。 它会告诉您是否发送了通知。

 {"multicast_id":6375780930000000095,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:139000000000000cd617fcf9fd7ecd"}]} 

参考这些代码

 < ?php include "connection.php"; $msg = "New jobs for you"; $noti ="Jobsglance"; $sql = "SELECT gcmid FROM gcm"; // Executing the query $result = mysql_query($sql); while($row = mysql_fetch_assoc($result)) { $regid[] = $row[gcmid]; } define( 'API_ACCESS_KEY', 'AI******************' ); $registrationIds = $regid; // Message Array $msg = array ( //  'message' => $msg, //  'title' => $noti, 'subtitle' => 'This is a subtitle. subtitle', 'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', // Sets to true or '1' if we want device to vibrate and make sound when user recieves push notification 'vibrate' => 'default', 'sound' => 'default', 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); // RegistrationIds and message are assigned to fields $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( // Setting headers for API acceess key and content type 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); //  $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' ); 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 ); curl_close( $ch ); echo $result; ?> 

我也面临同样的问题。 可能有以下解决方案之一:

  1. 如果只有部分设备受到影响,请从这些设备中删除应用,重新启动这些设备,然后重新安装应用。
  2. 如果在所有设备上发生多个通知问题,则检查来自应用程序的设备令牌,即通过应用程序为一个设备生成多少令牌。
  3. 检查curl的反应。 如果每个设备令牌的GCM响应成功,则检查相同数据是否多次调用函数。 如果响应显示无法访问或同样错误,那么curl可能会连续重试但没有得到任何响应。 尝试在线通知测试人员,如https://pushtry.com/

我想问题是我的Android实现。 该设备已多次注册。

GCM返回设备的相同注册ID,直到下次重新安装。 在某些情况下,当注册ID过期/无效时,GCM会返回一个新的。

在推送时,GCM将返回已过期/无效令牌的规范注册ID。

解决方案是读取响应并使用db中的新注册ID更新旧注册ID。