Подтвердить что ты не робот

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

Я читал много сообщений о проблеме 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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Нет необходимости посылать пульс с сервера 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

Ответ 3

Альтернативное решение, если у вас есть права 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();

Ответ 4

"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 с вашего сервера на все устройства, на которых вы хотите выполнить этот пинг. В этом сообщении вы можете добавить специальную полезную нагрузку, которая будет обрабатываться без помощи приложения на устройстве (и не будет выводить никаких уведомлений). Однако такой пинг сократит время автономной работы устройств, которые используют это приложение.