How to avoid delay in Android GCM messages / change heartbeat

后端 未结 5 1970
长发绾君心
长发绾君心 2020-11-28 21:14

I\'ve been reading many posts regarding a GCM issue that affects some people. It seems that in some devices/routers/carriers the notifications suffer delays. I\'ve experienc

相关标签:
5条回答
  • 2020-11-28 21:52

    It's not about how you receive the push, it's about how you send it.

    You can set the priority of the message to "high" ( From where you send the push, your server )

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

    0 讨论(0)
  • 2020-11-28 22:04

    An alternative solution if you have root permissions - You can check and change the GCM heartbeat times manually. The default is 900000 (15 minutes). I set to 240000 (4 minutes) to be safe and avoid 5 minute router timeouts.

    Check heartbeat time (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';"
    

    Change heartbeat time (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'
    

    Change heartbeat time (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();
    
    0 讨论(0)
  • 2020-11-28 22:08

    I would put this as a comment in the first answer but I don't have enough reputation.

    I had a similar issue and I solved it executing the code below before calling my webservice.

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

    Hope it help you!

    0 讨论(0)
  • 2020-11-28 22:14

    There's no need to send the heartbeat from the GCM server to the phone, you can force android itself to send the heartbeat sooner that it would otherwise do.

    I had a look at the Push Notifications Fixer app, which I tested and worked for me, and it seems all you need to do is broadcast the following intents:

    com.google.android.intent.action.MCS_HEARTBEAT
    com.google.android.intent.action.GTALK_HEARTBEAT
    

    I'm not sure why it's sending both, you can try only one and see if it does the trick. Here's the link to the app (I'm not the developer): https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer.noroot

    0 讨论(0)
  • 2020-11-28 22:17

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

    You can do that by sending a GCM message from your server to all the devices on which you wish this ping to be performed. You can put some special payload in that message that would be processed silently by the app on the device (and not display any notification). However, such ping will shorten the battery life of the devices that use this app.

    0 讨论(0)
提交回复
热议问题