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

程序被手动杀掉会依次调用

// 双击home键 回到正在执行的app界面走这个回调
1.- (void)applicationWillResignActive:(UIApplication*)application

// 上移app手动杀掉后走下面两个回调
2.- (void)applicationDidEnterBackground:(UIApplication*)application

3.- (void)applicationWillTerminate:(UIApplication*)application

程序崩溃闪退和在后台被系统杀掉则不会调用任何方法

分析:我们需要记录程序崩溃的次数,手动杀掉程序和程序在后台被系统回收杀掉是不能统计的。如上所述流程里,程序崩溃不会执行任何回调,但是手动杀掉程序和程序在后台被系统回收杀掉都要先让程序回到后台,走- (void)applicationDidEnterBackground:(UIApplication*)application这个回调。根据这个区别我们就可以来做一个崩溃的记录。

实现思路:在程序启动时把存储在沙盒中的崩溃标识JJ_isCrash置为YES,程序回到后台时把isCrash改为NO,程序回到前台时再把JJ_isCrash改为YES。

代码:

这里是详细的实现代码,如果不想看的朋友可以直接跳到后面,有封装好的小框架,直接一句代码调用就可以啦。

程序启动

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

   [self recordCrashCount];

}

程序进入后台

- (void)applicationDidEnterBackground:(UIApplication*)application {

    [[NSUserDefaults standardUserDefaults] setObject:@(NO) forKey:@"JJ_isCrash"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

程序回到前台

- (void)applicationWillEnterForeground:(UIApplication *)application {

    [[NSUserDefaults standardUserDefaults] setObject:@(YES) 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

或者使用cocoapods安装 : pod 'JJRecordCrash'

使用方法:

在appdelegate.m中导入头文件 #import "JJRecordCrash.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 参数crashCount为崩溃多少次后执行block中的代码
    [[JJRecordCrash shareInstance] recordCrashWithCrashCount:2 handle:^{
        // 多次崩溃后执行自己想执行的代码,如:清除缓存 提示用户更新
        NSLog(@"崩溃啦");
    }];
    
    return YES;
}

注意:调试时,在程序运行中直接使用xcode重新运行程序,因为不会走- (void)applicationDidEnterBackground:(UIApplication*)application方法,所以也相当于是崩溃,同样会被记录下来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容