客户端安全模式

120 阅读4分钟

需求背景:

iOS 8.15日线上由于unity广告sdk下发了异常代码,出现启动App即闪退的重大崩溃;为避免启动奔溃影响用户正常使用,检测到多次启动奔溃后进入安全模式,此次需求仅解决类似问题,后续需求持续细化

需求概述:

  • 在启动阶段,利用崩溃计数,在用户崩溃数达到某个阈值时,进入安全模式,分级执行修复策略;

    • 一级修复策略:清除非必要缓存

    • 二级修复策略:关闭广告初始化,不初始化非必要SDK

  • 退出安全模式:不同策略有不同的方式退出

    • 一级修复策略:清除后即退出

    • 二级修复策略:查明原因是与广告SDK有关后,服务端下发开关,进行关闭

需求详情:

崩溃计数:

  • 计数+1: 用户启动App把奔溃计数+1,判断是否>「阈值」,是进入安全模式,否正常进入页面,

  • 清除计数: 用户正常使用10秒,或者正常退出,或者主动退到后台,重置计数为0;

  • 崩溃计数记录两个值:一级崩溃计数,二级崩溃计数,两者同时计数

在启动阶段拉取后端下发的崩溃阈值及安全模式开关,其中两个阈值:一级策略阈值 及 二级策略阈值,当前用户安全模式开关以及全部用户安全模式开关;拉取后存到设备(为了不影响APP启动流程),并正常进行崩溃计数;(第一次打开APP 用默认值)

一级崩溃计数大于一级策略阈值时执行一级策略,并将一级崩溃计数 置零,此时清除缓存后进入APP,并上报服务端;同时二级崩溃计数继续计数

若崩溃继续发生,当二级崩溃计数 大于二级策略阈值时,执行二级修复策略:关闭广告,不初始化非必要SDK;上报服务端,告知将安全模式开关置为true,当服务端检测到有超X个(较多个)设备上报该值时,下发安全模式开关为开;服务端并进行告警,分时段提醒app进入安全模式

【此条件与策略阈值为或的关系,两者任意一个为真,都进入安全模式】当设备记录的安全模式开关(上次打开APP所拉取的值,存到本地)为开时,直接进入安全模式,执行一级、二级策略;此后仅当安全模式开关 为 关时,才关闭安全模式:打开广告开关,初始化非必要SDK

服务端提供配置关闭安全模式:在查明原因,定位确是广告相关SDK问题,或别的SDK导致的崩溃,并SDK恢复后,关闭开关,下发给APP

时序流程:

未发生崩溃正常流程:APP启动 -----> 崩溃计数+ 1 -----> 判断是否进入安全模式 ----> 异步拉取接口,存阈值、安全模式开关 ------> 不进入安全模式,正常开启广告,初始化SDK ------> 正常使用APP,两个崩溃计数置0

发生崩溃流程:

APP启动 -----> 崩溃计数+ 1 -----> 判断是否进入安全模式,未达阈值 -----> 进入正常启动流程 ----->崩溃 -----> 计数未清零;结束

-------------------------------------------------------------------------

APP启动 -----> 崩溃计数+ 1 ------> 判断是否进入安全模式,已达一级阈值 ------> 执行一级修复策略 -----> 一级崩溃计数置零,二级崩溃计数不置零 ------> APP初始化SDK、广告SDK

如若继续崩溃: APP初始化SDK、广告SDK -----> 崩溃 -----> 二级崩溃计数未置零,结束

-------------------------------------------------------------------------

APP启动 -----> 崩溃计数 + 1 -----> 判断是否进入安全模式,已达二级阈值,记录本地已打开安全模式-----> 执行一级、二级修复策略, 不初始化非必要SDK,不开启广告,请求服务端打开安全模式 ,异步拉取接口,存阈值、安全模式开关;存本地安全模式开关情况-----> 进入APP正常流程 -----> 崩溃计数清零。结束

-------------------------------------------------------------------------

服务端检测到超X个设备进入安全模式运行,下发安全模式开关 为关闭;

APP启动 ----> 崩溃计数+1 ------>本地安全模式开且服务端下发的安全模式为开或,进入安全模式,异步拉取接口 ----> (无广告,无非必要SDK,清缓存)安全模式下APP运行 ----> 所有崩溃计数置零,结束

-------------------------------------------------------------------------

当人工介入,SDK/广告崩溃已恢复,服务端安全模式开关 关闭

APP启动 -----> 崩溃计数+1 ----> 本地安全模式开启,服务端下发安全模式为关 ---->关闭安全模式,本地安全模式记录置为关,崩溃计数清零,上报服务端客户端已关闭安全模式 ----> 正常流程运行 ----> 结束