Intereting Posts
Ошибка Ionic Cordova FileUpload: не разрешено загружать локальный ресурс Не получать точный ответ от vCard, используя asmack Какую среду мобильного программирования вы рекомендуете для запуска? Блок cordova / phonegap и кнопка возврата назад Сохранение данных датчиков в файл в android Как получить все выбранные элементы списка, используя флажок Центрирование текстового изображения Ниже кнопки изображения, которая находится под относительным расположением? Android: как создать ListView, который похож на Preferences? Установить пользовательскую папку Android Download Manager Пакеты упали, если я не принимаю активное участие в DatagramSocket? Получить список всех таблиц в базе данных Модернизация с помощью Rxjava Schedulers.newThread () vs Schedulers.io () OnOptionsItemВыбранный возвращаемый неверный идентификатор Создание OnDragListener для Google Map v2 Фрагмент Как получить requestCode от ожидающего намерения во время тревоги в android

Google Cloud Messaging (GCM) и registration_id истекает, как я узнаю?

Я собрал скелетное клиентское / серверное приложение GCM, которое принимает и отображает сообщения на моем телефоне Android с моего грубого и готового сервера. Я говорю «скелет» и «грубый и готовый», потому что регистрационное имя моего приложения жестко закодировано на стороне сервера как значение, которое я захватил в отладчике, когда я начал образец приложения Android и зарегистрировал комбинацию приложений / устройств на сервере GCM. Я собирался начать работу над предоставлением механизма чтения / записи для двух сторон доступа к простой базе данных на сервере для хранения комбинаций reg_id / device, когда я подумал:

Я знаю, что reg_id может истекать в любое время, потому что Google это может сказать. Из документов видно, как проверить, что идентификатор все еще в порядке, и это большой IF, я снова запустил приложение. Однако почему я или любой другой пользователь должен запустить его снова? GCMIntentService, зарегистрированный в манифесте, сидит там, собирая сообщения по мере необходимости, и нет необходимости снова запускать приложение по любой причине. Поэтому, когда id истекает, я перестану получать сообщения – сервер может знать из кода возврата, но не сможет сообщить об этом моему приложению – нет восстановления, если я снова запустил приложение и не onCreate() через его onCreate() и предположительно registerClient() .

Итак, что происходит, когда id истекает? Я не вижу, чтобы какие-либо из методов on.int в IntentService выполнялись. Будет ли сам Google отправлять нормальное сообщение о том, что он скоро истечет? Нужно ли мне ежедневно записывать тревожную задачу и проверять идентификатор?

Согласно GCM :

Существующий идентификатор регистрации может перестать действовать в ряде сценариев, в том числе:

  • Если приложение вручную отменяет регистрацию, вызывая намерение com.google.android.c2dm.intent.UNREGISTER.
  • Если приложение автоматически не регистрируется, что может случиться (но не гарантируется), если пользователь удаляет приложение. Если идентификатор регистрации истекает. Google может решить обновить регистрационные идентификаторы.
  • Если приложение обновлено, но новая версия не имеет широковещательного приемника, настроенного для получения com.google.android.c2dm.intent.RECEIVE.

Учтите, что в ответах, связанных с регистрацией, будет com.google.android.c2dm.intent.REGISTRATION « com.google.android.c2dm.intent.REGISTRATION ». Поэтому вам следует позаботиться о регистрации сообщений, отправленных из GCM.

обновленный

В документе GCM говорится:

Если идентификатор регистрации истекает. Google может решить обновить регистрационные идентификаторы. Для всех этих случаев вы должны удалить этот идентификатор регистрации с стороннего сервера и прекратить его использовать для отправки сообщений. Случается, когда код ошибки NotRegistered.

Учитывая вышеприведенный факт как истину, то на вашем сервере вы должны обрабатывать истекшие идентификаторы и устанавливать в них флаг в своем db, в следующий раз, когда ваш клиент android проверит ваш сервер (наконец, вы должны сделать периодическую проверку) или вы вызываете isRegisteredOnServer В классе GCMRegistrar и получил ложный результат, вы должны запустить намерение РЕГИСТРАЦИИ, чтобы получить новый идентификатор.