美文网首页
两种 App 启动连续闪退检测策略-摘自知识小集

两种 App 启动连续闪退检测策略-摘自知识小集

作者: CocoaCK | 来源:发表于2018-07-13 16:24 被阅读18次

    首先感谢知识小集作者KANGZUBIN的分享!

    记录下检测当APP在启动时发生crash闪退的策略方法。

    1、计时方法

    1)App 本地缓存维护一个计数变量,用于表示连续闪退的次数;

    2)在启动入口方法 application:didFinishLaunchingWithOptions: 里判断 App 之前是否发生过连续闪退,如果有,则启动保护流程,自我修复,日志上报等,否则正常启动。判断的逻辑如下:

    3)先取出缓存中的启动闪退计数 crashCount,然后把 crashCount 加 1 并保存;

    4)接着使用 dispatch_after 方法在 5s 后清零计数,如果 App 活不过 5 秒计数就不会被清零,下次启动就可以读取到;

    5)如果发现计数变量 > maxCount,表明 App 连续 maxCount 次连续闪退,启动保护流程,重置计数。

    具体的代码如下图所示:

    这种计数器方法逻辑简单,与原有的代码耦合小。但存在误报可能(用户在启动 App 后又立即 kill 掉,会被误认为是 crash),不过可以通过设置时间阈值或者在applicationWillTerminate:里标记 App 是被手动 kill 来减少误报。

    2、时间数组比对

    我们可以在本地保存一个 App 每次启动时间、闪退时间、手动关闭时间的时间数组,然后在 App 启动时根据分析各个时间戳判断是否存在连续闪退(当闪退时间减去启动时间小于阈值 5 秒时,则认为是启动闪退),具体如下:

    1)App 每次启动时,记录当前时间 launchTs,写入时间数组;

    2)App 每次启动时,通过 crash 采集库,获取上次 crash report 的时间戳 crashTs,写入时间数组;

    3)App 在接收到UIApplicationWillTerminateNotification通知时,记录当前时间戳 terminateTs,写入时间数组。注意,之所以要记录 terminateTs,是为了排除一种特殊情况,即用户启动 App 之后立即手动 kill app。

    如果我们正确记录了上面三个时间戳,那么我们可以得到一个与 App crash 行为相关的时间线,如下图:

    根据各种时间线的行为特征,我们只需要加上时间间隔判断,就能得知是否为连续两次闪退了。注意,如果两个 crashTs 之间如果存在 terminateTs,则不能被认为是连续闪退。

    以上,介绍了两种检测 App 是否存在启动连续闪退的策略。

    本人方法出自WeRead 团队博客的[《iOS 启动连续闪退保护方案》] (http://wereadteam.github.io/2016/05/23/GYBootingProtection/) 和 MrPeak 老师的《iOS App 连续闪退时如何上报 crash 日志》

    来源:掘金

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:两种 App 启动连续闪退检测策略-摘自知识小集

          本文链接:https://www.haomeiwen.com/subject/sdqspftx.html