iOS13后获取Window

作者: 又系黎小明 | 来源:发表于2020-06-06 08:55 被阅读0次

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

    @property (strongnonatomic) UIWindow *window;

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

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

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

    代码

    /// 获取当前window

    +(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;

            }

        }

    }



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

    相关文章

      网友评论

        本文标题:iOS13后获取Window

        本文链接:https://www.haomeiwen.com/subject/weqnzhtx.html