web-dev-qa-db-fra.com

Comment éviter les retards dans Android messages GCM / changer le rythme cardiaque

J'ai lu de nombreux articles concernant un problème GCM qui affecte certaines personnes. Il semble que dans certains appareils/routeurs/opérateurs, les notifications subissent des retards. J'ai rencontré ce problème avec mon routeur: les messages sont arrivés avec beaucoup de retard sur le WIFI mais sont arrivés instantanément lorsque j'ai désactivé le WIFI et que je me suis connecté au réseau mobile.

Il semble qu'il existe une solution de contournement qui peut être effectuée à partir de l'application Android. Quelque chose comme augmenter le rythme cardiaque qui maintient la connexion GCM en vie, ou ainsi.

Quelqu'un peut-il nous dire que devons-nous faire pour éviter ce retard? Comment conserver la connexion avec GCM à partir d'une application Android? Un exemple de code (et où et comment l'utiliser) serait vraiment utile.

Ce message explique le problème. Il indique que "nous pourrions maintenir la connexion active avec un ping toutes les deux minutes depuis le serveur GCM (qui est gratuit)". Comment pouvons-nous faire cela?

Merci beaucoup


Les applications suivantes semblent faire l'affaire. Étonnamment, le premier n'a besoin d'aucune autorisation, le second une connexion Internet et le troisième est uniquement pour les téléphones rootés:

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

Je mettrais cela comme un commentaire dans la première réponse mais je n'ai pas assez de réputation.

J'ai eu un problème similaire et je l'ai résolu en exécutant le code ci-dessous avant d'appeler mon service Web.

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

J'espère que cela vous aidera!

36
Renan Grativol

Il n'est pas nécessaire d'envoyer la pulsation du serveur GCM vers le téléphone, vous pouvez forcer Android lui-même à envoyer la pulsation plus tôt qu'il ne le ferait autrement.

J'ai jeté un œil à l'application Push Notifications Fixer, que j'ai testée et travaillé pour moi, et il semble que tout ce que vous avez à faire est de diffuser les intentions suivantes:

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

Je ne sais pas pourquoi il envoie les deux, vous pouvez en essayer un seul et voir si cela fait l'affaire. Voici le lien vers l'application (je ne suis pas le développeur): https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer.noroot

10
sorin7486

Une solution alternative si vous avez autorisations root - Vous pouvez vérifier et modifier manuellement les temps de pulsation GCM. La valeur par défaut est 900000 (15 minutes). J'ai réglé à 240000 (4 minutes) pour être sûr et éviter les délais d'expiration du routeur de 5 minutes.

Vérifiez le temps de pulsation (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';"

Changer le temps de pulsation (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'

Modifier le temps de pulsation (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?

Vous pouvez le faire en envoyant un message GCM depuis votre serveur à tous les appareils sur lesquels vous souhaitez que ce ping soit effectué. Vous pouvez mettre une charge utile spéciale dans ce message qui serait traitée silencieusement par l'application sur l'appareil (et n'afficher aucune notification). Cependant, un tel ping raccourcira la durée de vie de la batterie des appareils qui utilisent cette application.

1
Eran

Il ne s'agit pas de savoir comment vous recevez le Push, mais de la façon dont vous l'envoyez.

Vous pouvez définir la priorité du message sur "élevé" (d'où vous envoyez le Push, votre serveur)

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

1
dam1