项目崩溃,crashLog可是你的救命稻草,能让你快速分析出bug的问题所在,不会收集可不行。
当然项目在开发时,可以通过控制台log看到调用堆栈,发布版的crash 收集一般有三种方式可选:
1.苹果Crash收集服务
通过iTunes Connect(Manage Your Applications - View Details - Crash Reports)获取用户的crash日志。在XCode 中Window->Organizer->Crashes也可以看到同样的crash日志,请看这篇文章:如何查看iOS已上架app崩溃分布、定位crash发生的行
但是 收集crash功能需要用户设置->隐私->诊断与用量->诊断与用量数据(iOS8一下在通用中设置) 选择自动发送,并与开发者共享即可;所以不推荐用。
2.自己实现应用内崩溃收集,并上传服务器
在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler)。UncaughtExceptionHandler是一个函数指针,该函数需要我们实现,可以取自己想要的名字。当程序发生异常崩溃时,该函数会得到调用,这跟C,C++中的回调函数的概念是一样的。
获取到了崩溃日志,如何发送给开发者呢,目前一般有以下两种方式:
将崩溃信息持久化在本地,下次程序启动时,将崩溃信息作为日志发送给开发者。通过邮件发送给开发者。 不过此种方式需要得到用户的许可,因为iOS不能后台发送短信或者邮件,会弹出发送邮件的界面,只有用户点击了发送才可发送。
3.第三方收集crash
使用友盟、bugHD、Flurry 等第三方崩溃统计工具,原理都是根据系统产生的crash日志进行了一次提取或封装,然后将封装后的crash文件上传到对应的服务端进行解析处理。
优点是快速集成crash收集功能,有完善的后台管理界面和解析处理(crash文件是要解析后才能看懂的),好用还不要钱。
友盟崩溃统计官方文档 bugHD统计 Flurry
最后 恶意覆盖问题
崩溃收集统计函数应该只进行一次调用,如果用第三方的话也最好只用一个第三方,这样我们获取崩溃统计信息的途径也是唯一的。
第三方统计工具并不是用的越多越好,使用 多个崩溃收集第三方会导致NSSetUncaughtExceptionHandler()函数指针的恶意覆盖,现在很多第三方崩溃收集工具为了确保自己能最大可能的收集到崩溃信息,会对NSSetUncaughtExceptionHandler()函数指针的恶意覆盖。因为这个函数是将函数地址当做参数传递,所以只要重复调用就会被覆盖,这样就不能保证崩溃收集的稳定性。