2012-01-02 24 views
5

Tôi đã triển khai thành công thông báo đẩy android bằng cách sử dụng google c2dm. Tôi luôn gửi yêu cầu đăng bài cho thiết bị và một thiết bị bị trễ 1-2 giây. Vì vậy, nếu tôi có 1000 thiết bị, tập lệnh của tôi sẽ cần hơn 1000 giây để hoàn tất thao tác đẩy tới tất cả các thiết bị.thông báo đẩy android cho nhiều thiết bị cùng một lúc bằng cách sử dụng google c2dm

Điều tôi muốn biết là, chúng tôi có thể gửi yêu cầu đăng bài cho tất cả các thiết bị tới google c2dm không? Nếu chúng ta có thể, làm thế nào để làm gì?

Tôi đang sử dụng tập lệnh PHP.

Đây là mã của tôi để đẩy một thông điệp tới một thiết bị:

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; 
} 

Nếu tôi có nhiều thiết bị hơn tôi vòng lặp nó như thế này:

while($row = mysql_fetch_assoc($result)) { 

    sendMessageToPhone($authCode, $row['deviceRegistrationId'], GOOGLE_MSG_TYPE, $messageText, $infoType, $messageInfo); 

} 

Thank vì đã giúp.

+0

Bạn nên thêm đoạn của bạn mã cho thấy làm thế nào bạn gửi các sự kiện của bạn để gợi ý có thể được thực hiện. – hakre

Trả lời

2

Xác thực là hành động mở rộng nhất (trong thời gian) trong toàn bộ quá trình, có thể là lý do tại sao bạn có độ trễ 1 giây giữa mỗi lần gửi.

Để tăng tốc quá trình, bạn không nên xác thực mỗi lần. Chỉ cần xác thực một lần và nhận mã thông báo Auth. Mã thông báo này có một TTL nhất định nhưng không có gì được chỉ định bởi Google. Sau đó, lặp qua các thiết bị của bạn và gửi bằng mã thông báo xác thực trước đó. Mã thông báo xác thực có thể thay đổi (hiếm khi) và có thể được tìm thấy trong tiêu đề phản hồi Update-Client-Auth.

Toàn bộ quá trình sẽ không mất nhiều hơn vài trăm ms theo thiết bị.

Cũng xem xét sử dụng stream thay vì curl

+0

Vì vậy, bạn có thể dẫn tôi làm điều đó không? – Kannika

+0

Bạn đã thực hiện tất cả công việc. Chỉ cần chắc chắn để auth một lần (và không phải mỗi lần bạn gửi một msg). Có thể thêm một số điểm chuẩn vào mã của bạn để tìm phần làm chậm tập lệnh. Sử dụng luồng không bắt buộc. – grunk

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; 
} 
+0

sự khác biệt với mã OPS là gì? (và tại sao) –

Các vấn đề liên quan