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
相关产品推荐
相关产品推荐

