从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); 

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

有什么方法可以检查GCM收到的请求的日志。 任何主angular将不胜感激。

Solutions Collecting From Web of "从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); 

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

每个设备可能有多个设备令牌。 所以你必须用Device ID来pipe理这个。 遵循这一步:

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

  2. 用户login注册设备令牌和设备ID。 当用户注销只是使设备令牌为空。 这样下次我们可以根据设备ID更新设备令牌

GCM有一些问题。 这就是为什么谷歌推出了Firebase云消息传递(FCM)。 看看这里的文档。

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

 $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"}]}