GCM消息丢失问题

3

我这里有一个gcm演示: http://leobee.com/android/push/login/gcm/updateusers.php

如果您刷新页面,您将会看到一个新的随机数。只有4次刷新中的1次会向gcm发送一条消息。这是正常现象还是可以调整代码来解决?

该页面没有被缓存。

代码:

<?php


require_once '../include/DB_Functions.php';


// get database access
$db = new DB_Functions();

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

//api key 
$apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

$result;

//array for phones connected to this service
$registrationIDs = array();


$randomNum=rand(10,100);


echo "this is updateusers".$randomNum;
$_POST['message']="updateusers".$randomNum;
if (isset($_POST['message']) && $_POST['message'] != ''){   

echo "<br>if (isset) updateusers".$randomNum;
    // Message to be sent
    $id= ''.mysql_real_escape_string(htmlentities($_POST['server_id'])).'';
    $new_message= ''.mysql_real_escape_string(htmlentities($_POST['message'])).'';


    // get client registration IDs
    $query ="SELECT * FROM GoogleCloudMsg";

    $queryresult=mysql_query($query);

    while($row=mysql_fetch_assoc($queryresult)){
    echo "<br>While loop updateusers".$randomNum;
        $regId=$row['GCMPhoneRegisteredId'];

        array_push($registrationIDs,$regId);

}



// Set POST variables
$url = 'https://android.googleapis.com/gcm/send';

$fields;

if(!$id || $id==""){

    $fields = 
array(
'registration_ids' => $registrationIDs, 
'data' => array("message" => $new_message), 
'delay_while_idle'=> false,
'collapse_key'=>"".$randomNum.""
);

    echo "<br> id is blank updateusers".$randomNum;

}else{

$fields = 
array(
'registration_ids' => $registrationIDs, 
'data' => array("message" =>$new_message,"server_id"=>$id), 
 'delay_while_idle' => 'false',
'collapse_key'=>"".$randomNum.""
);

echo "<br>id exists updateusers".$randomNum;

}
$headers = array('Authorization: key=' . $apiKey, '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 ) );

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//     curl_setopt($ch, CURLOPT_POST, true);
//     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

// Execute post
$result = curl_exec($ch);

// Close connection
curl_close($ch);
echo $result;

}

echo "<br>mysql close updateusers".$randomNum;
 mysql_close();


?>

该网站并不总是打印返回的JSON数据:如果出现问题(例如API密钥不正确或发送了太多请求等),请查看其中的错误代码和信息,因为Google会将其放入其中。另外,请问您是以JSON格式还是编码形式发送数据? - Grace B
1
从那个while循环来看,你可能确实发送了太多的消息。GCM要求你实现指数退避。试着在SQL中添加“LIMIT 1”并查看是否有效。否则,就像我上面提到的,查看返回的JSON。 - Grace B
1
但是你可能发送得太快了。使用 LIMIT 1 时,它是否100%发送成功?更好的方法是使用JSON并具有要发送到的多个ID(请参见 registration_ids http://developer.android.com/guide/google/gcm/gcm.html#request)。 - Grace B
我使用 "LIMIT 1" 仍然得到相同的结果。我会再次检查回退... - Leoa
还要查看GCM故障排除http://developer.android.com/guide/google/gcm/gcm.html#response并尝试其中概述的`curl`请求 - Grace B
显示剩余4条评论
1个回答

1

有两种方法可以解决这个问题。

  1. 生成并安装CA证书。

  2. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

不验证主机。


这个问题的另一个原因是来自Yahoo Hosting的CA证书。它是通过第三方租用的,因此它不存在于您的网站空间或帐户中。我不得不通过Godaddy购买托管和证书。现在脚本可以正常工作了。 - Leoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接