有时移动设备无法收到GCM推送通知

7
我是一个有用的助手,可以为您翻译文本。
我面临着一个奇怪的问题。当移动设备连接到Internet并在服务器端发送消息时,我会收到推送通知。但如果此时它没有连接到互联网,而我稍后连接到互联网。我就无法收到该通知。据我所知,只要我们在线,所有这些通知都应该显示,因为GCM服务器存储了所有这些消息。我能收到其他应用程序的通知。此外,我已在清单中授予了wakelock权限。问题可能来自服务器端、客户端或移动设备吗?请帮忙…… 这个值是从第三方服务(.Net服务器)发送到GCM服务器的:
String postdata= "collapse_key=score_update&time_to_live=2419200&delay_while_idle=1&data.message=‌​" + 
message + "&data.time=" + System.DateTime.Now.ToString() + "&registration_id=" + deviceToken + ""

提前感谢您

1个回答

10

delay_while_idle=1不会在设备处于闲置状态(关闭、离线、锁屏等)时到达设备。如果您想要 wakelock 权限生效,请将其更改为 0。

只是为了澄清一下 - 消息应该在设备停止处于闲置状态后到达设备(只要它没有处于闲置状态太长时间,其中“太长时间”由指定的 time_to_live 确定)。

这里是来自 GCM 文档的相关引用:

delay_while_idle

如果包含,则表示如果设备处于空闲状态,则不应立即发送消息。服务器将等待设备变为活动状态,然后仅发送每个 collapse_key 值的最后一条消息。可选项。默认值为 false,必须是 JSON 布尔值。

time_to_live

如果设备离线,消息应在 GCM 存储上保留多长时间(以秒为单位)。可选(默认生存时间为 4 周,并且必须设置为 JSON 数字)。


1
“延迟空闲时”就是按字面意思——在设备处于空闲状态时延迟消息传递。当设备重新变为活动状态(在线、显示屏开启)时,应该接收到消息。如果您想在设备锁定时唤醒设备并显示通知,则需要使用Wakelock权限。这就是为什么只有在delay_while_idle=0时才使用它才有意义。 - Eran
1
不客气。折叠键(collapse key)的值取决于消息的内容。报告某物最新状态的消息,例如“得分是...”,应具有相同的折叠键,因此如果在设备处于空闲状态时向同一设备发送两条这样的消息,则只会在设备变为活动状态时传递最后一条消息。包含不同数据的消息,例如从聊天中的另一个用户发送的文本,应具有不同的折叠键,以便在设备再次活动时将存储在Google中的所有消息(达到一定限制)都会被传递。 - Eran
1
如果您想要接收两个通知,您必须使用不同的折叠键。 - Eran
1
你想在设备空闲时接收消息,还是希望Google将其推迟直到设备活跃?如果你想要前者,请使用 delay_while_idle=0,否则请使用 delay_while_idle=1 - Eran
1
@ARIJIT,如果你已经弄清楚了,能否分享答案? - Prabhakar
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接