GCM注册两个不同的工作注册ID

我的客户端/服务器上的设备注册pipe理存在轻微的问题,无法进行推送通知

问题

我遇到的问题是,当我卸载应用程序,并重新安装它的应用程序返回一个空string的注册ID( GCMRegistrar.getRegistrationId(this) ),我重新注册设备与我的服务器。 问题是,我得到一个新的,不同的注册ID(有时),同时工作! 所以我不知道服务器端是如何知道它是否适用于同一个设备。 我也应该注意到我没有改变应用程序版本。 对清单进行任何更改都会触发一个新的注册ID发布?

在Android方面,我做了以下几点:

     / **
      *注册这个Android设备与GCM
      * /
     private void registerDeviceWithGCM(){
         GCMRegistrar.checkDevice(本);
         GCMRegistrar.checkManifest(本);
         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从上下文接收到的上下文
      * @param regId设备的注册ID
      * /
     @覆盖
     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(意向);
     }

在我的RegistrationReceiver.java我有以下几点:

     / **
      *用卷云触发设备注册
      *
      * @param上下文未使用
      * @参数意图用于获取注册ID
      * /
     @覆盖
     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(意向);
         }
     }

再次,这里的问题是,我有两个或更多的注册ID,所有的工作(这不会是一个问题,如果我试图从服务器发布消息时,老的根本不工作,因为我可以简单地清理向上)。

有时Google会更改注册ID,并且您将拥有多个关联的ID。 发送通知的服务器(您的服务器)必须使用新的ID更新数据库。

有关更多信息,请查阅此文档:

http://developer.android.com/google/gcm/adv.html

说的是:

在服务器端,只要应用程序运行良好,一切都应该正常工作。 但是,如果应用程序中的某个错误会触发同一设备的多个注册,则可能很难调和状态,最终可能会出现重复的消息。

GCM提供了一个称为“规范注册ID”的设施,可以轻松地从这些情况中恢复过来。 规范注册ID被定义为您的应用程序请求的最后一次注册的ID。 这是服务器向设备发送消息时应使用的ID。

如果稍后尝试使用不同的注册ID发送消息,则GCM将像往常一样处理该请求,但会在响应的registration_id字段中包含规范注册ID。 请确保使用此规范IDreplace存储在您的服务器中的注册ID,因为您最终使用的ID将停止工作。