You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS应用集成状态恢复功能时遭遇报错:No windows have a root view controller, cannot save application state

我之前也遇到过一模一样的问题!这个报错的核心原因其实是系统尝试保存应用状态时,找不到有效的强引用window实例,或者window的rootViewController已经不存在了。我们一步步来解决:

1. 检查AppDelegate中window属性的引用类型

首先,确认你的AppDelegate里的window声明是强引用——如果是weak var window: UIWindow?,那在configureWindow()方法执行完后,局部创建的window对象会被释放,self.window也会变成nil,系统保存状态时自然找不到它。

把AppDelegate里的window声明改成:

var window: UIWindow? // 默认是强引用,不要加weak修饰

2. 确保状态保存时window和rootVC确实存在

你可以在shouldSaveSecureApplicationState方法里主动做一次校验,避免系统报错,甚至手动触发根视图控制器的状态保存:

func application(_ application: UIApplication, shouldSaveSecureApplicationState coder: NSCoder) -> Bool {
    // 先确认window和rootViewController都存在
    guard let window = self.window, let rootNav = window.rootViewController as? RootNavigationController else {
        print("Window or root VC not available, skipping state save")
        return false
    }
    
    // 手动触发导航控制器及其子控制器的状态保存
    rootNav.encodeRestorableState(with: coder)
    return true
}

3. 清理Info.plist中的Scene配置(如果存在)

如果你的项目里之前添加过SceneDelegate相关的配置,即使现在不用了,系统可能还是会尝试走Scene的逻辑,干扰AppDelegate的window管理。打开Info.plist,找到Application Scene Manifest条目,要么:

  • 把Enable Multiple Windows设置为NO
  • 或者直接删除整个Application Scene Manifest字典(如果完全不需要Scene功能)

做完这几步,再测试退出应用,应该就不会再出现那个报错了。本质上就是要保证系统在保存状态时,window是被强引用着的,并且rootViewController确实存在。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:23:12