2013年2月3日 星期日

使用GCM服務(三) 訊息推播伺服器(1)


負責與用戶端裝置對談,記錄API key及用戶行動裝置之registration ID,並向GCM伺服器(https://android.googleapis.com/gcm/send.)送出POST請求封包。
POST請求封包可以是明碼(plain text)或JSON格式,但多點廣播時只能使用JSON格式。
JSON格式POST請求封包 header中必須內含以下資料:
l  Authorization: key = YOUR_API_KEY
l  Content-Type: application/jsontext)。
JSON格式POST請求封包 body必須是JSON物件格式字串,可包含以下欄位內容:
l  registration_ids  必要欄位。由戶行動裝置之registration Id所組成之字串陣列,最多1000個。
l  data  選用欄位。JSON物件格式字串,用來表示所要推播的訊息資料,例如:"data":{"title":"Android Apps初學必修課","isbn": "978-986-276-704-7"},總資料量不可超過4kb
l  dry_run  選用欄位,預設為false。當設定此項,表示測試POST請求封包,但GCM Server並不會真正送出推播訊息。
以下PHP程式碼使用JSON格式送出GCM多點訊息推播請求封包。
  define("GOOGLE_API_KEY", "your_api_key");
  $registrationIDs = array( 'reg_id1', 'reg_id2', ...);
   //payload data
  $payload = array('title' => '耕雲智慧', 'subtitle' => '測試訊息推播');
  //http header
  $headers = array('Authorization: key=' . GOOGLE_API_KEY,
                 'Content-Type: application/json');
  $fields = array('registration_ids' => $registrationIDs,
          'data' => $payload);
  //curl connection
  $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/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;
?>


3 則留言:

  1. 請問您文章提到的用戶行動裝置之registration ID
    是GCM服務(二) 申請GCM API Key提到的SENDER_ID嗎?
    謝謝您

    回覆刪除
  2. 並不是SENDER_ID, 而是在"使用GCM服務(六) 設計GCM應用程式(2)"一文中, Android程式碼:
    final String regId = GCMRegistrar.getRegistrationId(this);

    回覆刪除
  3. 請問server的部分只能用PHP寫嗎?
    可以用C++嗎?

    回覆刪除