一個已經發布到AppStore上的App,最忌諱的就是崩潰問題。為什麼在開發階段或者測試階段都不會崩潰,而發布到AppStore上就崩潰了呢?究其根源,最主要的原因就是數據的錯亂。特別是 服務器返回數據的錯亂,將嚴重影響到我們的App。
可導致崩潰的代碼
NSString *nilStr = nil;
NSArray *array = @[@"HaRi", nilStr];
若沒有JQSafeKit來防止崩潰,則會直接崩潰,如下圖
若有JQSafeKit來防止崩潰,則不會崩潰,並且會將原本會崩潰情況的詳細信息打印出來,如下圖
Installation【安裝】
From CocoaPods【使用CocoaPods】
pod “JQSafeKit”
Manually【手動導入】
Drag all source files under floder JQSafeKit to your project.【將JQSafeKit文件夾中的所有源代碼拽入項目中】
使用方法
在AppDelegate的didFinishLaunchingWithOptions方法中添加如下代碼,讓JQSafeKit生效
//這句代碼會讓JQSafeKit生效,若沒有如下代碼,則JQSafeKit就不起作用
[JQSafeKit becomeEffective];
若你想要獲取崩潰日志的所有詳細信息,只需添加通知的監聽,監聽的通知名為:JQSafeKitNotification
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JQSafeKit becomeEffective];
//監聽通知:JQSafeKitNotification, 獲取JQSafeKit捕獲的崩潰日志的詳細信息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealwithCrashMessage:) name:JQSafeKitNotification object:nil];
return YES;
}
- (void)dealwithCrashMessage:(NSNotification *)note {
//注意:所有的信息都在userInfo中
//你可以在這裡收集相應的崩潰信息進行相應的處理(比如傳到自己服務器)
NSLog(@"%@",note.userInfo);
}
下面通過打斷點的形式來看下userInfo中的信息結構,看下包含了哪些信息
再看下控制台輸出日志來看下userInfo中的包含了哪些信息
目前可以防止崩潰的方法有
NSArray 1. NSArray的快速創建方式 NSArray *array = @[@"HaRi", @"JQSafeKit"]; //這種創建方式其實調用的是2中的方法
2. +(instancetype)arrayWithObjects:(const id _Nonnull __unsafe_unretained *)objects count:(NSUInteger)cnt
3. - (id)objectAtIndex:(NSUInteger)index
NSMutableArray 1. - (id)objectAtIndex:(NSUInteger)index2. - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx3. - (void)removeObjectAtIndex:(NSUInteger)index4. - (void)insertObject:(id)anObject atIndex:(NSUInteger)index
NSDictionary1. NSDictionary的快速創建方式 NSDictionary *dict = @{@"frameWork" : @"JQSafeKit"}; //這種創建方式其實調用的是2中的方法2. +(instancetype)dictionaryWithObjects:(const id _Nonnull __unsafe_unretained *)objects forKeys:(const id _Nonnull __unsafe_unretained *)keys count:(NSUInteger)cnt
NSMutableDictionary1. - (void)setObject:(id)anObject forKey:(id)aKey2. - (void)removeObjectForKey:(id)aKey
NSString1. - (unichar)characterAtIndex:(NSUInteger)index2. - (NSString *)substringFromIndex:(NSUInteger)from3. - (NSString *)substringToIndex:(NSUInteger)to {4. - (NSString *)substringWithRange:(NSRange)range {5. - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement6. - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange7. - (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement
NSMutableString1. 由於NSMutableString是繼承於NSString,所以這裡和NSString有些同樣的方法就不重復寫了2. - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString3. - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc4. - (void)deleteCharactersInRange:(NSRange)range