[IOS] 类似 LeanCloud 的 Crash 收集实现

时间:2019-11-30 06:01来源:计算机教程
[IOS] 类似 LeanCloud 的 Crash 收集实现 用惯了 crashlytics ,Crash 收集功能的确很强大,各种 Crash收集,而且实时给开发者发送邮件 详情见:唐巧一篇文章 国内的 Crash 的第三方,相比之下就

[IOS] 类似 LeanCloud 的 Crash 收集实现

用惯了 crashlytics ,Crash 收集功能的确很强大,各种 Crash 收集,而且实时给开发者发送邮件

详情见:唐巧一篇文章

国内的 Crash 的第三方,相比之下就 Low 很多,毕竟人家也是专业做 Crash 的,貌似被 Twitter收购了

但是你想过没有自己实现一个简单的 Crash 收集呢,比国内的第三方简陋些,可以实现基本功能呢?

先说 Crash ,App 最致命的问题,用户第一反应可以删,然后再说说对 Crash 怎么办?

NSDictionary Crash ,Range 超过范围了Crash ,各种 Crash

首先想到的是, Try Catch ,实现如下:

    @try {
        // 1
        NSString *str = @"hello world";
        [str substringFromIndex:200]; // 程序到这里会崩
    }
    @catch (NSException *exception) {
        // 2
        NSLog(@"%sn%@", __FUNCTION__, exception);
        //        @throw exception; // 这里不能再抛异常
    }
    @finally {
        // 3
        NSLog(@"最终,我还是执行啦");
    }
    // 4
    // 这里一定会执行
    NSLog(@"Yeah,pass");

这时想到了Apple 官方用 Try Catch 实现的断言 XC

/*!
 * @define XCTAssertNil(expression, ...)
 * Generates a failure when ((a expression) != nil).
 * @param expression An expression of id type.
 * @param ... An optional supplementary description of the failure. A literal NSString, optionally with string format specifiers. This parameter can be completely omitted.
*/
#define XCTAssertNil(expression, ...) 
    _XCTPrimitiveAssertNil(self, expression, @#expression, __VA_ARGS__)


#define _XCTPrimitiveAssertNil(test, expression, expressionStr, ...) 
({ 
    @try { 
        id expressionValue = (expression); 
        if (expressionValue != nil) { 
            _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_Nil, 0, expressionStr, expressionValue), __VA_ARGS__); 
        } 
    } 
    @catch (_XCTestCaseInterruptionException *interruption) { [interruption raise]; } 
    @catch (NSException *exception) { 
        _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_Nil, 1, expressionStr, [exception reason]), __VA_ARGS__); 
    } 
    @catch (...) { 
        _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_Nil, 2, expressionStr), __VA_ARGS__); 
    } 
})

有点意思,调试时方便很多,对数据模型处理时方便很多,但是总有想不到的Crash

同时 也看到一个对 基本数据类型、KVO 的 Crash 处理的 第三方还不错推荐下 DurexKit

http://code4app.com/ios/DurexKit安全工具包/5325b421933bf0463d8b49ec

回到正题,国内Crash收集是什么样子,比如 Crash 的 log ,给个 AVOS 的 Crash log

vnsc5858威尼斯城官网 1

< 喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA INfUvLq/ybK7v8nS1Mq1z9bE2KO/ILTT08q8/rXE0MXPor 0o6y7 bG us0gQVZPUyBMb2cgINK71sIgv8nS1Mq1z9a88rWltcRDcmFzaCDK1byvPC9wPgo8cD60 sLryOfPwqO6PC9wPgo8cD48L3A CjxwcmUgY2xhc3M9"brush:java;">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // 最好放在其他代码之前 NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler); NSString *str = @"abc"; [str substringFromIndex:111]vnsc5858威尼斯城官网,; // 程序到这里会崩 return YES; }

void UncaughtExceptionHandler(NSException *exception) {
    /**
     *  获取异常崩溃信息
     */
    NSArray *callStack = [exception callStackSymbols];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    NSString *content = [NSString stringWithFormat:@"========异常错误报告========nname:%@nreason:n%@ncallStackSymbols:n%@",name,reason,[callStack componentsJoinedByString:@"n"]];

    /**
     *  把异常崩溃信息发送至开发者邮件
     */
    NSMutableString *mailUrl = [NSMutableString string];
    [mailUrl appendString:@"mailto:[email protected]"];
    [mailUrl appendString:@"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"];
    [mailUrl appendFormat:@"&body=%@", content];

    // 打开地址
    NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}

邮件内容如下,基本实现了AVOS的Crash 收集功能,收集设备型号、系统自行加代码:

vnsc5858威尼斯城官网 2

http://www.bkjia.com/IOSjc/942508.htmlwww.bkjia.comtruehttp://www.bkjia.com/IOSjc/942508.htmlTechArticle[IOS] 类似 LeanCloud 的 Crash 收集实现 用惯了 crashlytics ,Crash 收集功能的确很强大,各种 Crash 收集,而且实时给开发者发送邮件 详情见:唐巧...

JS firebug小技巧

