web-dev-qa-db-ja.com

Android GCMメッセージ/ハートビートの変更で遅延を回避する方法

一部の人々に影響を与えるGCMの問題に関する多くの投稿を読んでいます。一部のデバイス/ルーター/キャリアでは、通知が遅延するようです。ルーターでこの問題が発生しました。WIFIでメッセージに大きな遅延が発生しましたが、WIFIを無効にしてモバイルネットに接続するとすぐにメッセージが表示されました。

Androidアプリから実行できる回避策があるようです。GCM接続を維持するハートビートを増やすなどのようなものです。

遅延を回避するために私たちが何をすべきか誰にも教えてもらえますか? AndroidアプリからGCMとの接続を維持するにはどうすればよいでしょうか?コード例(およびそれをどこでどのように使用するか)は本当に役立ちます。

この投稿 は問題の説明です。 「GCMサーバーからの2分ごとのpingで接続を維持できます(無料)」。どうすればそれができますか?

どうもありがとう


以下のアプリがトリックを行っているようです。驚くべきことに、最初のものは許可を必要とせず、2番目のものはインターネット接続であり、3番目のものは根ざした携帯電話専用です:

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

これを最初の答えにコメントとして入れますが、評判は十分ではありません。

同様の問題があり、ウェブサービスを呼び出す前に以下のコードを実行して解決しました。

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

それがあなたを助けることを願っています!

36
Renan Grativol

GCMサーバーから電話にハートビートを送信する必要はありません。そうでない場合は、Android自体がハートビートをより早く送信するように強制できます。

Push Notifications Fixerアプリを確認しましたが、これをテストして作業しましたが、必要なのは次のインテントをブロードキャストすることだけです。

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

なぜ両方を送信するのか分かりません。1つだけを試して、それがうまくいくかどうかを確認できます。アプリへのリンクは次のとおりです(私は開発者ではありません): https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer.noroot

10
sorin7486

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();
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?

これを行うには、サーバーからこのpingを実行するすべてのデバイスにGCMメッセージを送信します。デバイスのアプリによってサイレントに処理される(および通知を表示しない)メッセージに特別なペイロードを入れることができます。ただし、このようなpingは、このアプリを使用するデバイスのバッテリー寿命を短くします。

1
Eran

プッシュの受け取り方法ではなく、プッシュの送り方です。

メッセージの優先度を「高」に設定できます(プッシュの送信元、サーバー)

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

1
dam1