从GCM获得多个通知

时间:2016-06-08 10:09:39

标签: php android curl google-cloud-messaging

我正在使用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收到的请求的日志。任何领导都将不胜感激。

7 个答案:

答案 0 :(得分:0)

在代码末尾添加

echo json_encode($res);

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

答案 1 :(得分: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更新设备令牌

答案 2 :(得分: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"}]} 

答案 3 :(得分:0)

参考这些代码

<?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 that we want to send in the push notification-->
'message' => $msg,


// <!--Title that we want to set for the push notification-->
'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'
);

// <!--Initializing Curl-->
$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;
 ?>

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我认为问题出在我的Android实现上。该设备已多次注册。

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

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

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

答案 6 :(得分:0)

在通知的应用程序端接收文件。

从PHP端

将唯一的ID添加到通知有效负载中。 创建通知时。然后将通知ID设置为php唯一ID。 并将待处理的意图设置为FLAG_UPDATE_CURRENT。

这样,如果您收到多个通知。它将附加在其上。