我一直在阅读许多关于影响某些人的GCM问题的帖子。似乎在一些设备/路由器/运营商中,通知遭受延迟。我的路由器经历过这个问题:WIFI上的消息有很多延迟,但是当我禁用WIFI并连接到移动网络时,消息就会立即出现。
似乎可以通过Android应用程序完成解决方法。像增加心跳一样保持GCM连接活着的东西。
有人能告诉我们应该怎样做才能避免延误?我们如何通过Android应用程序保持与GCM的连接?代码示例(以及在何处以及如何使用它)将非常有用。
This post解释了这个问题。它说“我们可以通过每两分钟从GCM服务器(这是免费的)ping一直保持连接”。我们怎么能这样做?
非常感谢
以下应用似乎可以解决问题。令人惊讶的是,第一个不需要任何许可,第二个是互联网连接,第三个仅适用于有根电话:
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
答案 0 :(得分:36)
我会在第一个答案中将其作为评论,但我没有足够的声誉。
我有一个类似的问题,我在调用我的webservice之前解决了它执行下面的代码。
context.sendBroadcast(new Intent("com.google.android.intent.action.GTALK_HEARTBEAT"));
context.sendBroadcast(new Intent("com.google.android.intent.action.MCS_HEARTBEAT"));
希望对你有所帮助!
答案 1 :(得分:10)
没有必要将心跳从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
答案 2 :(得分: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();
答案 3 :(得分: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?
您可以通过从服务器向您希望执行此ping操作的所有设备发送GCM消息来实现此目的。您可以在该消息中放置一些特殊的有效负载,这些负载将由设备上的应用程序静默处理(并且不显示任何通知)。但是,此类ping会缩短使用此应用程序的设备的电池寿命。
答案 4 :(得分:1)
这不是关于你如何接受推送,而是关于你如何发送它。
您可以将邮件的优先级设置为“高”(从您发送推送的位置,服务器)
https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message