如何获取iOS中的keyWindow
2024.01.18 02:13浏览量:6简介:在iOS开发中,keyWindow是一个非常重要的概念。它表示当前屏幕上显示的最顶层的窗口。随着iOS版本的不断更新,获取keyWindow的方式也在不断变化。本文将介绍如何获取iOS中的keyWindow,并给出在不同情况下的解决方案。
千帆应用开发平台“智能体Pro”全新上线 限时免费体验
面向慢思考场景,支持低代码配置的方式创建“智能体Pro”应用
在iOS开发中,keyWindow是一个非常重要的概念。它表示当前屏幕上显示的最顶层的窗口,也就是用户正在与之交互的窗口。获取keyWindow的方式随着iOS版本的不断更新也在不断变化。下面我们将介绍在不同情况下如何获取keyWindow。
在iOS 13及以后的版本中,由于引入了SceneDelegate,我们不能再通过原来的[UIApplication sharedApplication].keyWindow
直接获取到正确的keyWindow。我们需要区分系统来获取keyWindow。
以下是一种在iOS 13及以后的版本中获取keyWindow的方法:
static inline UIWindow* BRGetKeyWindow() {
UIWindow* keyWindow = nil;
if (@available(iOS 13.0, *)) {
NSSet<UIScene*>* connectedScenes = [UIApplication sharedApplication].connectedScenes;
for (UIScene* scene in connectedScenes) {
if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:[UIWindowScene class]]) {
UIWindowScene* windowScene = (UIWindowScene*)scene;
for (UIWindow* window in windowScene.windows) {
if (window.isKeyWindow) {
keyWindow = window;
break;
}
}
}
}
} else {
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 130000
return [UIApplication sharedApplication].keyWindow;
#endif
}
return keyWindow;
}
这个方法首先检查当前iOS版本是否大于等于iOS 13.0。如果是,则通过[UIApplication sharedApplication].connectedScenes
获取当前所有连接的场景(UIScene)。然后遍历这些场景,检查场景的激活状态是否为前台激活,并且场景的类型是否为UIWindowScene
。如果是,则进一步遍历该场景的所有窗口,找到keyWindow。如果当前iOS版本小于13.0,则直接返回[UIApplication sharedApplication].keyWindow
作为keyWindow。
除了上述方法外,我们还可以使用扩展UIApplication的方式来获取keyWindow:
extension UIApplication {
var keyWindow: UIWindow? {
self.connectedScenes.filter{$0.activationState == .foregroundActive}.compactMap{$0 as? UIWindowScene}.first?.windows.filter{$0.isKeyWindow}.first
}
}
这个扩展方法首先通过self.connectedScenes
获取当前所有连接的场景,然后筛选出激活状态为前台激活的场景。接着将这些场景转换为UIWindowScene
类型,并获取第一个场景。最后在该场景的所有窗口中筛选出keyWindow。这个方法返回的是一个可选类型的UIWindow对象,如果当前没有keyWindow,则返回nil。
需要注意的是,由于iOS系统的不断更新,获取keyWindow的方式也在不断变化。因此在实际开发中,我们需要根据具体的iOS版本和需求选择合适的方法来获取keyWindow。同时,也需要时刻关注苹果官方文档和开发者论坛,以便及时了解最新的开发动态和最佳实践。

发表评论
登录后可评论,请前往 登录 或 注册