我正在使用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收到的请求的日志。任何领导都将不胜感激。
答案 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来管理它。请按照以下步骤操作:
注册设备令牌时必须使用设备ID(一个表中的设备ID和设备令牌的组合)进行检查。因此,在保存检查设备ID并相应地更新令牌之前,我们可以为该设备提供最新的设备令牌。每个设备都有唯一的设备ID。
当用户登录注册设备令牌和设备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)
我也面临同样的问题。 可能有以下解决方案之一:
答案 5 :(得分:0)
我认为问题出在我的Android实现上。该设备已多次注册。
GCM返回设备的相同注册ID,直到下次重新安装。在某些情况下,当注册ID过期/无效时,GCM会返回一个新的。
在推送时,GCM将返回过期/无效令牌的规范注册ID。
解决方案是读取响应并使用db中的新注册ID更新旧注册ID。
答案 6 :(得分:0)
在通知的应用程序端接收文件。
从PHP端将唯一的ID添加到通知有效负载中。 创建通知时。然后将通知ID设置为php唯一ID。 并将待处理的意图设置为FLAG_UPDATE_CURRENT。
这样,如果您收到多个通知。它将附加在其上。