1.需求背景&目标
1.1需求背景
根据极光后台查看发送记录,大概有超过一半的push发送失败,此次push重构为了增加推送成功率
1.2目标
- 推送类型:
在线推送:app在前台或后台,根据极光策略推送,默认策略是先极光通道再厂商通道。华为现在已强制厂商通道,其他厂商有次数限制所以使用默认策略
离线推送:app进程不在,这个必须走厂商通道才能送达
- 目标:app在后台/app进程不在时展示推送,在前台不展示推送
2.技术方案设计
2.1核心模块
2.1.1发送push链路
2.1.2上报alias流程图
客户端setAlias将当前设备绑定到该alias=md5(userId),并上报给极光,这样发每条推送home server拿到目标用户的userId后,经过jiguang push serivce 计算出alias=md5(userId)调极光api发推送,极光通过alias找到对应设备后发送推送
2.1.3App上报前后台状态给Jiguang Push Service
为了实现目标中app在前台不发推送,app在后台发推送,需要jiguang push service维护一份发送推送时该用户app在前后台状态。为了处理app异常退出未上报的边界情况,app在前台时定时的告诉jiguang push service
2.1.4Jiguang push service发送push前置条件
作为中间层,home service发来请求时,会根据当前alias的push开关、前后台状态来决定是否调用极光api发送push
2.2后端接口定义
//上报alias给极光
JPushInterface.setAlias(context, 0, getPushAlias())
//移除极光推送Alias绑定的所有设备:由jpushservice提供
@POST("mobile/deleteAlia")
fun deleteAliasRequest(@Body deleteAliasReq: DeleteAliasReq): Observable<Response<Void>>
//上报pushService前后台状态:由jpushservice提供
@POST("mobile/report")
fun reportActiveRequest(@Body reportActiveReq: ReportActiveReq): Observable<Response<Void>>
//从极光移除alias
JPushInterface.deleteAlias(context, 0)
2.3边界情况
- 第一次登陆后突然断网,导致alias上报失败,下次再进入首页会重新触发2.1.2上报alias逻辑
- app断网后,无法上报前后台状态,jiguang push service会执行发送逻辑,来网后依然接收到push
- app异常退出没有上报前后台状态,jiguang push service会根据轮询时间已过期,触发极光离线推送逻辑
- 华为因为极光通道不稳定强制走厂商,vivo因为默认测试,所以调整为生产:
thirdPartyChannel = new HashMap<>();
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("importance", importance);
jsonObject.addProperty("distribution", "ospush");
thirdPartyChannel.put("huawei", jsonObject);
JsonObject vivoParam = new JsonObject();
vivoParam.addProperty("classification", 1);
thirdPartyChannel.put("vivo", vivoParam);
2.4兼容性
push开关逻辑不兼容之前已安装且已关闭push
不兼容未更新app版本用户
3.0上线注意事项
需要Jiguang push service & home server & android app同步上线,app需要强制更新
4.0参考资料
1.各个厂商开通push:docs.jiguang.cn/jpush/clien…
2.Android集成各个厂商通道:docs.jiguang.cn/jpush/clien…
3.Android SDK集成指南:docs.jiguang.cn/jpush/clien…
4.删除别名所有设备绑定关系:docs.jiguang.cn/jpush/serve…删除别名
5.vivo选择推送系统消息:dev.vivo.com.cn/documentCen…