相信大多人的项目中都会用到推送,极光友盟等,然而经常又被运营和测试问:为什么收不到推送???
我的结论是这样的(以极光为例):
一:app在运行中:
基本上是可以收到推送的。如果无法收到推送,可能有以下几种:
1、没有网络(一般可以忽略,用户、测试、运营都不是笨蛋);
2、手机设置的问题(可以参考这里进行设置:
https://community.jiguang.cn/t/android/606/2 ),严格来说这种情况不是收不到推送,而是推送没有显示到通知栏;
3、集成出错(测试通过,key核对过,基本上也可以忽略);
4、第三方服务出错(可能性很小,基本上可以忽略);
综上:运行中无法收到推送,基本上就可以判定是设置问题了。
二:APP不在运行中:
可能收到推送,也可能收不到推送,取决于后台是否有极光服务进程。
不在运行中无法收到推送的问题,是无法解决的,这个后面在说。
在这种情况下,能收到推送是因为后台仍保留极光服务进程,反之亦然。这个极光服务可能是你的app生成的,也可能是其他app生成的,只要有一个极光服务在,并且启动它的主线程开启了共享极光服务,你app也开启了共享极光服务(推荐大家开启),就能正常收到推送,互相融达。
例如:大多数时候,app退出时是被一键清理,这种情况下基本上所有app都被杀死了,那么这种情况下有很大概率是收不到推送的。
三、为什么有的手机一键杀死却可以收到通知
据我所知安卓6.0之前的原生系统是可以做到被杀死之后自动重启服务的,这也是极光早期非常好用的原因,那会大多人还在用安卓原生系统。而谷歌在安卓6.0之后也禁止这种流氓行径了。
四、QQ和微信为什么可以?
其实QQ和微信也不可以,在某些系统上默认开设白名单而已,比如MIU系统,默认QQ和微信是在白名单的,允许自启动,允许推送等。
五、苹果为什么可以?
完全是两套不同机制。苹果手机上的app只连接苹果服务器,只要往苹果服务器推消息就行。而安卓每个app都链接一个服务器,例如我们的app链接到我们服务器。
六、有没有办法通过实现常驻进程来解决这个问题?
网上说的什么root,保留一像素,双进程守护,从底层fork的方法,都是不可用的。我个人没有逐个验证,但是最简单想一想就知道了,如果可以实现,为什么极光不做到常驻呢?
所以说,不在运行中无法收到推送的情况,是无法解决的,无法常驻内存,那么肯定服务都不在运行的时候,如何受到推送呢?这暂时是个无解的问题。
希望对大家有所帮助,欢迎打脸。