文/donglin

虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧。

IOS SDK中提供了一个现成的函数 NSSetUncaughtExceptionHandler 用来做异常处理,但功能非常有限,而引起崩溃的大多数原因如:内存访问错误,重复释放等错误就无能为力了,因为这种错误它抛出的是Signal,所以必须要专门做Signal处理。在didFinishLaunchingWithOptions 中,加入

代码如下:

Source code   

signal(SIGABRT, MySignalHandler);

signal(SIGILL, MySignalHandler);

signal(SIGSEGV, MySignalHandler);

signal(SIGFPE, MySignalHandler);

signal(SIGBUS, MySignalHandler);

signal(SIGPIPE, MySignalHandler);

回调函数MySignalHandler的定义如下:

void MySignalHandler(int signal)

{

int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount);

if (exceptionCount > UncaughtExceptionMaximum)

{

return;

}

NSMutableDictionary *userInfo =

[NSMutableDictionary

dictionaryWithObject:[NSNumber numberWithInt:signal]

forKey:UncaughtExceptionHandlerSignalKey];

NSArray *callStack = [UncaughtExceptionHandler backtrace];

[userInfo

setObject:callStack

forKey:UncaughtExceptionHandlerAddressesKey];

[[[[UncaughtExceptionHandler alloc] init] autorelease]

performSelectorOnMainThread:@selector(handleException:)

withObject:

[NSException

exceptionWithName:UncaughtExceptionHandlerSignalExceptionName

reason:

[NSString stringWithFormat:

NSLocalizedString(@"Signal %d was raised.\n"

@"%@", nil),

signal, getAppInfo()]

userInfo:

[NSDictionary

dictionaryWithObject:[NSNumber numberWithInt:signal]

forKey:UncaughtExceptionHandlerSignalKey]]

waitUntilDone:YES];

}

这段代码将会在崩溃时弹出一个对话框,我们还可以让它显示出设备信息,如下:

NSString* getAppInfo()

{

NSString *appInfo = [NSString stringWithFormat:@"App : %@ %@(%@)\nDevice : %@\nOS Version : %@ %@\nUDID : %@\n",

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"],

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"],

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"],

[UIDevice currentDevice].model,

[UIDevice currentDevice].systemName,

[UIDevice currentDevice].systemVersion,

[UIDevice currentDevice].uniqueIdentifier];

NSLog(@"Crash!!!! %@", appInfo);

return appInfo;

}

在程序中加入这些代码之后,基本上所有崩溃都能Hold住了。崩溃时将会显示出如下的对话框:

这样在崩溃时还能从容地弹出对话框,比起闪退来,用户也不会觉得那么不爽。然后在下次启动时还可以通过邮件来发送Crash文件到邮箱,这就看各个应用的需求了。

原文来自:触控科技博客

转载于:https://www.cnblogs.com/ligun123/archive/2012/08/30/2663795.html

如何让IOS应用从容地崩溃相关推荐

  1. iOS 如何让IOS应用从容地崩溃

    虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧. "" 阅读器 经验分享小技巧应用崩溃 文/dongl ...

  2. iOS使用 Metrickit 收集崩溃日志

    iOS使用 Metrickit 收集崩溃日志 Metrickit 是什么 MetricKit 是 苹果在 iOS13系统开始引入的用来汇总和分析有关异常和崩溃诊断以及电源和性能指标的每个设备的报告. ...

  3. ios运行html游戏,Html游戏 - IOS的​​Safari浏览器崩溃

    我正在运行一个HTML应用程序开发使用打字稿,pixi.js webgl,网络音频.Html游戏 - IOS的​​Safari浏览器崩溃 游戏在各种设备和浏览器上的windows和android上运行 ...

  4. iOS线上APP崩溃(Crash)分析

    这两周一直在研究如何追踪线上的bug,如何快速分析出程序到底崩溃在什么地方,从底层了解Crash是如何产生的.如何传递的.以及是如何分析出来的.虽然项目组并没有对这些要求很严格,但是作为一个高级开发人 ...

  5. iOS 中捕获程序崩溃日志

    iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时 ...

  6. iOS上线后程序崩溃日志处理-- Crashlytics

    iOS崩溃日志处理-- Crashlytics 前言: 在iOS开发的过程中和测试阶段会处理掉一些比较常的错误.和崩溃的信息.但是当我们的APP上线之后,如果发生了崩溃的事件.对于此事件的处理方式: ...

  7. Facebook SDK for iOS 2.4 iOS 6 上运行崩溃

    Facebook SDK2.4版本使用FBSDKLoginButton 在ios6上会崩溃 解决方法:不使用该sdk自带按钮,用自定义按钮实现.并且将工程BuildPhases-Link Binary ...

  8. ios bugly如何定位崩溃

    ios接了bugly,可是崩溃的时候显示的都是二进制的地址信息,无法定位问题,可是bugly的符号表上传工具总是上传失败,怎么办呢?今天摸索出一个新的办法. 如图,怎么定位上面的崩溃发生在代码的哪一行 ...

  9. iOS开发-App应用崩溃卡顿分析

    文章目录 App崩溃问题 可捕获的崩溃信息收集 PLCrashReporter实现 系统接口 不可捕获的崩溃 iOS后台模式 Runloop 卡顿 Watch Dog 内存达到单个App上限被杀死 J ...

最新文章

  1. 面试官:小伙汁,你画的SpringMVC请求处理过程是从网上抄的吧?
  2. CEO 赠书 | 打破创新神话,揭示创新本质
  3. 从笑话中看到产品创意
  4. AI又被彩虹吹?!新浪财经:应届博士算法毕业,80万年薪被疯抢
  5. Linux基础(iptables与firewalld防火墙)
  6. 简述计算机j选件,计算机组成原理06new.ppt
  7. 信贷ABS资产静态池与动态池里的数据分析内容都有啥
  8. L1-026 I Love GPLT
  9. Dubbo 是如何控制并发数和限流的?
  10. yaf写入把数据库信息写入redis,再取出来传到页面上显示 2016-10-22
  11. paip.Image对象出现“对象当前正在其他地方使用或者GDI+中发生一般性错误的解决
  12. Jmeter怎么连接数据库
  13. VC dimension(Vapnik-Chervonenkis dimension)
  14. 作为项目经理如何做好项目进度管理
  15. web前端vue融云即时通讯上手
  16. 英文书籍下载常用网站
  17. 技术人的充电时刻,200分钟QA交流,尽在SDCC 2017·深圳站
  18. STM32HAL库-内部Flash在指定页读写保护示例
  19. 拆散彩虹:牛顿生命最后时光里的棱镜
  20. 如何使用VLC媒体播放软件下载网页上视频?

热门文章

  1. a大于10小于15C语言,计算机基础复习模拟试卷
  2. java路径在那_Java 路径
  3. php的五大,PHP 7的五大效能
  4. python scrapy框架爬虫当当图书网
  5. python中的tail()_让VASP实现固定应力张量计算的python脚本
  6. python3 安装opencv_树莓派安装Python3的OpenCV
  7. poj 2378 树型dp
  8. 使用Android OpenGL ES 2.0绘图之二:定义形状
  9. 遵循Java EE标准体系的开源GIS服务平台之一:平台架构
  10. android qq robot,安卓qq授权登陆源代码