iOS 日志与埋点

878 阅读3分钟

1.日志

日志:系统或者程序在程序运行过程中会记录各种数据,我们通过这些数据来进行问题查找、错误解决、性能的分析等,因此记录日志对一个高性能的应用程序来说是必不可少的。

埋点:主要作用是分析用户行为,也可以作为出现问题时的场景复现记录。埋点常常用来进行用户的行为路径分析,例如对于一个电商应用app,购买一个商品的路径有很多,从搜索模块到商品的购买、从分类模块找到商品购买、从广告来源购买或者朋友推荐购买等,通过埋点记录可以帮助运营人员更好的调整策略。

1.1异常分析

程序中一般都有BUG,Crash是一种比较严重的BUG。如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *array = @[@"1",@"2"];
    
    NSLog(@"%@",array[2]);
}

上面代码明显错误,数组越界,在控制台输出如下的Crash信息:

2020-10-27 20:57:44.534502+0800 FMDBActions[42334:2120891] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndexedSubscript:]: index 2 beyond bounds [0 .. 1]'
*** First throw call stack:
(
	0   CoreFoundation                      0x00007fff23e3cf0e __exceptionPreprocess + 350
	1   libobjc.A.dylib                     0x00007fff50ba89b2 objc_exception_throw + 48
	2   CoreFoundation                      0x00007fff23ecfa51 _CFThrowFormattedException + 194
	3   CoreFoundation                      0x00007fff23eae9bd -[__NSArrayI objectAtIndexedSubscript:] + 93
	4   FMDBActions                         0x0000000103c8406f -[ViewController viewDidLoad] + 159
	5   UIKitCore                           0x00007fff485dbac2 -[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled] + 83
	6   UIKitCore                           0x00007fff485e09e0 -[UIViewController loadViewIfRequired] + 1084
	7   UIKitCore                           0x00007fff48545480 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 160
	8   UIKitCore                           0x00007fff48545781 -[UINavigationController _startTransition:fromViewController:toViewController:] + 141
	9   UIKitCore                           0x00007fff4854660f -[UINavigationController _startDeferredTransitionIfNeeded:] + 868
	10  UIKitCore                           0x00007fff48547954 -[UINavigationController __viewWillLayoutSubviews] + 150
	11  UIKitCore                           0x00007fff48528924 -[UILayoutContainerView layoutSubviews] + 217
	12  UIKitCore                           0x00007fff49193678 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2478
	13  QuartzCore                          0x00007fff2b4c6398 -[CALayer layoutSublayers] + 255
	14  QuartzCore                          0x00007fff2b4cc523 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 523
	15  QuartzCore                          0x00007fff2b4d7bba _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 80
	16  QuartzCore                          0x00007fff2b420c04 _ZN2CA7Context18commit_transactionEPNS_11TransactionEd + 324
	17  QuartzCore                          0x00007fff2b4545ef _ZN2CA11Transaction6commitEv + 649
	18  UIKitCore                           0x00007fff48ca3747 __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 81
	19  CoreFoundation                      0x00007fff23da0b5c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
	20  CoreFoundation                      0x00007fff23da0253 __CFRunLoopDoBlocks + 195
	21  CoreFoundation                      0x00007fff23d9b043 __CFRunLoopRun + 995
	22  CoreFoundation                      0x00007fff23d9a944 CFRunLoopRunSpecific + 404
	23  GraphicsServices                    0x00007fff38ba6c1a GSEventRunModal + 139
	24  UIKitCore                           0x00007fff48c8b9ec UIApplicationMain + 1605
	25  FMDBActions                         0x0000000103c85732 main + 114
	26  libdyld.dylib                       0x00007fff51a231fd start + 1
	27  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

可以看到信息十分丰富,包括异常类型、发生异常的对象与函数,以及完整的调用栈信息。

对于开发过程中发生的Crash问题,我们可以直接在Xcode中看到日志,可以根据日志解决。但是对于发生用户使用过程中,开发者可以通过注册异常处理函数来捕获这些异常。

在启动应用程序时,可以向系统注册异常捕获函数如下: