前言
本文主要給大家介紹的是關於iOS如何監測程序崩潰次數的相關內容,分享出來供大家參考學習,下面話不多說,來一起看看詳細的介紹:
在寫代碼之前,我們先弄明白一個app運行的流程。
程序運行啟動時依次調用
1.啟動頁先運行
2. - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
3. - (void)applicationDidBecomeActive:(UIApplication*)application
程序退到後台依次調用
1. - (void)applicationWillResignActive:(UIApplication*)application
2. - (void)applicationDidEnterBackground:(UIApplication*)application
程序從後台回到前台依次調用
1. - (void)applicationWillEnterForeground:(UIApplication*)application
2. - (void)applicationDidBecomeActive:(UIApplication*)application
程序被殺掉會依次調用
1. - (void)applicationWillResignActive:(UIApplication*)application
2. - (void)applicationDidEnterBackground:(UIApplication*)application
3. - (void)applicationWillTerminate:(UIApplication*)application
程序崩潰閃退則不會調用任何方法
根據程序被殺掉和崩潰之間的區別可以寫一個方法來檢測和記錄程序崩潰次數。
實現思路
在程序啟動時把存儲在沙盒中的崩潰標識isCrash置為YES,程序將要退出時把isCrash改為NO。
代碼:
程序啟動
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self recordCrashCount]; }
程序退出
- (void)applicationWillTerminate:(UIApplication *)application { [[NSUserDefaults standardUserDefaults] setObject:@(NO) forKey:@"JJ_isCrash"]; [[NSUserDefaults standardUserDefaults] synchronize]; }
// 判斷和記錄崩潰的次數 - (void)recordCrashCount{ BOOL isCrash = [[[NSUserDefaults standardUserDefaults] valueForKey:@"JJ_isCrash"] boolValue]; [[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:@"JJ_isCrash"]; if (isCrash == YES) { //獲取到本地存儲的崩潰次數 NSNumber *crashNum = [[NSUserDefaults standardUserDefaults] valueForKey:@"JJ_crashCount"]; NSInteger count =0; if (crashNum != nil) { count = [crashNum integerValue]; } count++; //判斷崩潰次數達到多少次時執行操作 if (count >= crashCount) { NSLog(@"多次崩潰"); //將本地文件崩潰次數重新置為0 [[NSUserDefaults standardUserDefaults] setObject:@0 forKey:@"JJ_crashCount"]; // 5秒後執行彈窗警告操作 [self performSelector:@selector(showAlertAction)withObject:nil afterDelay:5]; return; } //崩潰次數未達到3次則向本地存儲崩潰次數 crashNum = [NSNumber numberWithInteger:count]; [[NSUserDefaults standardUserDefaults] setObject:crashNum forKey:@"JJ_crashCount"]; } }
// 彈出升級警告 - (void)showAlertAction{ UIAlertController*alert = [UIAlertControlleralertControllerWithTitle:@"警告"message:@"檢測到軟件多次異常退出,建議您盡快更新到最新版本!" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction*sure = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefaulthandler:nil]; [alert addAction:sure]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil]; }
為了方便大家直接使用,我已經將實現代碼封裝為一個小框架,只需使用一句代碼即可調用。
github下載地址: https://github.com/jiangbin1993/JJRecordCrash
本地下載地址:http://xiazai.jb51.net/201707/yuanma/JJRecordCrash(jb51.net).rar
使用方法:
在appdelegate.m中導入頭文件 #import "JJRecordCrash.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 參數crashCount為崩潰多少次後執行block中的代碼 [[JJRecordCrash shareInstance] recordCrashWithCrashCount:2 handle:^{ // 多次崩潰後執行自己想執行的代碼,如:清除緩存 提示用戶更新 NSLog(@"崩潰啦"); }]; return YES; }
注意:調試時,在程序運行中直接使用xcode重新運行程序,因為不會走- (void)applicationWillTerminate:(UIApplication*)application
方法,所以也相當於是崩潰,同樣會被記錄下來。
總結
以上就是這篇文章的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對本站的支持。