Intereting Posts
Самые популярные разрешения экрана / соотношения среди планшетов Android и смартфонов Android: mkdirs () / mkdir () на внешнем хранилище возвращает false Могу ли я использовать Corona sdk для создания неигровых приложений? Как выделить выбранный элемент просмотра ресайклеров? Android Studio застряла при создании нового Project on Gradle: Configure Project или Gradle: Resilve Dependencies ': classpath:' Переменная точка наблюдения не работает в проектах Eclipse / ADT Android Уменьшите размер растрового изображения до указанного размера в Android Как я могу создать круг, в котором есть число? Android EditText в ListView – клавиатура Передача сообщения всем доступным машинам по WiFi Ошибка с аннотациями Override в Eclipse Не удалось экспортировать приложение после обновления до Proguard 4.8 Cocos2d-xv 2.0.4 FATAL EXCEPTION GLThread при запуске на эмуляторе Android Android queryIntentActivities всегда возвращает пустой список Эмуляция карты с помощью программного обеспечения NFC

Время доставки GCM-сообщений WILDLY беспорядочно

Я настроил Android-приложение с поддержкой GCM и попробовал небольшое тестовое приложение для отправки сообщения в приложение. Когда я запускаю приложение в эмуляторе, я вижу (через протоколирующие сообщения), что он регистрируется с помощью GCM и получает токен.

Затем, когда я помещаю токен в свое тестовое приложение и отправляю сообщение с сообщением, результат показывает, что отправлено 1 msg, 0 не удалось, а 0 – изменения идентификатора.

Иногда msg появляется почти сразу, иногда это занимает 20 минут. В пятницу мои 2 тестовые сообщения заняли 15 и 20 минут. Первые 2, которые я отправил сегодня утром, были немедленно, следующий еще не появился – всего 10 минут …

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

Solutions Collecting From Web of "Время доставки GCM-сообщений WILDLY беспорядочно"

У нас была та же проблема, но она варьировалась от сети к сети. Мы считаем, что маршрутизатор домашнего хаба (Virgin Super Hub) отключил связь после пяти минут бездействия. Вы можете подтвердить, отправив пустое сообщение GCM каждые две минуты, чтобы сохранить соединение в живых.

Ниже приведено более подробное объяснение того, что мы сделали: https://groups.google.com/d/msg/android-gcm/Y33c9ib54jY/YxnCkaPRHRQJ

Вы не можете гарантировать быструю доставку, потому что подключение GCM к устройству может быть неудовлетворительным, как указывает CommonsWare. Однако есть две возможные задержки в доставке: 1) GCM, подключаемый к телефону (как упоминалось ранее) и 2) Задержка в сообщении, фактически отправляемом с сервера GCM. Если вы установите для параметра «time_to_live» значение 0 секунд в отправляющем приложении, вы можете, по крайней мере, проверить, где происходит задержка.

Значение 0 секунд означает, что сообщение будет отправлено немедленно, и если доставка не удалась, сообщение будет отброшено на сервере GCM. Это не практическое значение для использования в реальной жизни, но позволит вам узнать, какая часть маршрута доставки вызывает задержку.

Сообщается, что у GCM есть довольно серьезная проблема, когда сердечный ритм keep-alive не является настолько надежным. Поэтому, поскольку он отправляется только один раз каждые 15 минут (через 3G) или 28 минут (по Wi-Fi), если по какой-либо причине соединение с сервером отключено, оно может не восстанавливаться в течение нескольких длинных минут.

Эти типы махинаций побудили к разработке решения, которое не полагается на стороннюю сеть для доставки широкомасштабируемых и надежных push-уведомлений в офлайн-приложениях Android.

https://help.pubnub.com/entries/21720011-Can-my-Android-App-Receive-Messages-While-Inactive

Это действительно вызвано нереалистичными интервалами пульса в Google Cloud Messaging.

