2011-09-01 51 views
2

我想在Android设备上实现C2DM。我在设备上获得令牌,但每次运行设备时,设备上的registration_id都发生了变化,我不知道它是否应该像这样。问题是我无法使用php curl脚本将消息发送到设备。我得到InvalidRegistration错误消息,这意味着tokenId根据c2dm文档是无效的,我不通过manualy它生成并通过脚本传递。在提出这个问题之前,我已经在所有的网站上进行了大量的研究,而且这个问题不是一个重复的问题。 我有注册的c2dm邮箱编号。我使用Android的代码从本网站here的--curl和Android的代码如下:Android C2DM不工作错误InvalidRegistration

Android清单文件

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mks.android.test" android:versionCode="1" 
    android:versionName="1.0"> 
    <permission android:name="com.mks.android.test.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
    <uses-permission android:name="com.mks.android.test.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <application android:label="@string/app_name" android:icon="@drawable/icon"> 
     <activity android:name=".Alert" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver android:name="com.mks.android.test.C2DMReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND"> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="com.mks.android.test" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <category android:name="com.mks.android.test" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

PHP卷曲的服务器端脚本

<?php 
$registrationId = "789ukisdtfuuskdfh678s98d9f78s9d79f-registrationId from device"; 
$email = "[email protected]"; 
$password = "abcdef"; 
$headers = array('Content-Type: application/x-www-form-urlencoded'); 
$postFields = "Passwd=".$password."&accountType=HOSTED_OR_GOOGLE&source=MKS-TEST-1&service=ac2dm&Email=".$email; 
if(!$curl = curl_init()){ 
die('curl not found'); 
} 
      curl_setopt ($curl, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); 
      curl_setopt($curl, CURLOPT_POST, TRUE); 
      curl_setopt($curl,CURLOPT_HEADER, TRUE); 
      curl_setopt ($curl, CURLOPT_HTTPHEADER, $headers); 
      curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields); 
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, TRUE); 
      $response = curl_exec ($curl); 
      echo $response; 
      curl_close ($curl); 
      $split = explode('Auth=', $response); 
      $Auth = $split[1]; 
      var_dump($split); 
      echo "<br/><br/><br/>Auth:".$Auth."<br/>"; 
      $postFields = "registration_id=".$registrationId."&data.message=MessageSentFromServer&collapse_key=storedmessages"; 
      echo '<br/><br>'.$postFields.'<br/></br>'; 
      $headers = array('Content-Type: application/x-www-form-urlencoded', "Content-Length: ".strlen($postFields), "Authorization: GoogleLogin auth=".$Auth); 
      if(!$curl = curl_init()){ 
       die('curl not found'); 
      } 
      curl_setopt($curl, CURLOPT_URL, "https://android.apis.google.com/c2dm/send"); 
      curl_setopt($curl, CURLOPT_POST, TRUE); 
      curl_setopt($curl,CURLOPT_HEADER, TRUE); 
      curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
      curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields); 
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, TRUE); 

      $response2 = curl_exec ($curl); 
      curl_close ($curl); 
      //var_dump($split); 
      var_dump($response2); 
?> 

从PHP CURL SCRIPT收到的回复标题

我使用安装了curl扩展的xampp。

string(318)“HTTP/1.1 200 OK Content-Type:text/plain日期:2011年9月1日星期四17:04:18 GMT过期时间:Thu,01 Sep 2011 17:04:18 GMT Cache-Control :private,max-age = 0 X-Content-Type-Options:nosniff X-Frame-Options:SAMEORIGIN X-XSS-Protection:1; mode = block Server:GSE Transfer-Encoding:chunked Error = InvalidRegistration“

我已经注册了不同的android包/项目的不同的电子邮件地址,但没有应用程序检索邮件,虽然我得到registration_id。在我的清单中,我已经声明了使用权限,但是即使我将它们添加到底部,也没有任何更改。

+0

PHP代码看起来与验证关键的一个问题。您是否尝试过对网址进行编码? (urlencode($ Auth)) – dermatthias

+0

它给我401错误当我做urlencode($ Auth) – user606669

+0

我得到了同样的问题...请别人帮我.... – Karthik

回答

1

如果你收到一个Id,那么这意味着消息已发送到设备,问题出在设备端。 如果您的手机使用的是WiFi网络而不是3G,请确保您的防火墙不占用设备发送更新请求的端口5228。

我工作的代码发送消息如下:

发送邮件使用C2DM

<?php 
$url = "https://www.google.com/accounts/ClientLogin"; 
$accountType = 'GOOGLE'; //Doesn't change for this 
$email = '[email protected]'; //Enter your Google Account email 
$password = 'yourpasswrodforaboveemail'; //Enter your Google Account password 
$registrationId = "your-registration-Id- get it from device"; 
$source = 'companyName-ApplicationName-VersionCode'; //Enter a name for this source of the login 
$service = 'ac2dm'; //Select which service you want to log into 

//Once that is all done it’s time to use some cURL to send our request and retrieve the auth token: 
$ch = curl_init(); 
$URL = $url."?accountType=".$accountType."&Email=".$email."&Passwd=".$password."&source=".$source."&service=".$service; 


// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, $URL); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$response = curl_exec($ch); 

//Divide the response into an array as to find the auth token 
$line = explode("\n", $response); 


// close cURL resource, and free up system resources 
curl_close($ch); 
unset($ch); 
unset($response); 

$auth_token = str_replace("Auth=", "", $line[2]); //auth token from Google Account Sign In 

$messageUrl = "https://android.apis.google.com/c2dm/send"; 
$collapseKey = "storedmessages"; 
$data = array('data.message'=>'This is a message'); //The content of the message 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $messageUrl); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 


$header = array("Authorization: GoogleLogin auth=".$auth_token); //Set the header with the Google Auth Token 
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 

$postFields = array("registration_id" => $registrationId, "collapse_key" => $collapseKey); 
$postData = array_merge($postFields, $data); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 

$response = curl_exec($ch); 
//Print response from C2DM service// 
print_r($response); 

// close cURL resource, and free up system resources 
curl_close($ch); 
?>