2013-07-26 2 views
1

Клиентский код в GCM example on the Android dev site по умолчанию для вызова gcm.register(SENDER_ID); через каждые семь дней, проверяя при регистрации истек с помощью следующей функции:Если приложения запрашивают gcm.register() каждые семь дней, чтобы обеспечить действительные регистрационные идентификаторы?

public static final long REGISTRATION_EXPIRY_TIME_MS = 1000 * 3600 * 24 * 7; 

/** 
* Checks if the registration has expired. 
* 
* To avoid the scenario where the device sends the registration to the 
* server but the server loses it, the app developer may choose to re-register 
* after REGISTRATION_EXPIRY_TIME_MS. 
* 
* @return true if the registration has expired. 
*/ 
private boolean isRegistrationExpired() { 
    final SharedPreferences prefs = getGCMPreferences(context); 
    // checks if the information is not stale 
    long expirationTime = 
      prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1); 
    return System.currentTimeMillis() > expirationTime; 
} 

Комментарий выше функции следует, что это используется, чтобы «избежать сценарий, когда устройство отправляет регистрацию на сервер, но сервер теряет его. Предполагается ли, что наши серверы (а не серверы GCM) могут потерять идентификатор регистрации? Или это связано с тем, что идентификатор регистрации может стать недействительным на стороне GCM Похоже, что это возможно в соответствии с нижеследующим абзацем в the GCM Advanced Topics Page:

Аналогичным образом, вы не должны сохранять идентификатор регистрации при резервном копировании приложения . Это происходит потому, что регистрации ID может стать недействительной к тому времени приложения восстанавливается, который поставил бы применения в нерабочем состоянии (то есть, приложение считает, что он зарегистрирован, но сервера и CM не сохраните этот идентификатор регистрации больше, так как приложение не получит больше сообщений).

Заранее спасибо!

ответ

4
  1. Вы сказали:

    Комментарий выше функции следует, что это используется, чтобы «избежать сценария, когда устройство отправляет регистрацию на сервер, а сервер теряет ли это . предполагая, что наши сервера (а не сервера GCM) могут потерять регистрационный номер? Или это потому, что регистрация ID может стать недействительных на GCM стороне вещей?

    Я думаю, что они говорят о наших серверах (сторонних серверах) и NOT GCM-серверах. Второй момент будет ясно, что немного больше.

  2. Кроме того, вы упомянули, что документы говорят:

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

    Я думаю, что если вы внимательно прочитать вторую точку под заголовком Включить GCM на Architectural Overview странице, он говорит:

    Обратите внимание, что Google может периодически обновлять регистрационный номер, так вы должны спроектируйте свое приложение для Android с пониманием , что цельможет быть называется несколько раз. Ваше приложение для Android должно быть способно ответить .

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

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

    Это также может очистить первый пункт. Поскольку этот случай обрабатывает обновление идентификатора со стороны Google, местная 7-дневная действительность будет обрабатывать другой случай потери идентификатора на сервере третьей части (поскольку он обновляется периодически каждые 7 дней).

Это мое мнение о вашем вопросе. Надеюсь это поможет.

+0

ОК. Это очень ясно. Этот абзац архитектурного обзора действительно информативен. Похоже, если у меня есть получатель в моем манифесте, что фильтры для событий 'com.google.android.c2dm.intent.RECEIVE' и' com.google.android.c2dm.intent.REGISTRATION', я могу просто обработать различия в метод 'onReceive' получателя, проверив« register_id »как строку, добавленную в намерении согласно [расширенному информационному документу] (http://developer.android.com/google/gcm/adv.html#reg-state) а затем сохранение нового идентификатора, заданного google, при периодическом обновлении идентификатора. –

+0

Вы правы, что по-старому вы можете напрямую обрабатывать случай обновления идентификатора внутри метода 'onReceive'. Несмотря на то, что способ нажатия кнопки «onReceive» Push был амортизирован. Новый способ предполагает просто прослушивание вещания для этого. Кроме того, по-новому вызов «gcm.register()» (регистрация push) является методом блокировки, в отличие от предыдущего способа регистрации push, где приложение использовало обратный вызов внутри метода 'onRegistered'. –

+0

Я имел в виду метод onReceive для BroadcastReceiver http://developer.android.com/reference/android/content/BroadcastReceiver.html –

3

Чтобы пояснить случай «резервное копирование/восстановление»: идентификатор регистрации привязан к определенному устройству. Если приложение восстанавливается на другом устройстве - предыдущий идентификатор регистрации все еще указывает на старое устройство, единственный способ получить сообщения на восстановленном устройстве - получить новый идентификатор регистрации.

Смежные вопросы