GYBootingProtection icon indicating copy to clipboard operation
GYBootingProtection copied to clipboard

降低误报机率与API优化建议

Open ChenYilong opened this issue 8 years ago • 1 comments

原文: 《连续启动 crash 自修复技术实现与原理解析》


思路很好,很轻量级。有个实现上可以优化下,可以降低50%以上误报机率,监听用户手动划掉APP这个事件,其中一些特定场景,是可以获取的。另外对API设计的建议。

优化:降低50%以上误报机率

用户主动kill掉APP分为两种情况:

  • App在前台时用户手动划掉APP的时候
  • APP在后台时划掉APP

第一种场景更为常见,可以通过监听UIApplicationWillTerminateNotification来捕获该动作,捕获后恢复计数。第二种情况,无法监听到。但也足以降低50%以上的误报机率。

对API设计的几点优化意见

1. 机制状态应当用枚举来做为API透出

该机制当前所处的状态,比如:NeedFix 、isFixing,建议用枚举来做为API透出。比如:

typedef NS_ENUM(NSInteger, BootingProtectionStatus) {
   BootingProtectionStatusNormal,  /**<  APP 启动正常 */
   BootingProtectionStatusNormalChecking,  /**< 正在检测是否会在特定时间内是否会 Crash,注意:检测状态下“连续启动崩溃计数”个数小于或等于上限值 */
   BootingProtectionStatusNeedFix, /**< APP 出现连续启动 Crash,需要采取修复措施 */
   BootingProtectionStatusFixing,   /**< APP 出现连续启动 Crash,正在修复中... */
};

2. 关键数值应当做为初始化参数供用户设置

/*!
* 当前启动Crash的状态
*/
@property (nonatomic, assign, readonly) ABSBootingProtectionStatus bootingProtectionStatus;

/*!
* 达到需要执行上报操作的“连续启动崩溃计数”个数。
*/
@property (nonatomic, assign, readonly) NSUInteger continuousCrashOnLaunchNeedToReport;

/*!
* 达到需要执行修复操作的“连续启动崩溃计数”个数。
*/
@property (nonatomic, assign, readonly) NSUInteger continuousCrashOnLaunchNeedToFix;

/*!
* APP 启动后经过多少秒,可以将“连续启动崩溃计数”清零
*/
@property (nonatomic, assign, readonly) NSTimeInterval crashOnLaunchTimeIntervalThreshold;

3. 修复、上报逻辑应当支持用户异步操作

reportBlock 上报逻辑, repairtBlock 修复逻辑

typedef void (^BoolCompletionHandler)(BOOL succeeded, NSError *error);
typedef void (^RepairBlock)(ABSBoolCompletionHandler completionHandler);

用户执行 BoolCompletionHandler 后即可知道是否执行完毕,并且支持异步操作。

异步操作带来的问题,可以通过前面提到的枚举API来实时监测状态,来决定各种其他操作。

原文: 《连续启动 crash 自修复技术实现与原理解析》


ChenYilong avatar Jul 05 '17 10:07 ChenYilong

感谢 @ChenYilong 提出非常有价值的建议,下个版本会做出优化。

liuslevis avatar Jul 05 '17 11:07 liuslevis