造成奔溃的原因
- 数组越界
- 多线程问题:在子线程更新 UI,多个线程进行读取操作
- 主线程无响应:主线程超过系统规定的时间无响应,就会被 Watchdog 杀掉
- 野指针:指针指向一个已经删除的对象访问内存区域,会出现也野指针奔溃
信号可捕获的奔溃日志
在提交时选上 “Upload your app’s symbols to receive symbolicated reports from Apple”,就可以直接在 Xcode 的 Archive中看到符号化后的崩溃日志。
信号捕获不到的奔溃 后台奔溃
后台保活
- Background Mode:在 app 审核时,会提高要求。通常只有地图,音乐播放器等 app 才能通过审核
- Background Fetch:唤醒时间不稳定,且用户可以在系统设置中关闭,导致使用场景比较少
- Silent Push:是推送的一种。可以在后台唤起 app 30秒。会调用
application:didReceiveRemoteNotifiacation:fetchCompletionHandler:
方法 - PushKit:后台唤醒 App 30秒。主要用与提高 VoIP 应用的体验
- Background Task:使用的最多,后台任务
Background Task
系统提供beginBackgroundTaskWithExpirationHandler
方法来延长后台执行时间
1 | - (void)applicationDidEnterBackground:(UIApplication *)application { |
yourTask 最多执行3分钟,3分钟内执行完毕,app 就会被挂起。3分钟内没完成,系统会强制杀掉进程。
采集信息
- 进程信息:崩溃进程相关的信息
- 基本信息:奔溃发生的日期,iOS版本
- 异常信息:异常类型,异常编码,异常的线程
- 线程回溯:奔溃时的方法调用栈
常见的异常编码:
- 0x8badf00d:表示 App 在一定时间内无响应而被 watchdog 杀掉的情况。
- 0xdeadfa11:表示被用户强制退出。
- 0xc00010ff:表示 App 因为运行造成设备温度太高而被杀掉。