Android C2DM 注册无效
Posted
技术标签:
【中文标题】Android C2DM 注册无效【英文标题】:Android C2DM Invalidregistration 【发布时间】:2010-12-22 12:12:24 【问题描述】:我创建了一个 android 应用程序,该应用程序注册到 google c2dm 服务。并且它成功地从 c2dm 服务获取了 registration_id 令牌。
我已经签署了 Android Cloud 到设备消息传递表单,并且我收到了来自 c2dm 服务的确认电子邮件。
客户端一切正常,在模拟器环境中获取registration_id。所以,没关系。
但是,在服务器端,它正在验证 google 服务,它正在接收 Auth 代码,然后调用 c2dm 使用以下代码发送 url。
public void SendMessage(string registrationId, string data)
ServicePointManager.ServerCertificateValidationCallback += delegate(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
return true;
;
string collapseKey = Guid.NewGuid().ToString("n");
string url = "https://android.apis.google.com/c2dm/send";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.Headers.Add("Authorization", "GoogleLogin auth=DQAAAKYAAACE_0NqG8Sj5lBf4YSPXs_ltQbTzPsAL5u1Q1KGF...");
string px = "registration_id=" + registrationId + "&collapse_key=" + collapseKey + "&data.payload=" + data;
string encoded = HttpUtility.UrlEncode(px);
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] buffer = encoding.GetBytes(encoded);
Stream newStream = request.GetRequestStream();
newStream.Write(buffer, 0, buffer.Length);
newStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if(response.StatusCode == HttpStatusCode.OK)
Stream resStream = response.GetResponseStream();
StreamReader sr = new StreamReader(resStream);
Console.Write(sr.ReadToEnd());
sr.Close();
resStream.Close();
Console.WriteLine();
Console.ReadLine();
它仍在接收来自 c2dm 服务的Error=InvalidRegistration
响应。
我做错了什么?
【问题讨论】:
你能上传你的项目源码吗? 你能分享你的服务器端和客户端的源代码吗?谢谢 【参考方案1】:好的,解决了。
我删除了HttpUtility.UrlEncode(px);
,一切正常。
【讨论】:
很高兴看到你解决了它。仅供参考:您应该只编码查询字符串值,而不是查询字符串本身。【参考方案2】:在我将 ContentType 设置为 -
之前,我一直有这个问题application/x-www-form-urlencoded
您需要将其设置为两者
身份验证阶段, 发送消息。然后我收到NotRegistered
错误,但这是由于在手机上没有使用与发件人相同的帐户进行服务器身份验证。
希望对其他人有所帮助。
【讨论】:
以上是关于Android C2DM 注册无效的主要内容,如果未能解决你的问题,请参考以下文章
从我们从 Android 应用发送的 PHP 获取注册 ID
com.google.android.c2dm.intent.RECEIVE 还在使用吗?