适配iOS 13 (Xcode11) / SceneDelegate.m 有感
xcode 11之后,创建新项目会自动出现SceneDelegate.h/.m文件,iOS 13之后的手机都会走这个类,不会再走AppDelegate.m (苹果此举就是为了让大家都升iOS13吧)
我新建了一个项目,在SceneDelegate.m里面注册,然后拿了一个iOS13以下的手机真机测试,发现手机屏幕一片黑暗,说明该系统的手机没有走SceneDelegate.m这个类; 当我删除了SceneDelegate.m里的注册代码, 在AppDelegate.m里写,该手机则可以正常显示项目。说明该系统的手机走了AppDelegate.m这个类。
所以新项目为了适配所有系统机型,得分别在 SceneDelegate.m 与 AppDelegate.m 写两套代码;
但是这个方法比较麻烦,因为你在开发过程中会发现很多地方都要适配,例如:获取主window。
之前就代码获取主window的方法为 :
UIView * rootView = [UIApplication sharedApplication].delegate.window.rootViewController.view;
这个代码要是iOS 13以上的手机运行就会报错,因为iOS13以上的手机根本没有UIApplication这个类
解决这个方法得适配:如下图
代码如下:(为了防止图片丢失,再贴个代码吧)
UIWindow *rootWindow;
for (UIScene *scene in [UIApplication sharedApplication].connectedScenes)
{
if ([scene isKindOfClass:UIWindowScene.class] &&
[scene.delegate respondsToSelector:@selector(window)] &&
scene.activationState == UISceneActivationStateForegroundActive)
{
id <UIWindowSceneDelegate> delegate = (id <UIWindowSceneDelegate>)scene.delegate;
rootWindow = delegate.window;
}
}
UIView * rootView = rootWindow;
这就很烦!
往后倒入很多第三方的弹框控件,基本上获取主window都是使用UIApplication方法
所以一劳永逸的方法就是删除掉SceneDelegate.h/.m文件;把所有代码都写在AppDelegate.m里。如此,所有系统的手机都会走这个方法
删除方法分3步进行:
1.首先,删除Scenedelegate.h/.m文件
2.删除info.plist文件中的Application scene manifest (如下图:)
3.删除AppDelegate.m文件的 configurationForConnectingSceneSession和didDiscardSceneSessions 两个方法 (如下图)
完成以上3步,重新启动即可!