2013-02-22 5 views
0

На стороне сервера я нашел для одного устройства несколько идентификаторов регистрации, что, очевидно, создает для меня много проблем. как сообщения, полученные много раз.GCM: несколько идентификаторов приложения на стороне сервера

Как я могу получить красные от старых регистрационных идентификаторов или убедиться, что регистрация не произойдет, если есть действительный идентификатор регистрации.

Я следую пример учебника по Android док, когда я написал мое приложение, как показано ниже:

checkNotNull(SERVER_URL, "SERVER_URL"); 
     checkNotNull(SENDER_ID, "SENDER_ID"); 
     // Make sure the device has the proper dependencies. 
     GCMRegistrar.checkDevice(this); 
     // Make sure the manifest was properly set - comment out this line 
     // while developing the app, then uncomment it when it's ready. 
     // NOT required any more GCMRegistrar.checkManifest(this); 

     /** 
     * this code to register reciver moved to message actvity 
     */ 
     //registerReceiver(mHandleMessageReceiver, new IntentFilter(
     //  DISPLAY_MESSAGE_ACTION)); 


     /* final String */regId = GCMRegistrar.getRegistrationId(this); 

     /** 
     * save regId in pref to be used by Location update service 
     */ 
     SavePreferences("regId", regId); 

     if (regId.equals("")) { 
      // Automatically registers application on startup. 
      GCMRegistrar.register(this, SENDER_ID); 
     } else { 
      // Device is already registered on GCM, check server. 
      if (GCMRegistrar.isRegisteredOnServer(this)) { 
       ;; 
       // Skips registration. 
       // -- mDisplay.append(getString(R.string.already_registered) + 
       // "\n"); 
      // System.out.println(getString(R.string.already_registered) 
       //  + "\n"); 

      } else { 
       // Try to register again, but not in the UI thread. 
       // It's also necessary to cancel the thread onDestroy(), 
       // hence the use of AsyncTask instead of a raw thread. 
       final Context context = this; 
       mRegisterTask = new AsyncTask<Void, Void, Void>() { 

        @Override 
        protected Void doInBackground(Void... params) { 
         boolean registered = ServerUtilities.register(context, 
           regId); 
         // At this point all attempts to register with the app 
         // server failed, so we need to unregister the device 
         // from GCM - the app will try to register again when 
         // it is restarted. Note that GCM will send an 
         // unregistered callback upon completion, but 
         // GCMIntentService.onUnregistered() will ignore it. 
         if (!registered) { 
          GCMRegistrar.unregister(context); 
         } 
         return null; 
        } 

        @Override 
        protected void onPostExecute(Void result) { 
         mRegisterTask = null; 
        } 

       }; 
       mRegisterTask.execute(null, null, null); 
      } 
     } 

EDIT: Обратите внимание, я мог бы получать сообщения на устройстве.

ответ

1

какое-то время, только один идентификатор регистрации для одного устройства, несколько идентификаторов не будут возможны.

Когда вы впервые запускаете свое приложение, вы получите регистрационный идентификатор и что вы должны зарегистрировать его в регистраторе GCM. В противном случае сообщение не будет доставлено на ваше устройство.

на стороне сервера, вам необходимо сохранить этот идентификатор регистрации безопасным образом, чтобы вы могли использовать его, когда хотите отправить сообщение.

Ваша проблема отслеживания идентификатора регистрации для определенного устройства: когда вы получили идентификатор регистрации для своего устройства, затем сохраните его в своей базе данных сервера, если вы используете в противном случае его массив. И всякий раз, когда создается новый идентификатор регистрации, удалите предыдущий и добавьте новую запись в свою базу данных.

+0

Спасибо ... трюк здесь, как мне нужно, новый идентификатор создается для того же устройства, чтобы я мог удалить старый? – user836026

+1

sry .. При создании нового идентификатора вы попытаетесь зарегистрировать регистратор GCM. , когда этот новый регистрационный идентификатор успешно зарегистрирует ваш метод onRegister(), будет вызываться .checked следующий код. Здесь вы можете добавить код, чтобы заменить предыдущий на новый. @Override \t защищен недействительным onRegistered (Context контекст, String RegistrationID) { \t \t ServiceUtilities.register (контекст, RegistrationID); \t} – mahesh

+1

sry, но я не могу правильно отступать над кодом в части комментария, не могу добавить этот код в качестве другого, как его правило stackoverflow. со следующего вопроса спрашивайте новый вопрос как отдельный вопрос – mahesh