2016-06-08 140 views
16

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

$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收到的请求的日志。任何领导将不胜感激。

+0

发送此请求后的回复是什么? –

+0

您是否尝试通知有效负载而不是数据有效负载?请查看https://firebase.google.com/docs/cloud-messaging/concept-options –

回答

0

您可以尝试通过命令行运行您的脚本,并查看它是否仍然发送多个通知,如果不是,那么脚本中必须存在执行此代码片段的问题。

0

在添加的代码

echo json_encode($res); 

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

0

请尝试以下代码。我已经使用这个,并完美地工作:

$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更新设备令牌

0

GCM在其中存在一些问题。这就是为什么谷歌推出Firebase云消息传递(FCM)。查看here的文档。

下面是我在项目中使用的示例代码。使用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"}]}