美文网首页
iOS 13 SceneDelegate适配

iOS 13 SceneDelegate适配

作者: 码农_会写诗 | 来源:发表于2020-04-03 15:38 被阅读0次

    Xcode 11新建工程

    在Xcode 11 创建的工程,运行设备选择 iOS 13.0 以下的设备,运行应用时会出现黑屏现象。

    原因:

        Xcode 11 默认是会创建通过 UIScene 管理多个 UIWindow 的应用,工程中除了 AppDelegate 外会多一个 SceneDelegate

        AppDelegate和SceneDelegate这是iPadOS带来的新的多窗口支持的结果,并且有效地将应用程序委托的工作分成两部分。

    也就是说在我们用多窗口开发iPadOS中,从iOS 13开始,您的应用代表应该:

        设置应用程序期间所需的任何数据。

        响应任何专注于应用的事件,例如与您共享的文件。

        注册外部服务,例如推送通知。

        配置您的初始场景。

    相比之下,在iOS 13中的新顶级对象是一个UIWindowScene,场景代表可以处理应用程序用户界面的一个实例。因此,如果用户创建了两个显示您的应用程序的窗口,则您有两个场景,均由同一个应用程序委托支持。

    这些场景旨在彼此独立工作。因此,您的应用程序不再移动到后台,而是单个场景执行 - 用户可以将一个移动到后台,同时保持另一个打开。

    我们可以看下info.plist文件和工程项目文件的变化如图:

    在这里插入图片描述

    在这里插入图片描述

    适配方案一

    如果我们不开发iPadOS多窗口APP,SceneDelegate窗口管理我们可以不需要直接删掉就好了。

        删除掉info.plist中Application Scene Manifest选项,同时,文件SceneDelegate可删除可不删

        相关代码注释掉

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {

            return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)

        }

        func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {

        }

        //注释掉这两个方法。

        1

        2

        3

        4

        5

        6

        7

        8

        Appdelegate新增windows属性

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    //如果是用默认的storyboard,下面的代码可以不写

    //        window = UIWindow.init()

    //        window?.frame = UIScreen.main.bounds

    //        window?.makeKeyAndVisible()

    //        window?.rootViewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateInitialViewController()

            return true

        }

        ///做完这些就跟以前一样啦。

        1

        2

        3

        4

        5

        6

        7

        8

        9

        10

        11

    适配方案二

    即要用iOS 13中新的SceneDelegate,又可以在iOS 13一下的设备中完美运行。那就添加版本判断,利用@available

    步骤:

        SceneDelegate中添加@available(iOS 13, *)

    @available(iOS 13, *)

    class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    //在类的头部@available(iOS 13, *)添加即可

    ........

    ........

    .......

    }

        1

        2

        3

        4

        5

        6

        7

        AppDelegate中同样声明window属性

    var window: UIWindow?

    ///didFinishLaunchingWithOptions中添加版本判断

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    if #available(iOS 13, *) {

          }else {

                window = UIWindow.init()

                window?.frame = UIScreen.main.bounds

                window?.makeKeyAndVisible()

                window?.rootViewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateInitialViewController()

            }

            return true

        }

        1

        2

        3

        4

        5

        6

        7

        8

        9

        10

        11

        12

        AppDelegate中两个关于Scene的类也添加版本控制,Swift中可以用扩展单独拎出来,如下:

    @available(iOS 13.0, *)

    extension AppDelegate {

        // MARK: UISceneSession Lifecycle

        func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {

            return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)

        }

        func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {

        }

    }

    ///完工

        1

        2

        3

        4

        5

        6

        7

        8

        9

        10

        11

        12

    切记:这种方式,AppDelegate中的有关程序的一下状态的方法,iOS 13设备是不会走的,iOS13一下的是会收到事件回调的。13以上的设备会走SceneDelegate对应的方法

    func applicationWillResignActive(_ application: UIApplication) {

      }

      .....

      .....

      .....

    ———————————————

    相关文章

      网友评论

          本文标题:iOS 13 SceneDelegate适配

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