实际上前端的发展与进步也离不开浏览器的支持,而对于开发人员来讲,浏览器最好的支持,就是对于debug的良好支持,甚至在某些后续接手的项目中,前端的debug甚至可以解决好多问题……不说了,都是泪啊!还是说下firefox下的firebug吧。虽然ff内置一个调试的功能,但是,感觉不完善,对于开发人员来讲,根本不够用,于是ff下还是推荐firebug,老牌的前端debug工具,好用!而IE、Chrome都有很不错的工具支持,基本够用,但是用惯了ff的我,还是坚挺在firebug下。

1、使用“debugger”关键字快速断点调试

正常如果我们想debugger下js代码,先进入“脚本”面板,然后找到要调试的js文件,最后在你需要调试的行,打上断点,最后刷新页面,如下图:

vnsc5858威尼斯城官网 3vcq9xNijv8THvs3Kx8q508OhsGRlYnVnZ2VyobG52Lz819a/7MvZts 147X3ytSjrL3T18XN c/Cv7Shozxicj4K1NrE49KqtffK1LXEtPrC69DQx7DD5qOsvNPSu9DQobFkZWJ1Z2dlcjuhsaOsPGJyPgrIu7rzy6LQws/C0rPD5qGjts 1vbXjwcujocrHsrvKx7rct72x46OsxOPO3tDr1NnH0Lu7tb29xbG o6zU2buo0MTLvNXSttTTprXEtffK1L3Fsb6jrNXiwO/O0sPH1rvQ6NKqvNO49mRlYnVnZ2VyO7y0v8mjrLfF0MSjrL3Fsb6yu7vhsai07aOstbHIu8Tj1f3Kvbeisry9xbG tcTKsbryo6zO8bHYsNFkZWJ1Z2dlcju52Lz819bIpbX0xbahozxicj4KPC9wPgo8cD4KPHN0cm9uZz4yoaK/7MvZtqjOu9a4tqjQ0LXEtPrC6zwvc3Ryb25nPjwvcD4KPHA CrHIyOfO0tKqv zL2baozru1vbXaMTIy0NC1xLT6wuujrMTjv8nS1Mjnz8Ky2df3oaM8YnI CtTay9HL97/yyc/K5MjrobAjMTIyobGjrL7Nv8nS1NXStb3WuLao0NC1xLT6wuvBy6Oh1NrO0sv5yrnTw7XEZmlyZWJ1ZzEuMTIuONbQo6zT0snPvce1xMvRy/fAuNPQu9LJq7XEzsTX1sPoyvbLtcP3xbahozwvcD4KPHA CjxzdHJvbmc M6Gi1rvP1Mq xvDX99PDtcRjc3PK9NDUPC9zdHJvbmc PGJyPgo8L3A CjxwPgrV4rmmxNzLtcq1u7CjrNT1w7TLtcTYo6zT0MqxuvK/tMbwwLSyu8THw7TNtL/gsMmjoTwvcD4KPHA CtKqsrvIu9PSsuDSu7bRyb6z/brFo6y40L7109C148LSoaM8L3A CjxwPgq1sbm00aG12tK7z 6hsL32z9TKvtOm08O1xNH5yr2hscqxo6zWu8/Uyr7G8Nf308O1xNH5yr2jrM60xvDX99PDtcTR cq9u Gxu7r2wtS19KOssrvU2c/Uyr61xKOottTT2mRlYnVn1eK49tGhz 6499PQwPux16Osv7S49sjLx m/9qOpoaM8YnI CjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20140809/20140809090531150.jpg" alt="">
4、如何查看hover的css属性
加了hover属性的容器,鼠标滑过,在HTML面板右侧会出现hover属性,但你移开就没有了,如果你希望在面板中保留hover属性,看下图:

vnsc5858威尼斯城官网 4

选中“:hover”即可。

5、循环体内的特例调试

调试循环体,有个很杯具的地方,在循环内部打个断点,循环20次,会触发20次断点……这很愁人,影响调试效率,其实我们只需要调试循环第2次的情况。

右击断点处,会出现一个蓝色的弹出层,让你输入监控表达式,这时候输入i == 2,再按“F8”,你就会发现直接跳到第二次循环了。

vnsc5858威尼斯城官网 5

6、向控制台输出日记消息

在你的代码上输出个“36ria.com”,如下:

  1. console.log("36ria.com');
  2. console.error('36ria.com');
    使用console.log的效率,个人觉得还是比原始的alert()来的高的,关键是console.log()不会中断程序执行。

    7、利用命名行工具,快速定位对象

个人感觉这是最有用的功能之一。好多时候,通过这东西,立马就能看到想看的内容。

直接在命令行输入某个变量的变量名,可以在控制台看到其中详细的信息。

http://www.bkjia.com/Javascript/862162.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javascript/862162.htmlTechArticleJS firebug小技巧 实际上前端的发展与进步也离不开浏览器的支持,而对于开发人员来讲,浏览器最好的支持,就是对于debug的良好支持,甚至...

编辑:计算机教程 本文来源:[IOS] 类似 LeanCloud 的 Crash 收集实现

关键词: