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

