Как избежать задержки в сообщениях GCM Android / изменении сердечного ритма

Я читал много сообщений о проблеме GCM, которая затрагивает некоторых людей. Похоже, что в некоторых устройствах / маршрутизаторах / перевозчиках уведомления страдают от задержек. Я столкнулся с этой проблемой с моим маршрутизатором: сообщения приходили с большой задержкой в ​​WIFI, но мгновенно пришли, когда я отключил WIFI и подключился к мобильной сети.

Кажется, есть обходное решение, которое можно сделать из приложения для Android. Что-то вроде увеличения пульса, который поддерживает соединение GCM, или так.

Может ли кто-нибудь сказать нам, что мы должны делать, чтобы избежать задержки? Как мы можем поддерживать связь с GCM с Android-приложением? Пример кода (и где и как его использовать) был бы действительно полезен.

Эта статья объясняет проблему. В нем говорится, что «мы могли бы поддерживать связь с помощью ping каждые две минуты с сервера GCM (что бесплатно)». Как мы можем сделать это?

большое спасибо


Следующие приложения, похоже, делают трюк. Удивительно, но первый не нуждается в разрешении, второе подключение к Интернету и третье – только для корневых телефонов:

https://play.google.com/store/apps/details?id=at.pansy.droid.gcmWifiFix

https://play.google.com/store/apps/details?id=com.elotro.pushheartbeat

https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer

Я бы поставил это в качестве комментария в первом ответе, но у меня недостаточно репутации.

У меня была аналогичная проблема, и я решил, что она выполняет код ниже, прежде чем называть мой веб-сервис.

context.sendBroadcast(new Intent("com.google.android.intent.action.GTALK_HEARTBEAT")); context.sendBroadcast(new Intent("com.google.android.intent.action.MCS_HEARTBEAT")); 

Надеюсь, это поможет вам!

Вам не нужно посылать пульс с сервера GCM на телефон, вы можете заставить сам андроид отправить сердцебиение раньше, чем это было бы иначе.

Я посмотрел приложение Push Notifications Fixer, которое я тестировал и работал для меня, и, похоже, все, что вам нужно сделать, это трансляция следующих целей:

 com.google.android.intent.action.MCS_HEARTBEAT com.google.android.intent.action.GTALK_HEARTBEAT 

Я не уверен, почему он отправляет оба, вы можете попробовать только один и посмотреть, не делает ли он трюк. Вот ссылка на приложение (я не разработчик): https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer.noroot

"we could keep the connection alive with a ping every two minutes from the GCM server (which is free)". How can we do that?

Вы можете это сделать, отправив сообщение GCM с вашего сервера на все устройства, по которым вы хотите выполнить этот пинг. В этом сообщении вы можете добавить специальную полезную нагрузку, которая будет обрабатываться без помощи приложения на устройстве (и не отображать никаких уведомлений). Однако такой пинг сократит время автономной работы устройств, которые используют это приложение.

Альтернативное решение, если у вас есть права root. Вы можете вручную проверить и изменить время пульса GCM вручную. Значение по умолчанию – 900000 (15 минут). Я установил 240000 (4 минуты), чтобы быть в безопасности и избежать 5-минутных тайм-аутов маршрутизатора.

Проверьте время биения (оболочка)

 adb shell su sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "SELECT * FROM main WHERE name ='gtalk_max_server_heartbeat_time';" sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "SELECT * FROM main WHERE name LIKE 'gtalk_%heartbeat_ping_interval_ms';" 

Изменение времени сердцебиения (раковина)

 sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "UPDATE main SET value = '240000' WHERE name = 'gtalk_max_server_heartbeat_time' sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "UPDATE main SET value = '240000' WHERE name LIKE 'gtalk_%heartbeat_ping_interval_ms' 

Изменение времени биения (Android)

 Process proc = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(proc.getOutputStream()); os.writeBytes("sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \"UPDATE main SET value = '240000' WHERE name = 'gtalk_max_server_heartbeat_time'\"\n"); os.writeBytes("sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \"UPDATE main SET value = '240000' WHERE name LIKE 'gtalk_%heartbeat_ping_interval_ms'\"\n"); os.writeBytes("exit\n"); os.writeBytes("exit\n"); os.flush(); os.close(); proc.waitFor(); 

Дело не в том, как вы получаете толчок, а о том, как вы его отправляете.

Вы можете установить приоритет сообщения на «высокий» (откуда вы отправляете push, ваш сервер)

https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message

Intereting Posts
Использовать телефон Android в качестве платы ARM dev? Наличие двух групп с одним выбором в ActionBar не работает, но добавление всплывающего меню вместо этого не работает Android Studio – JAVA_HOME не указывает на действительную установку JVM Загрузка файла HTML не отображает галерею на Android Ошибка при установке приложения (INSTALL_FAILED_DEXOPT) Как использовать onItemLongClick для отображения контекстного меню? URL-адрес фильтра андроидов в «прицельном фильтре» Ошибка Android Volley в getInstance (это) при добавлении ImageLoader Программирование Wi-Fi в Android Как отобразить объект Java HttpPost в виде строки? Разрешить Dropbox API для доступа к моей учетной записи на устройстве пользователя. Компонент Android DrawerLayout Open failed: ошибка ENOENT (такой файл или каталог) Приложение для перезапуска камеры Apache Cordova на Galaxy S5 Свяжите все ссылки для локального переименования (не меняйте ссылки в других файлах)