it-swarm.com.de

So vermeiden Sie Verzögerungen bei Android GCM-Nachrichten / Heartbeat ändern

Ich habe viele Posts zu einem GCM-Problem gelesen, von dem einige Personen betroffen sind. Es scheint, dass bei einigen Geräten/Routern/Betreibern die Benachrichtigungen Verzögerungen aufweisen. Ich habe dieses Problem mit meinem Router festgestellt: Nachrichten kamen mit großer Verzögerung über WIFI, aber sofort, wenn ich WIFI deaktivierte und eine Verbindung zum Mobilfunknetz herstellte.

Anscheinend gibt es eine Problemumgehung, die mit der App Android=) durchgeführt werden kann. So etwas wie das Erhöhen des Herzschlags, der die GCM-Verbindung am Leben erhält, oder so.

Kann uns jemand sagen, was wir tun sollen, um die Verzögerung zu vermeiden? Wie können wir die Verbindung mit GCM von einer Android App? Ein Codebeispiel (und wo und wie man es verwendet) wäre wirklich hilfreich.

Dieser Beitrag erklärt das Problem. Es heißt, "wir könnten die Verbindung mit einem Ping alle zwei Minuten vom GCM-Server (der kostenlos ist) am Leben erhalten". Wie können wir das machen?

Danke vielmals


Die folgenden Apps scheinen den Trick zu tun. Überraschenderweise benötigt der erste keine Erlaubnis, der zweite eine Internetverbindung und der dritte nur für gerootete Telefone:

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

33
Ferran Maylinch

Ich würde dies als Kommentar in die erste Antwort setzen, aber ich habe nicht genug Ruf.

Ich hatte ein ähnliches Problem und löste es, indem ich den folgenden Code ausführte, bevor ich meinen Webservice aufrief.

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

Hoffe es hilft dir!

36
Renan Grativol

Es ist nicht erforderlich, den Heartbeat vom GCM-Server an das Telefon zu senden. Sie können Android selbst erzwingen, dass der Heartbeat früher gesendet wird, als dies andernfalls der Fall wäre.

Ich habe mir die Push Notifications Fixer-App angesehen, die ich getestet und für mich gearbeitet habe, und anscheinend müssen Sie nur die folgenden Absichten übertragen:

com.google.Android.intent.action.MCS_HEARTBEAT
com.google.Android.intent.action.GTALK_HEARTBEAT

Ich bin mir nicht sicher, warum es beides sendet. Sie können nur eines ausprobieren und sehen, ob es den Trick macht. Hier ist der Link zur App (ich bin nicht der Entwickler): https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer.noroot

10
sorin7486

Eine alternative Lösung, wenn Sie über Root-Berechtigungen verfügen - Sie können die GCM-Heartbeat-Zeiten manuell überprüfen und ändern. Der Standardwert ist 900000 (15 Minuten). Ich habe mich aus Sicherheitsgründen auf 240000 (4 Minuten) eingestellt und 5 Minuten Router-Timeouts vermieden.

Überprüfen Sie die Heartbeat-Zeit (Shell)

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';"

Ändern der Heartbeat-Zeit (Shell)

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'

Ändern der Herzschlagzeit (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();
2
Greg T

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

Sie können dies tun, indem Sie eine GCM-Nachricht von Ihrem Server an alle Geräte senden, auf denen Sie diesen Ping durchführen möchten. Sie können eine spezielle Nutzlast in diese Nachricht einfügen, die von der App auf dem Gerät unbemerkt verarbeitet wird (und keine Benachrichtigung anzeigt). Ein solcher Ping-Befehl verkürzt jedoch die Akkulaufzeit der Geräte, die diese App verwenden.

1
Eran

Es geht nicht darum, wie Sie den Push erhalten, sondern darum, wie Sie ihn senden.

Sie können die Priorität der Nachricht auf "hoch" setzen (von wo aus Sie den Push senden, Ihren Server)

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

1
dam1