Это, возможно, самая неприятная ошибка в GCM. GCM работает, поддерживая соединение в режиме ожидания с Android-устройством на серверах Google. Это здорово, потому что он едва потребляет энергию батареи (вопреки опросу), и это позволяет мгновенно разбудить устройство при поступлении сообщения. Чтобы убедиться, что соединение остается активным, Android отправит биение каждые 28 минут на мобильное соединение и каждые 15 минут на WiFi. Если не удалось сердцебиение, соединение было прекращено, и GCM восстановит его и попытается получить любые ожидающие push-уведомления. Чем выше интервал сердцебиения, тем меньше потребляется аккумулятор и меньше времени, которое устройство должно пробуждаться от сна.

Тем не менее, это идет по отличной цене: чем дольше интервал сердцебиения, тем больше времени требуется для идентификации сломанного соединения сокета. Google не тестировал эти интервалы в реальных ситуациях достаточно тщательно, прежде чем развертывать GCM. Проблема с этими интервалами вызвана сетевыми маршрутизаторами и мобильными операторами, которые отключили простоя разъемов через несколько минут бездействия. Обычно это чаще встречается с дешевыми домашними маршрутизаторами, чьи производители решили максимально продолжительное время простоя подключения к сокету и прекратить его для экономии ресурсов. Эти маршрутизаторы могут обрабатывать только конечное число одновременных подключений, поэтому эта мера берется для предотвращения перегрузки. Это приводит к завершению сокетов GCM, и когда придет время доставить сообщение GCM, оно не доходит до устройства. Устройство только осознает, что соединение было сломано, когда пришло время отправить пульс, 0 – 28 минут спустя, делая бесполезным push-уведомление в некоторых ситуациях (когда сообщение является критическим по времени, например). По моему опыту, самые дешевые маршрутизаторы заканчивают бездействующие соединения примерно через 5-10 минут бездействия.

Я написал целую запись об этом и других проблемах GCM:

http://eladnava.com/google-cloud-messaging-extremely-unreliable/

Альтернатива облачным сообщениям Google

Pushy ( https://pushy.me/ ) – это автономный шлюз push-уведомлений, полностью независимый от GCM. Он поддерживает собственное подключение к фоновому сокету, как и GCM, для получения push-уведомлений. Основным протоколом является MQTT, чрезвычайно легкий протокол pub / sub, использующий очень небольшую пропускную способность сети и аккумулятор.

Огромное преимущество Pushy заключается в том, что код для отправки push-уведомления (с сервера) и регистрации устройства для push-уведомлений фактически взаимозаменяем между GCM и Pushy. Это делает его очень простым переключиться на Pushy после внедрения GCM и вынудить его отказаться от его нестабильности.

(Полное раскрытие: я основал Pushy для своих собственных проектов и понял, что многие приложения выиграют от такой услуги)

Этот вопрос очень важен для меня.

Я установил этот код внутри одного таймера Handler для отправки сообщения GCM каждые 2 минуты. Надежда состоит в том, что он будет поддерживать жизнь

if ((mOneSecondTick %120) == 0){ // q 1 minute check when we got last call.... long lDiff = System.currentTimeMillis() - GCMlastCall; if (PushAndroidActivity.GCMAvailable){ Log.d("pushAndroidActivity",String.format("(mOneSecondTick %d",lDiff)); if (lDiff > 122 * 1000){ // more than a minute Intent intent = new Intent(StayInTouch.this,PushAndroidActivity.class); 2startActivity(intent); }else{ // every 2 minutes send out a gcm message... asyncWebCall(String.format(AgeingLib.GCMTICKLE,androidid),0); return; // only if it sends a tickle and all is well... } }else{ Log.d("pushAndroidActivity",String.format("(mOneSecondTick mod60 no GCM on this device")); } } 

GCMlastCall – это последний раз, когда сообщение было получено, поэтому мы можем сказать, остановлен ли gcm.

Работая на пару дней, сейчас кажется ОК

Есть ли что-нибудь, что я могу сделать, чтобы сделать сроки доставки стабильно быстрыми?

В производстве сроки доставки будут сильно варьироваться, поскольку мобильные устройства являются мобильными и, следовательно, имеют переменную возможность подключения, помимо любых проблем с доставкой в ​​рамках самого GCM.