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

iOS 13起keyWindow被废弃,原有获取根控制器代码如何适配修改?

iOS 13及以上版本keyWindow废弃兼容解决方案

从iOS 13开始苹果引入多场景(Scene)机制,UIApplication.shared.keyWindow被正式废弃,因为App可同时存在多个活跃窗口,直接取keyWindow不再符合设计规范,可通过如下兼容方案调整代码。

全版本兼容替换代码

直接替换原有代码即可同时兼容iOS 13以下和以上系统:

// 统一获取当前活跃window
var currentWindow: UIWindow?
if #available(iOS 13.0, *) {
    currentWindow = UIApplication.shared.connectedScenes
        .filter { $0.activationState == .foregroundActive }
        .compactMap { $0 as? UIWindowScene }
        .first?.windows
        .first { $0.isKeyWindow }
} else {
    currentWindow = UIApplication.shared.keyWindow
}

// 原有业务逻辑保持不变
guard let navController = currentWindow?.rootViewController as? UINavigationController else { return }
guard let controller = navController.viewControllers[0] as? HomeController else { return }
controller.configureViewComponents()

可选优化方案

如果需要全局多处调用获取活跃window的逻辑,可以封装成UIApplication扩展简化调用:

extension UIApplication {
    var currentActiveWindow: UIWindow? {
        if #available(iOS 13.0, *) {
            return connectedScenes
                .filter { $0.activationState == .foregroundActive }
                .compactMap { $0 as? UIWindowScene }
                .first?.windows
                .first { $0.isKeyWindow }
        } else {
            return keyWindow
        }
    }
}

封装后原有业务代码可简化为:

guard let navController = UIApplication.shared.currentActiveWindow?.rootViewController as? UINavigationController else { return }
guard let controller = navController.viewControllers[0] as? HomeController else { return }
controller.configureViewComponents()

特殊情况说明

  • 若App未开启iPad多窗口支持,可直接去掉iOS 13分支中过滤前台活跃状态的逻辑,直接取首个UIWindowScene的keyWindow即可
  • 若项目最低支持版本已经升到iOS 13及以上,可直接删除iOS 13以下的兼容分支

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:02