33

我一直在阅读许多有关影响某些人的 GCM 问题的帖子。似乎在某些设备/路由器/运营商中,通知会出现延迟。我的路由器遇到过这个问题:消息在 WIFI 上延迟很多,但在我禁用 WIFI 并连接到移动网络时立即出现。

似乎有一种解决方法可以从 Android 应用程序中完成。诸如增加心跳以使 GCM 连接保持活跃之类的东西。

谁能告诉我们应该怎么做才能避免延误?我们如何从 Android 应用程序保持与 GCM 的连接?一个代码示例(以及在哪里以及如何使用它)将非常有帮助。

这篇文章解释了这个问题。它说“我们可以通过 GCM 服务器(免费)每两分钟 ping 一次来保持连接处于活动状态”。我们怎么能做到这一点?

非常感谢


以下应用程序似乎可以解决问题。令人惊讶的是,第一个不需要任何权限,第二个是互联网连接,第三个仅适用于 root 手机:

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

4

5 回答 5

36

我会在第一个答案中将此作为评论,但我没有足够的声誉。

我有一个类似的问题,我在调用我的 web 服务之前执行了下面的代码解决了它。

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

希望对你有帮助!

于 2014-05-28T04:16:08.843 回答
10

无需将心跳从 GCM 服务器发送到手机,您可以强制 android 本身更快地发送心跳,否则它会这样做。

我查看了我测试并为我工作的 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

于 2014-02-06T07:13:02.267 回答
2

如果您有root 权限,另一种解决方案- 您可以手动检查和更改 GCM 心跳时间。默认值为 900000(15 分钟)。我设置为 240000(4 分钟)以确保安全并避免 5 分钟路由器超时。

检查心跳时间(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';"

更改心跳时间(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'

更改心跳时间 (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();
于 2016-07-29T17:03:58.247 回答
2

这与您如何接收推送无关,而与您如何发送推送有关。

您可以将消息的优先级设置为“高”(从您发送推送的位置,您的服务器)

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

于 2017-08-22T02:39:53.960 回答
1

"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 消息从您的服务器发送到您希望执行此 ping 的所有设备来做到这一点。您可以在该消息中放置一些特殊的有效负载,设备上的应用程序会静默处理这些有效负载(并且不显示任何通知)。但是,此类 ping 会缩短使用此应用程序的设备的电池寿命。

于 2013-10-24T17:11:52.413 回答