我已使用google c2dm成功实施了android推送通知。我总是发送一个设备的发布请求,一个设备延迟1-2秒。因此,如果我有1000个设备,我的脚本将需要超过1000秒才能完成对所有设备的推送。
我想知道的是,我们可以将所有设备的发布请求发送到google c2dm吗?如果我们可以,怎么办?
我正在使用PHP脚本。
以下是将消息推送到设备的代码:
function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText, $infoType, $messageInfo) {
$headers = array('Authorization: GoogleLogin auth=' . $authCode);
$data = array(
'registration_id' => $deviceRegistrationId,
'collapse_key' => $msgType,
'data.message' => $messageText,
'data.type' => $infoType,
'data.data' => $messageInfo
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
if ($headers)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
如果我有更多设备,我就这样循环:
while($row = mysql_fetch_assoc($result)) {
sendMessageToPhone($authCode, $row['deviceRegistrationId'], GOOGLE_MSG_TYPE, $messageText, $infoType, $messageInfo);
}
感谢帮助。
答案 0 :(得分:2)
验证是所有过程中最广泛的(及时)动作,这可能就是为什么每次发送之间有1秒的延迟。
要加快此过程,您不应每次都进行身份验证。
只需授权一次,即可获得Auth令牌。此令牌具有特定TTL但Google未指定任何内容。
然后遍历您的设备,并使用先前的身份验证令牌发送。身份验证令牌可以更改(很少),可以在响应头Update-Client-Auth
中找到。
所有过程不应该花费几百毫秒的设备。
另请考虑使用stream代替curl
答案 1 :(得分:0)
function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText, $infoType, $messageInfo) {
$headers = array('Authorization: GoogleLogin auth=' . $authCode);
$data = array(
'registration_id' => $deviceRegistrationId,
'collapse_key' => $msgType,
'data.message' => $messageText,
'data.type' => $infoType,
'data.data' => $messageInfo
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
if ($headers)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}