手机推送系统中的坑和解决方法,这是我在做一个推送系统时遇到的问题, 分享下, 希望对大家有帮助
APNS推送, 需要自己保存ios上报的token, APNS本身不提供全网推送接口, 如果要做一次全网推送, 需要从数据库中查出所有token, 逐个推送. 对于一个用户量较高的APP, 需要存储的token数, 可能在百万或者千万级.
-
国内到APNS服务器网络问题 我们项目中, 从国内某机房, 做一次6w的批量推送, 需要10~15分钟. 增加到APNS的连接数, 也无法提升速度. 解决方法: 把APNS调用服务部署到了香港机房, 同样一次6w的批量推送, 10秒左右就完成了, 速度提升近100倍. 可见国内某些机房到APNS服务器, 网络有很大问题.
-
token相关
-
用户如果不允许通知权限, 是无法获取token的. 用户卸载APP, 或者禁用通知, 一般来说APP也无法得知.
-
根据IOS版本的不同, 卸载重装APP, token可能变, 也可能不变. 用户升级/重装操作系统, 也可能会变. 所以每次启动APP, 都需要重新上报token.
-
调用APNS推送, 对于已经卸载APP或者禁用通知的用户, APNS是不会有特殊返回值的.
-
APNS调用报错: invalid token (8) token非法, 最常见的产生原因 : ios开发, 测试, 企业版内测, 提交APPSTORE都有不同的bundleId, 而每个bundleId都对应不同的推送证书, 如果token存储的时候没有区分bundleId, 调用时就会产生错误8. 错误8太多, APNS有可能会断掉推送的http2长连接, 导致推送失败率增加.
解决方法: 记录每个token对应的bundleId. 可以做到无论任bundleId的版本, 连正式/测试, 都可以收到APNS推送.
- 发送用户看不到的通知
如果调用APNS的时候, 不传alert等, 只传payload, 这种推送, 用户是看不到的, 但APP内会收到回调.
可以用于测试全网推送速度, 我们全网推送速度优化, 就是用这种方法来测试的.
-
APP在前台时候, 无法弹出系统通知, 但APP内可以收到回调
这是IOS的默认行为,APP能收到回调的前提同样是, 用户开了通知权限.
-
APNS不会返回结果说用户有没有收到, 也不会告诉你用户禁用了通知
错误码我们只遇到过 error(8), 见上. error(10) 系统维护中.
-
苹果推送证书只有一年有效期, 到期前需要重新生成
新版HTTP2接口, 用的证书, 永不过期
- 对于国内大部分手机厂商
无法实现后台保活, 各种歪门邪道已经过时了. 很多操作系统默认的配置(如华为), 切到后台, 直接杀掉, 或者进程断网. 非用户点击触发拉起app, 均返回没有权限.
为啥微信可以? 因为在系统厂商默认白名单, 可以尝试把你APP包名改成微信的, 装在小米手机上, 小米系统直接帮你把APP图标都换成微信了. 等你APP也做成微信级别, 也有这种待遇了.
解决方法: 小米华为手机, 接入厂商提供的官方推送系统. 其它系统, 如果用户投诉, 尝试忽悠用户开下后台运行权限.
- 对于安卓原生或小厂
可以保证进程不被系统回收, 也不会因为用户从进程列表里划一下杀掉, 算是利用了安卓的一个漏洞, 6.0依然可以,(如google nexus, 三星系列手机)
starForeground再stopForeground, 进程还是forground级别, 但通知栏那个foreground级别常驻的东西不会弹出来.
- 友盟推送
友盟有互相拉起的机制, 大概可以提升50%以上的后台推送设备数. 然而国产主流厂商(如OPPO,VIVO), 默认配置下依然是不能互相拉起.
- 小米提供多包名支持, 华为不支持
华为手机如需要多包名支持, 只能申请多个APPID.
- 不提供环境隔离, 都提供全网推送接口, 需要特别小心, 不要在往测试环境发的到了正式环境
那就有点尴尬了.
解决方法: 申请多个APPID, 测试正式环境用不同Android包名.
- timeToLive参数不要设置太长, 建议7天以内
小米文档说只支持7天, 但是传个一年, 似乎也没太大问题.
华为传太长, 接口直接就报错了.
- 华为推送, 无论客户端服务端, 都非常反人类
谁用谁知道.
某些华为系统版本, 还有bug, 可能收不到推送, 或者点击出现问题. 联系过华为的技术人员, 说只能升级操作系统解决.
-
小米有非常详细的送达, 点击统计, 华为虽然有, 但是基本没法看
-
调用小米/华为接口成功率大概在98%~99%
根据错误类型, 进行重试.
-
小米可以通过服务器API接口控制, APP在前台时, 是否弹系统通知栏. 华为无法实现