在新创建的项目中,AppDelegate默认没有window属性。但为了兼容iOS 12及以下版本,一般项目中还是得自己加上
@property (strong, nonatomic) 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;
}
}
}
小弟不才,若有错误之处,欢迎留言讨论(^_^)
网友评论