2012-08-27 69 views
0

我正在将我的Android应用程序从C2DM迁移到GCM。我有服务器端设置来接收两者都是指示GCM与C2DM的ID,然后在服务器端,我通过相应的服务发送出去,具体取决于它所注册的服务。迁移到GCM,但仍然有C2DM注册ID

我遇到的问题是,应用程序正在以我的服务器注册为GCM(应用程序更新使用新的发件人ID在意图。)但不幸的是,它传递给服务器的ID注册ID实际上是旧的C2DM ID。

作为此迁移的一部分(在应用程序代码中),我需要做些什么来确保获得新的(GCM)ID,而不是继续使用现有的C2DM注册ID。这对我来说很容易测试和重现,并且每次都会得到一致的结果(来自GCM服务器的MisMatchedSenderId)。我需要先注销C2DM ID吗?

+0

注意显示您在应用程序中用于注册GCM的代码? – Femaref

+0

public static void register(Context context, String senderId){ Intent registrationIntent = new Intent(REQUEST_REGISTRATION_INTENT); registrationIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT, PendingIntent.getBroadcast(context,0,new Intent(),0)); registrationIntent.putExtra(EXTRA_SENDER,senderId); context.startService(registrationIntent); } –

回答

0

我们能够找出问题所在,因为该设备已经有一个注册ID(c2dm),它甚至没有试图用新的senderId(gcm)命中注册服务器,因此它使用旧的c2dm注册ID。感谢您的意见

+0

很高兴您能够理顺它。你应该接受你自己的答案,因为这是你的问题的正确答案。如果可以的话,详细阐述为什么它会保留旧的注册ID(例如,它是由谷歌代码导致的,还是代码存储在首选项或其他内容中),以及你做了什么来解决它(清除首选项?称为不同的c2dm方法?)。 – ajh158

+0

当然没有问题, 基本上,旧的注册ID(用于c2dm)存储在首选项中,只要注册ID存在,即将注册GCM的方法甚至不会被调用。为了解决这个问题,我只是从首选项中清除注册ID,从而触发了与GCM的新注册。应该注意的是,在清除旧的注册ID之前,我用DELETE调用了我的服务器,以便从C2DM设备列表中删除它,因此我应该看到,随着GCM数据库获取设备,数据库一直收缩。 –

0

您必须更新客户端代码才能发送Google API项目ID而不是电子邮件地址作为发件人ID。

有关如何获取Google API项目ID的说明,请参阅GCM Getting Started Guide

下面是示例代码的变化,我从Migration Guide复制:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
// sets the app name in the intent 
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
registrationIntent.putExtra("sender", senderID); 
startService(registrationIntent);

在我的情况,senderID实际上从strings.xml中读取,所以我不得不与谷歌的API有更换电子邮件地址项目ID。

+0

是的,我已经做到了。问题似乎是设备保留了旧的C2DM注册ID并将其发送到我的服务器,而不是获取新的GCM注册ID。然而,新安装(从来没有c2dm注册ID)成功工作。 –

+0

在你的代码中的某个地方,你应该打电话给 – ajh158

+0

。对不起,我以前的评论,等了太久才能编辑它。我想说的是,我会尝试在调用startService(以验证新的sendID被传入)和Receiver中的onRegister和onError之前设置断点,以查看您得到的响应。在附注中,我为C2DM和GCM返回的注册ID显示为相同的格式。 – ajh158