macOS 15点击Dock图标打开双窗口问题求助
macOS 15下
applicationShouldHandleReopen导致重复打开窗口的问题解决 问题背景
- 在macOS 15之前,关闭所有窗口后点击Dock图标,应用不会自动重新打开窗口,因此在AppDelegate中实现了
applicationShouldHandleReopen方法,旧系统下可正常实现点击Dock图标重开窗口的功能。 - 升级到macOS 15后出现异常:
- 点击Dock图标会打开两个窗口,而非预期的一个;
- 注释掉
applicationShouldHandleReopen方法后,仅打开一个窗口,符合预期。
相关代码片段
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { guard let window = NSApplication.shared.windows.first else { assertionFailure(); return false } if !flag { window.makeKeyAndOrderFront(nil) } return true }
尝试过的无效操作
添加@available(macOS, introduced: 10.0, obsoleted: 15.0)标记该方法,意图让macOS 15忽略此方法,但结果是窗口完全无法启动。
解决方案
macOS 15对applicationShouldHandleReopen的行为逻辑做了调整:当方法返回true时,系统会自动执行默认的重开窗口操作,而原有代码中手动调用window.makeKeyAndOrderFront(nil),导致两次触发窗口打开,从而出现双窗口问题。
方案一:分版本处理逻辑
保留方法以兼容旧系统,针对macOS 15+版本不再手动操作窗口,交由系统默认逻辑处理:
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { if #available(macOS 15.0, *) { // macOS 15+ 依赖系统默认行为,无需手动显示窗口 return true } else { guard let window = NSApplication.shared.windows.first else { assertionFailure(); return false } if !flag { window.makeKeyAndOrderFront(nil) } return true } }
方案二:标记方法并依赖系统默认行为
通过版本标记将方法标记为macOS 15+过时,同时确保系统默认行为正常工作:
@available(macOS, introduced: 10.0, deprecated: 15.0, message: "依赖系统默认行为处理窗口重开") func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { guard let window = NSApplication.shared.windows.first else { assertionFailure(); return false } if !flag { window.makeKeyAndOrderFront(nil) } return true }
注意:若采用此方案,需确认macOS 15+下应用的默认行为正常——即无可见窗口时点击Dock图标会自动打开窗口。若默认行为不生效,检查Info.plist中LSUIElement是否设为YES(该设置会禁用Dock图标触发的窗口恢复),同时确认窗口的恢复配置正确。
内容的提问来源于stack exchange,提问作者rizwana desai
相关产品推荐
相关产品推荐

