如何在iOS应用启动时检测上一次运行是否因致命错误崩溃
如何在iOS应用启动时检测上一次运行是否因致命错误崩溃
好问题!我之前做项目的时候刚好碰到过一模一样的需求,这儿有几个亲测有效的办法,你可以参考下:
方法一:用UserDefaults标记正常退出(无第三方依赖)
这个思路的核心是:只有当应用正常退出时,才写入一个“正常退出”的标记。下次启动时如果这个标记不存在或者为false,就说明上次大概率是崩溃退出了。
具体实现步骤:
- 应用启动时先检查标记:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let defaults = UserDefaults.standard let didExitNormally = defaults.bool(forKey: "AppDidExitNormally") // 如果标记为false,说明上次可能是崩溃或异常终止 if !didExitNormally { // 这里写你要显示的提示逻辑 showCrashNotification() } // 重置标记,默认当前启动后还未正常退出 defaults.set(false, forKey: "AppDidExitNormally") return true }
- 在应用正常退出/进入后台时更新标记:
// 应用将要被终止时(比如用户手动划掉) func applicationWillTerminate(_ application: UIApplication) { let defaults = UserDefaults.standard defaults.set(true, forKey: "AppDidExitNormally") } // 应用进入后台时也更新,避免系统因内存不足杀掉被误判 func applicationDidEnterBackground(_ application: UIApplication) { let defaults = UserDefaults.standard defaults.set(true, forKey: "AppDidExitNormally") }
注意事项:
这个方法唯一的小缺陷是:如果应用被系统强制终止(比如后台内存不足被回收),applicationWillTerminate可能没机会执行,这时候会被误判为崩溃。如果你的应用后台运行场景不多,这个方法完全够用。
方法二:利用Crashlytics自带的崩溃检测API(推荐,如果你已经在用Crashlytics)
既然你已经集成了Crashlytics,那它自带的API就是最省心的方案——它能精准区分“崩溃退出”和“系统主动终止”,不会有上面的误判问题。
具体代码:
import Crashlytics func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 检查上次运行是否崩溃 if Crashlytics.sharedInstance().didCrashDuringPreviousExecution() { // 触发你的提示逻辑 showCrashAlert() } // 别忘了初始化Crashlytics(如果还没在其他地方做的话) Crashlytics.sharedInstance().start(withAPIKey: "你的APIKey") return true }
为什么推荐?
Crashlytics会在应用崩溃的瞬间,就本地记录一个崩溃标记,下次启动时直接读取这个标记即可,完全不需要我们自己处理复杂的边界情况,准确率极高。
补充:不推荐的方案(读取系统崩溃日志)
有些朋友会想到直接去读取应用沙盒里的崩溃日志文件,但这个方法不仅需要解析复杂的日志格式,而且在iOS 10+之后,应用访问崩溃日志目录的权限有诸多限制,调试时可能能用,但上线后很容易出问题,所以不建议用。
内容来源于stack exchange
相关产品推荐
相关产品推荐

