iOS13后获取Window

在新创建的项目中,AppDelegate默认没有window属性。但为了兼容iOS 12及以下版本,一般项目中还是得自己加上

@property (strongnonatomic) UIWindow *window;

也就是说,有两种情况,可以直接使用旧方法 [[[UIApplication sharedApplication] delegate] window] 来获取
1. 旧项目中,如果没有使用SceneDelegate
2. iOS 12及以下版本

但iOS13后,苹果为了兼容分屏功能,加入了SceneDelegate。具体在这里就不展开,回归主题~~

在SDK开发中, SDK工程没有AppDelegate和SceneDelegate。我们也没有办法保证使用者的App是怎样操作的,所以贴上自己的解决方法。

代码

```

+(UIWindow*)getCurrentWindow

{

    if([[[UIApplication sharedApplication] delegate] window]) {

        return[[[UIApplication sharedApplication] delegate] window];

    }else{

        if(@available(iOS13.0, *)) {

            NSArray *array =[[[UIApplication sharedApplication] connectedScenes] allObjects];

            UIWindowScene* windowScene = (UIWindowScene*)array[0];

            //如果是普通App开发,可以使用

//            SceneDelegate * delegate = (SceneDelegate *)windowScene.delegate;

//            UIWindow * mainWindow = delegate.window;

            //由于在sdk开发中,引入不了SceneDelegate的头文件,所以需要用kvc获取宿主app的window.

            UIWindow* mainWindow = [windowScenevalueForKeyPath:@"delegate.window"];

            if(mainWindow) {

                returnmainWindow;

            }else{

                return[UIApplication sharedApplication].windows.lastObject;

            }

        }else{

            // Fallback on earlier versions

            return[UIApplication sharedApplication].keyWindow;

        }

    }

}

```

小弟不才,若有错误之处,欢迎留言讨论(^_^)


2020.12.03  更新:
在项目迭代中发现一个小问题,当windows上有子视图,例如:播放器的全屏。
调用 [UIApplication sharedApplication].windows.lastObject;  拿到的是最顶层视图,如果需要拿最底层的window视图,需要改成firstObject


2021..4.15 更新:
补充上swift版本 , 旧文章好像没有办法变成markdown模式。。。将就看一下吧

```

/// 获取当前window

/// - Returns: 窗口

    @objc public static func getCurrentWindow() -> UIWindow

    {

        ifletwindow:UIWindow= (UIApplication.shared.delegate?.window)! {

//            print(window);

            returnwindow

        }else{

            if#available(iOS13.0, *) {

                let array:Set = UIApplication.shared.connectedScenes

                letwindowScene:UIWindowScene= array.firstas!UIWindowScene

                //如果是普通App开发,可以使用

//            SceneDelegate * delegate = (SceneDelegate *)windowScene.delegate;

//            UIWindow * mainWindow = delegate.window;

                ifletmainWindow:UIWindow= windowScene.value(forKeyPath:"delegate.window")as?UIWindow{

                    returnmainWindow

                }else{

                    return UIApplication.shared.windows.first!

                }

            }else{

                return UIApplication.shared.keyWindow!

            }

        }

    }

```

你可能感兴趣的:(iOS13后获取Window)