现在的位置: 首页 > 综合 > 正文

如何让IOS应用从容地崩溃

2018年07月13日 ⁄ 综合 ⁄ 共 2287字 ⁄ 字号 评论关闭

秒速赛车公式 www.l19l7.cn

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

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

在didFinishLaunchingWithOptions 中,加入

代码如下:

Source code???

  1. signal(SIGABRT,?MySignalHandler);??
  2. ??
  3. signal(SIGILL,?MySignalHandler);??
  4. ??
  5. signal(SIGSEGV,?MySignalHandler);??
  6. ??
  7. signal(SIGFPE,?MySignalHandler);??
  8. ??
  9. signal(SIGBUS,?MySignalHandler);??
  10. ??
  11. signal(SIGPIPE,?MySignalHandler);??


回调函数MySignalHandler的定义如下:

  1. void?MySignalHandler(int?signal)??
  2. ??
  3. {??
  4. ??
  5. int32_t?exceptionCount?=?OSAtomicIncrement32(&UncaughtExceptionCount);??
  6. ??
  7. if?(exceptionCount?>?UncaughtExceptionMaximum)??
  8. ??
  9. {??
  10. ??
  11. return;??
  12. ??
  13. }??
  14. ??
  15. NSMutableDictionary?*userInfo?=[NSMutableDictionary???dictionaryWithObject:[NSNumber?numberWithInt:signal]??
  16. ??
  17. forKey:UncaughtExceptionHandlerSignalKey];??
  18. ??
  19. NSArray?*callStack?=?[UncaughtExceptionHandler?backtrace];??
  20. ??
  21. [userInfo?setObject:callStack?forKey:UncaughtExceptionHandlerAddressesKey];??
  22. ??
  23. [[[[UncaughtExceptionHandler?alloc]?init]?autorelease]??
  24. ??
  25. performSelectorOnMainThread:@selector(handleException:)??
  26. ??
  27. withObject:??
  28. ??
  29. [NSException??
  30. ??
  31. exceptionWithName:UncaughtExceptionHandlerSignalExceptionName??
  32. ??
  33. reason:??
  34. ??
  35. [NSString?stringWithFormat:??
  36. ??
  37. NSLocalizedString(@"Signal?%d?was?raised.\n"??
  38. ??
  39. @"%@",?nil),??
  40. ??
  41. signal,?getAppInfo()]??
  42. ??
  43. userInfo:??
  44. ??
  45. [NSDictionary?dictionaryWithObject:[NSNumber?numberWithInt:signal]?forKey:UncaughtExceptionHandlerSignalKey]]?waitUntilDone:YES];??
  46. ??
  47. }??
  48. ??
  49. 这段代码将会在崩溃时弹出一个对话框,我们还可以让它显示出设备信息,如下:??
  50. ??
  51. NSString*?getAppInfo()??
  52. ??
  53. {??
  54. ??
  55. NSString?*appInfo?=?[NSString?stringWithFormat:@"App?:?%@?%@(%@)\nDevice?:?%@\nOS?Version?:?%@?%@\nUDID?:?%@\n",??
  56. ??
  57. [[NSBundle?mainBundle]?objectForInfoDictionaryKey:@"CFBundleDisplayName"],??
  58. ??
  59. [[NSBundle?mainBundle]?objectForInfoDictionaryKey:@"CFBundleShortVersionString"],??
  60. ??
  61. [[NSBundle?mainBundle]?objectForInfoDictionaryKey:@"CFBundleVersion"],??
  62. ??
  63. [UIDevice?currentDevice].model,??
  64. ??
  65. [UIDevice?currentDevice].systemName,??
  66. ??
  67. [UIDevice?currentDevice].systemVersion,??
  68. ??
  69. [UIDevice?currentDevice].uniqueIdentifier];??
  70. ??
  71. NSLog(@"Crash!!!!?%@",?appInfo);??
  72. ??
  73. return?appInfo;??
  74. ??
  75. }??

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

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

?

原文来自:触控科技博客

抱歉!评论已关闭.

  • 听,盲童唱出心底的阳光 2018-12-17
  • 老婆告老公索债780万 原是二人自导自演 2018-12-17
  • 井冈山交警开展重点车辆严重交通违法行为有奖举报工作 2018-12-17
  • 停车收费新政首日举报量攀升 2018-12-17
  • 这是世界杯开赛当晚的广西 2018-12-16
  • 【理上网来·喜迎十九大】建设世界一流军队的科学指南 2018-12-16
  • 第六届北京农业嘉年华--北京频道--人民网 2018-12-16
  • 【专题】节能降耗 保卫蓝天——浙江省暨杭州市2018年节能宣传周 2018-12-15
  • 【奋斗在新时代】劳道“歹猫”增色互联网“表情” 2018-12-15
  • 驾车撞倒城管队员反复碾压 义乌暴力摊贩被刑拘 2018-12-15
  • 《中国汽车报》2018“西部温暖计划”公益试驾活动即将启程 2018-12-14
  • 奇瑞新能源瑞虎3xe上市 售价8.98万 2018-12-14
  • 几家性价比超高的烤肉店 赶紧去试试 2018-12-14
  • 和“看着就想笑”说说你的“8421” 2018-12-13
  • 中共十八大以来藏语新词术语发布 2018-12-13
  • 707| 193| 862| 808| 130| 665| 818| 567| 261| 954|