Intereting Posts
WebView внутри ViewPager или ScrollView – странная ошибка рендеринга на Android 3.0+ Как построить общие библиотеки ffmpeg без суффикса версии Динамическое добавление ребенка в LinearLayout с получением позиции каждого ребенка Ошибка приложения при запуске из-за java.lang.IllegalArgumentException: column '_id' не существует Библиотека поддержки дизайна v22.2 «НЕПРЕРЫВНО-ТОП-УРОВЕННОЕ ИСКЛЮЧЕНИЕ» Ориентация экрана Android различается между устройствами Как управлять кодом для разных дизайнов для поддержки всех устройств Ошибка: тип «JNIENV» не может быть разрешен Утечка памяти растрового изображения Android Techiniques для написания Android, iPad, iPhone-клиентов, использующих удаленные данные Проблема в названии аудиофайла в Facebook Post на Android Показать представление в фоне другого вида? Strange ArrayIndexOutOfBoundsException на некоторых устройствах при рисовании полилиний Получить все сообщения от Whatsapp Android 6.0 Запрещено разрешение записи файла

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 и получил ложный результат, вы должны запустить намерение РЕГИСТРАЦИИ, чтобы получить новый идентификатор.