我在客户端/服务器中使用推送通知时遇到了设备注册管理的轻微问题。
问题
我的问题是,当我卸载并重新安装该应用程序时,应用程序返回空字符串以获取注册ID (GCMRegistrar.getRegistrationId(this)
),我将其用于注销这个设备。 问题是,我有一个新的、不同的注册ID(有时)但两者都有效!因此,我不知道服务端如何知道它是否属于同一台设备。另外我要说明的是,我没有更改应用程序版本。是否对清单进行的任何更改会触发发放新的注册ID?
在Android方面,我执行以下操作:
/** * 使用GCM向此android设备注册 */ private void registerDeviceWithGCM() { GCMRegistrar.checkDevice(this); GCMRegistrar.checkManifest(this); String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { log.debug("使用GCM注册应用程序"); GCMRegistrar.register(this, ApplicationData.SENDER_ID); } else { log.debug("已注册: " + regId); deviceRegistrationService.updateServerRegistrationData(this, regId); } }
在我的GCMIntentService.java
中,我执行以下操作:
/** * 在新设备注册时触发,并使用服务器更新注册信息 * * @param context 来自的环境 * @param regId 设备的注册ID */ @Override protected void onRegistered(Context context, String regId) { Log.d(TAG, "注册: " + regId); Intent intent = new Intent(RegistrationReceiver.REGISTRATION_INTENT); intent.putExtra(RegistrationReceiver.REGISTRATION_ID, regId); context.sendBroadcast(intent); }
在我的RegistrationReceiver.java
中,我有以下内容:
/** * 触发与cirrus的设备注册 * * @param context 未使用 * @param intent 用于获取注册ID */ @Override public void handleReceive(Context context, Intent intent) { log.debug("接收到带有意图操作的注册: " + intent.getAction()); if (intent.getAction().equals(REGISTRATION_INTENT)) { String regId = intent.getStringExtra(REGISTRATION_ID); log.debug("收到具有注册ID的注册意图: " + regId); deviceRegistrationService.updateServerRegistrationData(loginActivity, regId); } else if (intent.getAction().equals(REGISTRATION_FAILED_INTENT)) { log.debug("接收注册失败意图,显示错误消息"); showRegistrationFailedMessage(intent); } }
再次说明,问题是我有两个或更多的注册ID都有效(如果旧的无法从服务器发送消息,那就没问题,因为我可以将其清理掉)。