Skip to content

Latest commit

 

History

History
92 lines (51 loc) · 5 KB

notification-keng.md

File metadata and controls

92 lines (51 loc) · 5 KB

手机推送系统中的坑和解决方法,这是我在做一个推送系统时遇到的问题, 分享下, 希望对大家有帮助

IOS APNS推送

APNS推送, 需要自己保存ios上报的token, APNS本身不提供全网推送接口, 如果要做一次全网推送, 需要从数据库中查出所有token, 逐个推送. 对于一个用户量较高的APP, 需要存储的token数, 可能在百万或者千万级.

  1. 国内到APNS服务器网络问题 我们项目中, 从国内某机房, 做一次6w的批量推送, 需要10~15分钟. 增加到APNS的连接数, 也无法提升速度. 解决方法: 把APNS调用服务部署到了香港机房, 同样一次6w的批量推送, 10秒左右就完成了, 速度提升近100倍. 可见国内某些机房到APNS服务器, 网络有很大问题.

  2. token相关

  3. 用户如果不允许通知权限, 是无法获取token的. 用户卸载APP, 或者禁用通知, 一般来说APP也无法得知.

  4. 根据IOS版本的不同, 卸载重装APP, token可能变, 也可能不变. 用户升级/重装操作系统, 也可能会变. 所以每次启动APP, 都需要重新上报token.

  5. 调用APNS推送, 对于已经卸载APP或者禁用通知的用户, APNS是不会有特殊返回值的.

  6. APNS调用报错: invalid token (8) token非法, 最常见的产生原因 : ios开发, 测试, 企业版内测, 提交APPSTORE都有不同的bundleId, 而每个bundleId都对应不同的推送证书, 如果token存储的时候没有区分bundleId, 调用时就会产生错误8. 错误8太多, APNS有可能会断掉推送的http2长连接, 导致推送失败率增加.

解决方法: 记录每个token对应的bundleId. 可以做到无论任bundleId的版本, 连正式/测试, 都可以收到APNS推送.

  1. 发送用户看不到的通知

如果调用APNS的时候, 不传alert等, 只传payload, 这种推送, 用户是看不到的, 但APP内会收到回调.

可以用于测试全网推送速度, 我们全网推送速度优化, 就是用这种方法来测试的.

  1. APP在前台时候, 无法弹出系统通知, 但APP内可以收到回调

    这是IOS的默认行为,APP能收到回调的前提同样是, 用户开了通知权限.

  2. APNS不会返回结果说用户有没有收到, 也不会告诉你用户禁用了通知

    错误码我们只遇到过 error(8), 见上. error(10) 系统维护中.

  3. 苹果推送证书只有一年有效期, 到期前需要重新生成

   新版HTTP2接口, 用的证书, 永不过期  

安卓后台保活

  1. 对于国内大部分手机厂商

无法实现后台保活, 各种歪门邪道已经过时了. 很多操作系统默认的配置(如华为), 切到后台, 直接杀掉, 或者进程断网. 非用户点击触发拉起app, 均返回没有权限.

为啥微信可以? 因为在系统厂商默认白名单, 可以尝试把你APP包名改成微信的, 装在小米手机上, 小米系统直接帮你把APP图标都换成微信了. 等你APP也做成微信级别, 也有这种待遇了.

解决方法: 小米华为手机, 接入厂商提供的官方推送系统. 其它系统, 如果用户投诉, 尝试忽悠用户开下后台运行权限.

  1. 对于安卓原生或小厂

可以保证进程不被系统回收, 也不会因为用户从进程列表里划一下杀掉, 算是利用了安卓的一个漏洞, 6.0依然可以,(如google nexus, 三星系列手机)

实现方法参见 https://github.com/xuduo/socket.io-push-android/blob/master/android-push-sdk/src/main/java/com/yy/httpproxy/service/ForegroundService.java

starForeground再stopForeground, 进程还是forground级别, 但通知栏那个foreground级别常驻的东西不会弹出来.

  1. 友盟推送

  友盟有互相拉起的机制, 大概可以提升50%以上的后台推送设备数.   然而国产主流厂商(如OPPO,VIVO), 默认配置下依然是不能互相拉起.

小米/华为推送

  1. 小米提供多包名支持, 华为不支持

华为手机如需要多包名支持, 只能申请多个APPID.

  1. 不提供环境隔离, 都提供全网推送接口, 需要特别小心, 不要在往测试环境发的到了正式环境

那就有点尴尬了.

解决方法: 申请多个APPID, 测试正式环境用不同Android包名.

  1. timeToLive参数不要设置太长, 建议7天以内

小米文档说只支持7天, 但是传个一年, 似乎也没太大问题.

华为传太长, 接口直接就报错了.

  1. 华为推送, 无论客户端服务端, 都非常反人类

谁用谁知道.

某些华为系统版本, 还有bug, 可能收不到推送, 或者点击出现问题. 联系过华为的技术人员, 说只能升级操作系统解决.

  1. 小米有非常详细的送达, 点击统计, 华为虽然有, 但是基本没法看

  2. 调用小米/华为接口成功率大概在98%~99%

    根据错误类型, 进行重试.

  3. 小米可以通过服务器API接口控制, APP在前台时, 是否弹系统通知栏. 华为无法实现