【友盟+】开发者社区

安卓设备状态离线现象剖析

zhaoheng 发表于 2017-11-1 15:24:46 |

zhaoheng
zhaoheng 发表于 2016-3-7 13:45:59 | 显示全部楼层 |阅读模式
本文概览:
1、设备离线的表现。
2U-Push应对设备离线的策略。
3、排查设备状态离线原因的方法。
4、令设备重新在线的方法。

一.   设备离线的表现:
用户设备收不到消息  或者  收到消息延时
安卓设备如果经常出现上述两种状况,很有可能是因为发送消息时设备状态为离线所造成的。

二.U-Push应对设备离线的策略:
U-Push针对设备离线情况,做出如下应对策略:
1、任何集成了U-PushAPP都可以作为宿主被pushservice挂靠,从而帮助路由消息。
目前U-PushAPP联盟已经十分庞大,加上如今日头条,唱吧,暴风影音,迅雷等高质量APP的加入,更保证了推送效率。
2、如手机淘宝,UC浏览器,闲鱼等有合作关系的阿里系APP,也可以帮助路由消息,达到相似的效果。
有以上策略的帮助,消息的送达率及所谓的送达速度将会有显著地提高。

三.排查设备状态离线原因的方法:
1、查询设备状态
判断设备长连是否在线应该在在U-Push后台--工具--设备状态查询里面查询,如下图:
查询时,有可能会出现其他的设备状态,如设备离线,设备未注册以及设备状态不存在等状态。如遇以上情况,请参考下文:Android查询设备状态,几种状态的解释说明
      如果设备长连在线仍然没有收到:可以查询下,设备状态有个最后更新时间,如下图:
       统计设备长连在线时间(最后更新时间)有时是有一些延时的。有可能最后更新时间时设备在线,但当前设备已经是离线状态了。

2、设备在线的影响条件
设备长连在线只和三个条件有关:
1、网络环境稳定良好   
2pushservice运行
3push service连接上友盟服务器。

       判断pushservice是否运行,要在设定--应用程序管理--运行中进行查看进程,如下图:


       你也可以通过 adbshell ps | grep com.umeng.message.example 这个指令查询到友盟push的进程,如下图:


       说到pushservice,我们就要引入“宿主”的概念了。
       由于pushSDK在设计上采取了多路复用的技术方案,即设备上多个集成了友盟消息推送SDKApp会共用一条长连通道, push service会挂靠在某一个App上,此时长连service所挂靠的App称为“宿主”。
       综上,若自己的App不是宿主,而是挂在别的App上,我们会提示目前的宿主是用户设备中的哪款App,并附上当时设备的device_token,如下图:

(图为2015年圣诞前夕,友盟推送的节日特别页面)

       如上文所说,设备在线时,pushservice应该是运行的。但也有可能push service在用户设备上存在,却未连接到U-Push的服务器,从而导致了设备离线。检查此种情况,你可以在logcat里面,查看push service的心跳信息,如下图:

       消息推送采用的是动态心跳机制,根据网络状态(2G3G, 4G, WIFI)、机型等维度的不同,心跳的频率也有所差异。心跳可以通过在logcat中查看,输入heart进行过滤。如果网络闪断,重连的时间一般会在秒级,网速越好,时间越短。如果长连接断开,重连的检测数据是不对外开放的,并且友盟消息推送采用的是多路复用机制,长连接是由宿主负责维护。如果有心跳信息的话,说明用户设备到友盟推送服务器之间的长连接是畅通的,但是有可能消息已经推送到了设备上,却并没有被展示出来。此时,你可以再查询一下设备的消息历史,如下图所示

       这里我来解释下“已送达“这个状态的定义。”已送达“说明消息已经确实被下发。消息送达到设备后,设备返回给友盟推送服务器一个ack回执,告诉服务器端App已经收到消息,服务器才会把状态归档成”已送达”。
       此外,通过查看logcat里面的onMessage,也可以打印出来消息是否已经送到,如下图:

       当你通过上述两种方式确定消息已经下发到手机,但是并没有显示出来后,你需要检查以下情况:
1 包名填错了,即包名与申请时所填的包名不一致;因此,消息无法路由到App头上。
2 在之前的代码里调用了PushAgent.setPushIntentServiceClass(MyPushIntentService.class)
后来又将该代码注释了。但是由于,SDK使用的SharedPreference存储该IntentService变量名,故虽然代码被注释了,但仍然可以从SharedPreference里读取到相应的IntentService,从而导致错误。
遇到此种情况,你只需把app清理数据或者重新安装便可解决。
3 有可能是个别机型或者个别设备的适配问题所导致的,可以尝试换个其他型号的设备再进行测试。

四.令设备重新在线的方法
1、一般手动关闭APP进程,再打开,即可解决设备离线问题。
2、如果仍未解决,可以在手机中安装其他集成了U-PushAPPUC、闲鱼、手机淘宝等阿里系APP。如果此时设备在线或收到消息,则基本可以确定是集成过程中出现了问题。
3、如果你的设备仍然离线请再检查下WiFi里的高级设置,里面有个屏幕关闭后,WiFi长连的选项,建议设置成“始终”。有一些设备锁屏后会默认直接断网,从而导致设备离线。
4、如果你的设备是MIUI系统或其他定制化第三方安卓系统,则可能是应用的自启动默认被禁用了。如遇到此种情况,请参考下文:关于MIUI 7.3版本收不到消息进行相关设置。
5、三星系统有个自带的app,叫智能管理器,里面可以管理电池和内存。内存选项里面有个自启动程序,只有允许后,应用才可以在屏幕关闭时继续运行。





上一篇:测试消息发送出去了,但是android端收不到
下一篇:iOS推送 全部用户显示筛选结果为空,但是单播正常


沉于海底的信
沉于海底的信 发表于 2017-1-5 11:30:13 | 显示全部楼层
懂了点。

umeng_develop
umeng_develop 发表于 2017-3-7 16:19:49 | 显示全部楼层
说了半天,也没有解决我的问题
为什么APP杀掉进程就处于离线状态就不能接收提送了?????

所以
所以 发表于 2017-10-14 09:37:24 | 显示全部楼层
umeng_develop 发表于 2017-3-7 16:19
说了半天,也没有解决我的问题
为什么APP杀掉进程就处于离线状态就不能接收提送了????? ...

同样的问题 请问你解决了吗

旧唱片g
旧唱片g 发表于 2017-10-15 17:09:43 | 显示全部楼层
我有问题想问。

那小谁
那小谁 发表于 2017-11-1 15:24:46 | 显示全部楼层
现在很多Android机 kill掉APP service也同时被kill了, 虽然说是有相互唤醒机制,但经过测试 依旧存在打开淘宝后 依旧唤不醒服务,而且我要是不打开淘宝 那服务岂不是一直都收不到,淘宝貌似service存活的到时比较稳定, 唯一百分百管用的是 在打开APP后 服务才会被建立 然后收到消息。 请问 有没有个明确的解决方案?
您需要登录后才可以发帖 登录 | 立即注册

本版积分规则

发表主题

精彩推荐

【报错必看】微信您的应用签名不正确,请去微信后台确认
微信如果提示这个错误,请查看debug日志: 箭头所指的为你当前应用的签名及包名,然后打开你的微信后台
无法检测设备有效性
无法检测设备有效性
自定义事件有消息数量,却看不到详情
集成都是OK的,能看到自定义事件的消息数量。却看不到详细的详情。 总是显示数据无法加载,稍后重试。

关注我们

新浪微博
微信

欢迎关注友盟官方微博微信!

在线客服
返回顶部 返回列表