JJException 0.2.13

JJException 0.2.13

jezz维护。



  • 作者:
  • 李杰

CocoaPods Compatible Build Status codecov Carthage Compatible Platform License MIT

JJException

常见的异常问题不会导致应用程序崩溃,Hook未知选择器、越界、参数为nil等。将异常抛到界面,并将异常记录到日志中,升级应用或热修复以解决异常。

保护应用程序,一般常见问题不会导致闪退,增强应用程序的健壮性。同时会抛出错误,根据每个应用程序本身的日志渠道记录,下次迭代或热修复以下问题。

  • 发送到实例的未知选择器异常

  • NSNull异常

  • NSArray,NSMutableArray,NSDictonary,NSMutableDictionary(数组越界,key-value参数异常)

  • KVO(忘记移除keypath导致闪退)

  • NSTimer(忘记移除导致内存泄漏)

  • NSNotification(忘记移除导致异常)

  • NSString,NSMutableString,NSAttributedString,NSMutableAttributedString(下标越界以及参数nil异常)

如何安装

要求

  • iOS 8.0+
  • OSX 10.7+
  • Xcode 8.0+

Podfile

pod 'JJException'

Cartfile

github "jezzmemo/JJException"

手动导入代码

导入Source文件夹中所有文件,需要将MRC目录下所有.m文件,编译选项更改为-fno-objc-arc

如何使用

  • 根据需要,对异常进行分类和组合
typedef NS_OPTIONS(NSInteger,JJExceptionGuardCategory){
    JJExceptionGuardNone = 0,
    JJExceptionGuardUnrecognizedSelector = 1 << 1,
    JJExceptionGuardDictionaryContainer = 1 << 2,
    JJExceptionGuardArrayContainer = 1 << 3,
    JJExceptionGuardKVOCrash = 1 << 4,
    JJExceptionGuardNSTimer = 1 << 5,
    JJExceptionGuardNSNotificationCenter = 1 << 6,
    JJExceptionGuardNSStringContainer = 1 << 7,
    JJExceptionGuardAll = JJExceptionGuardUnrecognizedSelector | JJExceptionGuardDictionaryContainer | JJExceptionGuardArrayContainer | JJExceptionGuardKVOCrash | JJExceptionGuardNSTimer | JJExceptionGuardNSNotificationCenter | JJExceptionGuardNSStringContainer,
};
  • 设置异常类型并开启,建议在didFinishLaunchingWithOptions的第一行进行设置,以避免在多线程中出现异常情况
    [JJException configExceptionCategory:JJExceptionGuardAll];
    [JJException startGuardException];
  • 在异常时,默认程序不会中断,如果需要遇到异常时退出,请按以下设置操作
    //Default value:NO
    JJException.exceptionWhenTerminate = YES;
  • 如果需要记录日志,只需要实现JJExceptionHandle协议并进行注册
@interface ViewController ()<JJExceptionHandle>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [JJException registerExceptionHandle:self];
}

- (void)handleCrashException:(NSString*)exceptionMessage exceptionCategory:(JJExceptionGuardCategory)exceptionCategory extraInfo:(nullable NSDictionary*)info{

}

常见问题

JJException是否会影响上线App Store

不会的,JJException的所有功能都是使用官方API,没有任何私有API

JJException实现应用程序保护的技术原理是什么?

JJException技术原理

JJException是否会与Bugly和友盟等第三方库冲突?

Bugly和友盟是记录Crash Bug的日志以及进行一些统计功能的库,JJException主要是通过Hook技术来实现的,因此不会与JJException冲突

如何将异常信息上传到Bugly?

Bugly可以帮助我们解决重复信息和CallStack信息,以及状态维护。
实现JJExceptionHandle协议后,将异常信息组织成Error,然后用[Bugly reportError:error]上传异常信息,上传后可以在Bugly的后台错误分析菜单里查看异常信息。

Swift是否有作用

是有作用的,Swift中有些API是通过独立实现的,比如String,Array,使用结构体的方式,但有些仍然沿用了Objective-c,那些沿用了Objective-c特性的,JJException仍然生效。下面我会列出仍然生效的功能点:

  • Unrecognized Selector Sent to Instance
  • NSNull
  • KVO
  • NSNotification
  • NSString,NSMutableString,NSAttributedString,NSMutableAttributedString(注意不是String)
  • NSArray,NSMutableArray,NSDictionary,NSMutableDictionary(注意不是Array)

这里附上Swift的初始化代码示例

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    self.registerJJException()
    return true
}
    
func registerJJException(){
    JJException.configExceptionCategory(.all)
    JJException.startGuard()
    JJException.register(self);
}
    
func handleCrashException(_ exceptionMessage: String, extraInfo info: [AnyHashable : Any]?) {
        
}

JJException Hook哪些API?

HookAPI

TODO(大家记得给我加星哦)

  • 国际化JJException

Linker

License

JJException采用MIT许可协议发布。详情请参阅LICENSE文件。