符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
我们都知道当我们的程序运行出现某些错误时会发生异常crash(崩溃),可是你有没有考虑过什么样的错误会产生crash?crash的本质又是什么?当应用上线后我们可以借助诸如bugly、crashlytics等三方工具来监控crash产生时的堆栈信息,那么应用未上线debug阶段时我们又该如何防范异常的发生呢?
我们提供的服务有:成都网站设计、成都网站建设、微信公众号开发、网站优化、网站认证、望都ssl等。为1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的望都网站制作公司
这些问题接下来我们将一一解答。
内核监测到错误的产生,向程序所在的进程发送停止运行程序的 消息 。
而发生错误的种类分为三种:
1. Mach异常:当试图读取不是映射给当前对应程序的内存时,Mach向进程发出 EXC_BAD_ACCESS异常消息。
2. BSD异常:程序自身检测出错误,向内核BSD层发送信号,BSD再向进程发出的消息。
3. 其他进程异常。
针对异常的产生原因,异常的捕获方法主要有以下两种:
1. 使用NSUncaughtExceptionHandler方法来对未捕获到的OC层面异常进行捕获。
2. 使用signal方法来注册BCD信号拦截内核中的异常。
```
void InstallUncaughtExceptionHandler()
{
//通过NSUncaughtExceptionHandler注册未捕获的OC异常
NSSetUncaughtExceptionHandler(OCExceptionHandler);
//通过signal捕获内核异常
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);
}
```
我们需要对注册函数中的两个handler进行集中处理。
处理过后的handler应该满足我们的正常需求。
最近遇到两次开发者账号注册设备异常问题如图
平常我都是通过xcode注册设备的,出现这种情况后的设备14天内就不能在该开发者账号中使用了,这时需要在开发者账号中手动添加新的测试设备,手动配置证书后就可以正常真机运行使用了。
补充:已经异常的设备无法移除,14天后自动过期。需要在开发者账号中手动添加新的测试设备。
我们的程序经常出现异常造成闪退的现象,对于已经发布的APP,如何捕捉到这些异常,及时进行更新解决闪退,提高体验感呢?
对于一些简单,比如一些后台数据的处理,容易重现数组越界,字典空指针错误的,我们用oc的runtime方法进行捕获。比如NSArray的数组越界问题。
源码地址: GitHub地址
我们可以通过runtime进行方法替换,比如我们捕获NSArray的数组越界问题,注意NSArray 是个类簇所以不能简单添加类目
当然这种捕获只能捕获单一的问题,还有其他的报错,那就要写很多的分类处理,如何进行统一的捕捉呢,我们查看下报错信息看下能不找到有用的信息。
如图我们看了报错的方法栈。看到有libobjc的调用。这个就很熟悉了,去看下runtime的源码。可以找到set_terminate设置中止的回调,也就是如果出现报错,系统会回调这个函数,如果外界没有传这个函数objc_setUncaightExceptionHandler,系统会使用默认的实现。 我们只要调用NSSetUncaughtExceptionHandler就可以设置这个方法句柄,系统出现报错时候,回调这个方法,从而让我们对这个错误进行处理.
在AppDelegate里面设置这个方法句柄
然后就可以捕捉异常 ,上传服务或者保存在本地。
然后在这个对象中通过runloop,保住线程,处理后再崩溃.
iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的。
iOS提供了异常发生的处理API,我们在程序启动的时候可以添加这样的Handler,这样的程序发生异常的时候就可以对这一部分的信息进行必要的处理,适时的反馈给开发者。
不足的地方是,并不是所有的程序崩溃都是由于发生可以捕捉的异常的,有些时候是因为内存等一些其他的错误导致程序的崩溃,这样的信息是不在这里体现的。
我做了一个简单的类,进行很基本的操作,可以添加和获取Handler,捕获到异常后将信息写入到app的Documens下的Exception.txt中。
其实还有很多的处理的办法。
l 比如可以在程序下一次起来的时候读取这个异常文件发生到服务端。
l 或者直接就是在处理代码中用openurl的方式(mailto:)调用发送邮件的方式,将异常信息直接变成邮件发送到指定地址。