2011-06-20 47 views
0

我尝试在Android中实现C2DM。在注册C2DM服务器后,我可以获得注册码。但是,当我从第三方服务器发送消息时,它会在Log中显示消息“消息已发送”和错误代码200,这意味着第三方服务器已成功发送消息。 BuT我的问题是,我无法在设备中接收消息。如何在android中实现C2DM

回答

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

     $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); 
     $response = curl_exec($ch); 
     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; 
     } 
     return $matches[2]; 
    } 

    // send message to android, The message size limit is 1024 bytes in android 

    function c2dmSendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText,$extraArr) { 
      $headers = array('Authorization: GoogleLogin auth=' . $authCode); 
      $data1 = array(
        'registration_id' => $deviceRegistrationId, 
        'collapse_key' => $msgType, 
        'data.msg' => $messageText   
        ); 
      $data2 = array(); 
      // append 'data' string in key of the array 
      if(!empty($extraArr)){ 
        foreach($extraArr as $k => $v){ 
         $data2['data.'.$k] = $v; 
         unset($extraArr[$k]); 
        } 
      } 

      $data = array_merge($data1,$data2); 
      $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

每个人都在调整到这个话题应该了解变化中的谷歌:

C2DM已被弃用,由Google Cloud Messaging for Android (GCM)已被替换。 谷歌的声明:

Important: C2DM has been officially deprecated as of June 26, 2012. 
This means that C2DM has stopped accepting new users and quota requests. 
No new features will be added to C2DM. However, apps using C2DM will continue to work. 
Existing C2DM developers are encouraged to migrate to the new version of C2DM, 
called Google Cloud Messaging for Android (GCM). 
See the C2DM-to-GCM Migration document for more information. 
Developers must use GCM for new development. 

有一个demo app tutorial for GCM,也为migration从C2DM。