Задержка нисходящего сообщения Google Cloud Messaging (GCM)

Я загрузил и настроил Android gcm-client и gcm-demo-server (http-сервер) с http://code.google.com/p/gcm/ . Мне удалось получать нисходящие сообщения в моем приложении Android gcm-client. Я провел множество тестов со следующими характеристиками:

  1. Сервер использовал либо ключ API браузера, либо ключ API сервера.
  2. Соединение для передачи данных было либо 3G, либо WiFi
  3. В отправленное сообщение включены/не включены дополнительные данные.
  4. В отправленном сообщении был/не был ключ свертывания.
  5. В отправленном сообщении для параметра delayWhileIdle установлено значение false.
  6. В отправленном сообщении для timeToLive установлено значение 0 или 5 минут.
  7. Сервер располагался в двух разных местах в Европе.
  8. Приложение для Android работает на двух устройствах, расположенных в разных местах Европы.

Во всех случаях приложение получает отправленные сообщения через 25-30 секунд с момента их отправки. Тем не менее, я протестировал другие приложения для Android, которые используют нисходящие сообщения GCM, и в большинстве случаев сообщения приходят почти мгновенно (‹5 секунд).

Могу ли я что-то изменить в клиенте или сервере, чтобы сообщения быстрее поступали в приложение?

Я также пытался использовать сервер gcm XMPP (приложение Java с использованием Smack), указанный в http://developer.android.com/google/gcm/ccs.html, но мне не удалось отправить ни одного сообщения. В ответе, который я получаю от GCM Cloud Connection Server (CCS), говорится: «Проект XXXXXXXXXX не внесен в белый список». Наиболее возможная причина заключается в том, что моя регистрация в CCM еще не одобрена, как описано в Google CCS. (GCM) - проект не внесен в белый список . Как я читал на разных сайтах, одобрение обычно занимает более 2-3 месяцев, поэтому, скорее всего, я не смогу протестировать сервер XMPP в ближайшее время.

Возможно ли, что вы можете получать почти мгновенные сообщения только с помощью сервера XMPP? Кто-нибудь сталкивался с задержками при использовании сервера XMPP?

заранее спасибо


person retset    schedule 21.01.2014    source источник
comment
Откуда вы знаете, что другие приложения для Android имеют задержку ‹5 секунд? Я нашел 25-30 секунд очень разумными для службы, которая может отправлять/транслировать сообщения на миллионы устройств.   -  person Flow    schedule 21.01.2014
comment
Тестируя их. Например, в приложении для обмена текстовыми сообщениями вы можете отправить сообщение как пользователь и получить его как другой пользователь, а также измерить время доставки.   -  person retset    schedule 22.01.2014
comment
И откуда вы знаете, что GCM участвует в доставке сообщений?   -  person Flow    schedule 22.01.2014
comment
Отслеживая пакеты, полученные приложением от удаленного хоста (сервера GCM) через порт 5228.   -  person retset    schedule 22.01.2014


Ответы (1)


Я думаю, что проблема в демо-версии gcm-client для Android, которая сохраняет сообщение, а не в gcm-сервере. В файле GcmIntentService.java демонстрационного примера gcm-client видно, что функция protected void onHandleIntent(Intentintent) имеет следующий код:

[...]
// If it's a regular GCM message, do some work.
} else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
// This loop represents the service doing some work.
    for (int i = 0; i < 5; i++) {
    Log.i(TAG, "Working... " + (i + 1)
            + "/5 @ " + SystemClock.elapsedRealtime());
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
    }
}
[...]

Этот код приостанавливает приложение Android на 5 секунд на каждой итерации (всего 25 секунд) перед отправкой уведомления. Вы можете удалить этот код, потому что это пример, и вы можете вставить в оператор else if некоторую работу, прежде чем показывать уведомление.

Я внедрил сервер xmpp, и я получаю уведомление через ‹5 секунд, конечно, без этого рабочего кода.

Надеюсь, что это поможет и извините за мой плохой английский.

person zhalk    schedule 30.07.2014
comment
Спас мою задницу, зачем им ставить этот кусок кода??!? так зря.. Спасибо! - person idish; 05.12.2014