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

iOS Catalyst应用多窗口异常关闭后重启恢复多窗口,如何设置重启仅加载单窗口

iOS Catalyst应用重启后仅保留单窗口的实现方案

这个问题的根因是Catalyst默认继承了macOS的窗口状态恢复机制,应用异常退出前系统会自动缓存所有打开窗口的状态,下次启动时默认重建所有已缓存的窗口。按以下两种方案均可实现启动仅加载单个窗口的需求:

方案1:全局禁用窗口状态恢复(最简实现)

直接在应用启动入口处清除所有已保存的窗口状态,同时禁用状态持久化能力:

  • 代码需放在application:didFinishLaunchingWithOptions的最前端,确保系统开始恢复窗口前执行生效
  • Objective-C 示例代码:
// 禁用自动状态恢复
[NSUserDefaults.standardUserDefaults setObject:@YES forKey:@"NSDisableAutomaticTermination"];
[NSUserDefaults.standardUserDefaults setObject:@YES forKey:@"NSSupportsSuddenTermination"];
// 清空已保存的窗口缓存
[[NSClassFromString(@"NSApplication") sharedApplication] discardSavedWindowState];
  • Swift 示例代码:
// 禁用自动状态恢复
UserDefaults.standard.set(true, forKey: "NSDisableAutomaticTermination")
UserDefaults.standard.set(true, forKey: "NSSupportsSuddenTermination")
// 清空已保存的窗口缓存
NSApplication.shared.discardSavedWindowState()

方案2:自定义Scene会话管理(保留部分恢复能力)

如果需要保留其他状态恢复能力,仅过滤多窗口恢复逻辑,可通过Scene生命周期方法控制:

  • 在application:configurationForConnectingSceneSession:options:方法中,销毁所有历史会话,仅保留新创建的主窗口会话
  • Swift 示例代码:
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    // 销毁所有非当前新建的旧会话
    UIApplication.shared.openSessions.forEach { session in
        guard session != connectingSceneSession else { return }
        UIApplication.shared.requestSceneSessionDestruction(session, options: nil)
    }
    // 返回主窗口默认配置
    let config = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    config.delegateClass = SceneDelegate.self
    return config
}

验证逻辑:修改完成后打开多个窗口,强制退出应用再重新启动,确认仅加载1个默认主窗口即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:54:04