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

如何让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文件到邮箱,这就看各个应用的需求了。

?

原文来自:触控科技博客

抱歉!评论已关闭.

  • 马上背!十九大报告中的四个“新” 2019-02-16
  • 蒲县工商质监局非公党委举办2018元旦文艺会 2019-02-16
  • 人民网评:建设数字中国时不我待 2019-02-16
  • 618史上最壕“买家”现身 Google以 5.5亿美元投资京东 2019-02-15
  • 雍正官窑:朕就是这样的品味(图) 2019-02-15
  • 西安司法考试将试点机考 2019-02-15
  • 人民日报新媒体矩阵聚焦十九大 融媒报道"给你好看" 2019-02-14
  • 社会主义是过渡阶段,最终实现共产主义才是其目的。社会主义是在消灭私有制,建立公有制直至无私,实现共产主义。 2019-02-14
  • 四轮电动车销售火爆存安全隐患 专家:需建国家标准 2019-02-14
  • 看懂汽车三元催化器工作原理后还能当金子卖?难为非洲兄弟了! 2019-02-14
  • 周杰伦昆凌为儿子庆生 小小周帅气入镜 2019-02-13
  • 都以为机器人普及了,一切都不是问题了?机器人不需要不断升级?机器人生产啥?不需要人设计? 2019-02-13
  • 价值-热门标签-华商生活 2019-02-13
  • 上合组织引领发展 吉中合作稳步前行——访吉尔吉斯斯坦总统热恩别科夫 2019-02-13
  • 互联网金融协会提示:防范变相“现金贷”业务风险 2019-02-12
  • 335| 579| 40| 359| 885| 485| 57| 905| 192| 482|