如何获取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的方法:

  1. static inline UIWindow* BRGetKeyWindow() {
  2. UIWindow* keyWindow = nil;
  3. if (@available(iOS 13.0, *)) {
  4. NSSet<UIScene*>* connectedScenes = [UIApplication sharedApplication].connectedScenes;
  5. for (UIScene* scene in connectedScenes) {
  6. if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:[UIWindowScene class]]) {
  7. UIWindowScene* windowScene = (UIWindowScene*)scene;
  8. for (UIWindow* window in windowScene.windows) {
  9. if (window.isKeyWindow) {
  10. keyWindow = window;
  11. break;
  12. }
  13. }
  14. }
  15. }
  16. } else {
  17. #if __IPHONE_OS_VERSION_MIN_REQUIRED < 130000
  18. return [UIApplication sharedApplication].keyWindow;
  19. #endif
  20. }
  21. return keyWindow;
  22. }

这个方法首先检查当前iOS版本是否大于等于iOS 13.0。如果是,则通过[UIApplication sharedApplication].connectedScenes获取当前所有连接的场景(UIScene)。然后遍历这些场景,检查场景的激活状态是否为前台激活,并且场景的类型是否为UIWindowScene。如果是,则进一步遍历该场景的所有窗口,找到keyWindow。如果当前iOS版本小于13.0,则直接返回[UIApplication sharedApplication].keyWindow作为keyWindow。
除了上述方法外,我们还可以使用扩展UIApplication的方式来获取keyWindow:

  1. extension UIApplication {
  2. var keyWindow: UIWindow? {
  3. self.connectedScenes.filter{$0.activationState == .foregroundActive}.compactMap{$0 as? UIWindowScene}.first?.windows.filter{$0.isKeyWindow}.first
  4. }
  5. }

这个扩展方法首先通过self.connectedScenes获取当前所有连接的场景,然后筛选出激活状态为前台激活的场景。接着将这些场景转换为UIWindowScene类型,并获取第一个场景。最后在该场景的所有窗口中筛选出keyWindow。这个方法返回的是一个可选类型的UIWindow对象,如果当前没有keyWindow,则返回nil。
需要注意的是,由于iOS系统的不断更新,获取keyWindow的方式也在不断变化。因此在实际开发中,我们需要根据具体的iOS版本和需求选择合适的方法来获取keyWindow。同时,也需要时刻关注苹果官方文档开发者论坛,以便及时了解最新的开发动态和最佳实践。

article bottom image

相关文章推荐

发表评论