我的客户端/服务器上用于推送通知的设备注册管理存在小问题。
问题
我遇到的问题是,当我卸载应用程序并重新安装它时,应用程序返回一个空字符串作为注册 id ( GCMRegistrar.getRegistrationId(this)
),我用我的服务器重新注册设备。问题是我得到了一个新的、不同的注册 ID(有时)并且两者都有效!所以我不知道服务器端如何知道它是否适用于同一设备。我还应该注意我没有更改应用程序版本。清单的任何更改都会触发新的注册 ID 发出吗?
在 Android 端,我执行以下操作:
/** * 用 GCM 注册这个 android 设备 */ 私人无效 registerDeviceWithGCM() { GCMRegistrar.checkDevice(this); GCMRegistrar.checkManifest(this); 字符串 regId = GCMRegistrar.getRegistrationId(this); 如果(regId.equals(“”)){ log.debug("向 GCM 注册应用程序"); GCMRegistrar.register(this, ApplicationData.SENDER_ID); } 别的 { log.debug("已经注册:" + regId); deviceRegistrationService.updateServerRegistrationData(this, regId); } }
在我的GCMIntentService.java
我做以下:
/** * 新设备注册时触发,并与服务器更新注册信息 * * @param 上下文上下文接收自 * @param regId 设备的注册ID */ @覆盖 受保护的无效onRegistered(上下文上下文,字符串regId){ Log.d(TAG, "注册:" + regId); Intent intent = new Intent(RegistrationReceiver.REGISTRATION_INTENT); intent.putExtra(RegistrationReceiver.REGISTRATION_ID, regId); context.sendBroadcast(意图); }
在我的RegistrationReceiver.java
我有以下内容:
/** * 使用 cirrus 触发设备注册 * * @param 上下文未使用 * @param intent 用于获取注册 ID */ @覆盖 公共无效句柄接收(上下文上下文,意图意图){ log.debug("收到注册意图操作:" + intent.getAction()); if (intent.getAction().equals(REGISTRATION_INTENT)) { 字符串 regId = intent.getStringExtra(REGISTRATION_ID); log.debug("收到注册意图,注册ID:" + regId); deviceRegistrationService.updateServerRegistrationData(loginActivity, regId); } else if (intent.getAction().equals(REGISTRATION_FAILED_INTENT)) { log.debug("收到注册失败意图,显示错误信息"); showRegistrationFailedMessage(意图); } }
同样,这里的问题是我有两个或更多的注册 id 都可以工作(如果我在尝试从服务器发布消息时旧的注册 ID 根本不起作用,因为我可以简单地清理它,这不会是一个问题向上)。