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

如何让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-04-19
  • 长效机制加速推进 楼市下半年或持续降温 2019-04-19
  • 树立文化自信 创新节庆模式 2019-04-19
  • 朝韩将军级会谈时隔11年后在板门店重启 2019-04-19
  • 经济日报多媒体数字报刊 2019-04-18
  • 搞好公有制就是好,故得出结论:计划经济好。 2019-04-18
  • 云南理发店老板涉嫌杀害女演员因办卡纠纷起杀心 2019-04-18
  • 南海网-海南新闻网-权威媒体 海南门户 2019-04-17
  • 海底捞回应侵犯音乐人林海著作权:已停止播放 2019-04-17
  • 自然型社会和规则性社会,是会随着科技的改变而发生改变的,当然只有规矩也就是制度才能规范人的行为,所以国家是不会灭亡的,但国家的形式是会发生改变的。 2019-04-17
  • 惊艳!上外学子英译60首热门中文歌  让世界倾听中国 2019-04-16
  • 西安,给盲人朋友留一条路吧…无障碍设施盲道-编辑整合 2019-04-16
  • 的确如此。报刊亭取消的确是短视行为。把报刊亭设计的现代化一些,与城市绿化衔接起来,相得益彰,成为文化一景多好。 2019-04-16
  • 让更多企业和劳动者尝到协商的“甜头” 2019-04-16
  • 2014金家岭财富论坛嘉宾云集(二) 2019-04-15
  • 948| 791| 126| 827| 684| 161| 866| 890| 108| 629|