适配iOS 13 (Xcode11) / SceneDelegate.m 有感

xcode 11之后,创建新项目会自动出现SceneDelegate.h/.m文件,iOS 13之后的手机都会走这个类,不会再走AppDelegate.m (苹果此举就是为了让大家都升iOS13吧)

适配iOS 13 (Xcode11) / SceneDelegate.m 有感

我新建了一个项目,在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这个类

解决这个方法得适配:如下图

适配iOS 13 (Xcode11) / SceneDelegate.m 有感

代码如下:(为了防止图片丢失,再贴个代码吧)

    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 (如下图:)

适配iOS 13 (Xcode11) / SceneDelegate.m 有感

3.删除AppDelegate.m文件的  configurationForConnectingSceneSession和didDiscardSceneSessions 两个方法 (如下图)

适配iOS 13 (Xcode11) / SceneDelegate.m 有感

完成以上3步,重新启动即可!