Xcode 13构建的App在iOS 12设备启动即崩溃如何解决?
问题根因
UINavigationBarAppearance 是 iOS 13 才正式发布的系统类,iOS 12 及更低版本的系统框架中不存在该类,所以启动时加载到这个类的实例化逻辑会直接抛出找不到类的异常。
崩溃早于 didFinishLaunchingWithOptions 触发的原因:你的App大概率是在Storyboard/XIB中配置了导航栏的外观属性,App启动时会优先加载入口界面的资源文件,资源解码过程就会尝试实例化对应的类,这个过程发生在App生命周期回调之前,所以你在didFinishLaunchingWithOptions里加判断也拦不住。
之前Xcode 12构建正常的原因:旧版Xcode在你选择兼容iOS12的情况下,会自动忽略XIB中高于最低兼容版本的属性配置,不会把UINavigationBarAppearance的相关配置序列化到最终的安装包内;新版Xcode默认不会做这个过滤,直接把高版本配置打包进去就会触发iOS12上的崩溃。
修复方案
- 优先排查所有Storyboard/XIB文件中的UINavigationBar相关配置:
找到任意导航栏的Appearance配置项,要么将该XIB的最低部署版本设置为iOS13+,要么直接删除XIB中的导航栏外观配置,改为纯代码控制。 - 所有用到UINavigationBarAppearance的代码位置必须加系统版本判断,示例如下:
Objective-C 示例
Swift 示例if (@available(iOS 13.0, *)) { UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init]; // 自定义外观配置 appearance.backgroundColor = [UIColor whiteColor]; [UINavigationBar appearance].standardAppearance = appearance; [UINavigationBar appearance].scrollEdgeAppearance = appearance; } else { // iOS12及以下用旧API实现相同效果 [UINavigationBar appearance].barTintColor = [UIColor whiteColor]; }if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() // 自定义外观配置 appearance.backgroundColor = .white UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance } else { // iOS12及以下用旧API实现相同效果 UINavigationBar.appearance().barTintColor = .white } - 排查项目依赖的第三方库:如果有第三方库用到了UINavigationBarAppearance且未加版本判断,需要降级到兼容iOS12的版本,或者自行修改第三方库代码添加版本判断。
内容的提问来源于stack exchange,提问作者Mat Yus
相关产品推荐
相关产品推荐

