React Native iOS真机抛出“Application tried to present modally...”异常
iOS真机模态视图控制器异常排查方案
问题概述
模拟器运行正常,真机启动时在UIApplicationMain方法抛出异常,异常信息:
Application tried to present modally a view controller <UIViewController: 0x10785cb20> that is already being presented by <UIViewController: 0x107e07440>
注:提供的main.m仅为应用入口代码,异常根源不在该文件,需从应用启动流程的视图控制器跳转逻辑入手排查。
核心原因
异常本质是同一视图控制器被重复发起模态present操作,或当前已有未完成的模态present流程时,又触发了新的present请求。真机与模拟器的运行时序、线程调度存在差异,导致模拟器未触发冲突,真机暴露问题。
排查与解决步骤
- 检查启动流程中的present逻辑
重点排查AppDelegate的didFinishLaunchingWithOptions、根控制器的viewDidLoad/viewWillAppear/viewDidAppear方法:- 确认是否存在重复调用
presentViewController:animated:completion:的情况 - 避免在
viewDidLoad中执行present操作——此时视图未完成加载,真机易出现时序冲突,建议移至viewDidAppear:中执行
- 确认是否存在重复调用
- 添加present前的安全校验
执行present操作前,先判断当前控制器的present状态,避免冲突:// 安全present示例 if (!self.presentedViewController && !targetVC.isBeingPresented) { [self presentViewController:targetVC animated:YES completion:nil]; } - 排查异步操作导致的重复触发
若present逻辑由异步回调(如网络请求、通知)触发,需添加标记位防止重复执行:@property (nonatomic, assign) BOOL isPresenting; // 异步回调内的处理 if (!self.isPresenting) { self.isPresenting = YES; [self presentViewController:targetVC animated:YES completion:^{ self.isPresenting = NO; }]; } - 检查Storyboard/Scene配置
若使用Storyboard,确认是否存在多个Segue同时触发模态跳转,或初始控制器的跳转配置有误。
调试提示
真机线程调度更严格,建议开启Xcode的主线程检查器(Main Thread Checker),快速定位UI操作的线程问题。
内容的提问来源于stack exchange,提问作者Abhigyan Gaurav
相关产品推荐
相关产品推荐

