2010-11-08 94 views
22

我正在創建使用C2DM推送通知的Android應用程序。但我在創建使用c2dm發送消息的php代碼時遇到了問題。請指導我如何使用php代碼發送消息。其實這是一個問題,如何獲得客戶端身份驗證令牌。我已經看到了http://code.google.com/android/c2dm/index.html#server網址,但根據這個我創建了Android應用程序,我也得到了註冊ID,我也發送給用戶,但服務器如何使用它來發送應用程序。C2DM實現PHP代碼

有沒有什麼東西需要從android設備的服務器發送消息?

回答

45

註冊自己的服務器系統,並獲得授權令牌(這是CPT奧朗德提出的。):

function googleAuthenticate($username, $password, $source="Company-AppName-Version", $service="ac2dm") {  


     session_start(); 
     if(isset($_SESSION['google_auth_id']) && $_SESSION['google_auth_id'] != null) 
      return $_SESSION['google_auth_id']; 

     // get an authorization token 
     $ch = curl_init(); 
     if(!ch){ 
      return false; 
     } 

     curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); 
     $post_fields = "accountType=" . urlencode('HOSTED_OR_GOOGLE') 
      . "&Email=" . urlencode($username) 
      . "&Passwd=" . urlencode($password) 
      . "&source=" . urlencode($source) 
      . "&service=" . urlencode($service); 
     curl_setopt($ch, CURLOPT_HEADER, true); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);  
     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

     // for debugging the request 
     //curl_setopt($ch, CURLINFO_HEADER_OUT, true); // for debugging the request 

     $response = curl_exec($ch); 

     //var_dump(curl_getinfo($ch)); //for debugging the request 
     //var_dump($response); 

     curl_close($ch); 

     if (strpos($response, '200 OK') === false) { 
      return false; 
     } 

     // find the auth code 
     preg_match("/(Auth=)([\w|-]+)/", $response, $matches); 

     if (!$matches[2]) { 
      return false; 
     } 

     $_SESSION['google_auth_id'] = $matches[2]; 
     return $matches[2]; 
    } 

要發送消息到一個電話:

// $msgType: all messages with same type may be "collapsed": if multiple are sent, 
// only the last will be received by phone. 
function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText) { 

      $headers = array('Authorization: GoogleLogin auth=' . $authCode); 
      $data = array(
       'registration_id' => $deviceRegistrationId, 
       'collapse_key' => $msgType, 
       'data.message' => $messageText //TODO Add more params with just simple data instead   
      ); 

      $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; 
     } 
+1

會話使用Cookie,不是嗎?這對於服務器腳本如何工作? – 2011-03-22 11:47:07

+0

是的,會話通常使用Cookie。這裏會話只用於省略不必要的認證請求,如果auth令牌已知的話。就這些。如果您從另一個腳本調用此腳本,則不需要此機制,因爲您的腳本知道它是否已擁有授權令牌,不是嗎? – Yar 2011-03-22 17:45:18

+0

如果我從cron運行腳本,我需要一種方法來存儲身份驗證令牌。我想這不會是會話。 – 2011-03-22 23:19:32

3

查看結果:http://www.toppa.com/2010/google-clientlogin-php-example/ 否則我會盡快回復您,因爲本週晚些時候我會試用C2DM。

+0

我想問問1個新事物,從其中token是要從android設備或從應用程序服務器生成。這裏的android設備只用於接收應用服務器發送的消息。我不想從Android設備發送消息 – 2010-11-09 12:39:48

+0

嗨請告訴我誰將從android應用程序或endserver發送authtoken的請求。 – 2010-11-15 08:17:42

0

我嘗試使用被接受爲正確答案的php代碼,但它不工作。 我得到的響應http代碼爲「0」。

我發現同樣的代碼在following link

需要得到專家的幫助在這裏。