iOS-初解SceneDelegate

Posted by Capa on 2020-11-28

前言

iOS13之后,AppDelegate的职能被拆解为:

  • AppDelegate

  • SceneDegate

引入场景(Scene)概念,应用程序现在能够拥有不止一个场景。

如果开发者不开发多场景的iPadOS/MacOS程序,仅使用AppDelegate也可以满足需求,但个人认为这是有意思的概念,所以在此介绍。

在本文中,为便于(自己)理解,笔者将采取口语化表述,如果有误欢迎指正。

相关名词解释

  • UIScene(场景)

    用户应用程序界面的对象实例

  • UISceneSession(场景会话)

    包含一个场景配置信息的对象

  • UIWindowScene

    特定类型的场景,管理一个或多个窗口(Window)

  • UIWindow(窗口)

    应用程序的界面容器,并将事件调度给视图(View)

AppDelegate相关方法

负责应用整体生命周期和设置,处理场景会话

App生命周期

application(_:didFinishLaunchingWithOptions:) -> Bool

处理场景会话

application(_:configurationForConnecting:options:) -> UISceneConfiguration

当应用需要新场景或窗口进行显示,调用此方法

返回场景的配置数据,包括场景名称和它的委托类(SceneDelegate)名称

(提供的所有场景需要事先在Info.plist里声明)

application(_:didDiscardSceneSessions:)

当应用丢弃一个或多个旧场景时,调用此方法

SceneDelegate的各种方法

控制和管理应用界面和内容(用户看到的内容),并管理应用的显示方式

连接场景

scene(_:willConnectTo:options:)

调用场景

sceneWillEnterForeground(_:)

场景即将被唤起,调用该方法

sceneDidBecomeActive(_:)

场景已经进入活跃状态并可见,开始响应用户事件,调用该方法

挂起场景

sceneWillResignActive(_:)

场景即将退出活跃状态,停止响应用户事件,调用该事件

sceneDidEnterBackground(_:)

场景已经在后台运行且不可见,调用该方法

断开场景

sceneDidDisconnect(_:)

应用程序当前不再调用这个场景,切断和它的联系,等再次使用时重新连接

方法运用实例

  • scene(_:willConnectTo:options:)设置应用程序窗口,分配根视图控制器(iOS13以前该操作在application(**_** application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: **Any**]?) -> Bool中进行)
  • sceneWillEnterForeground(_:)从硬盘或网络获取数据资源
  • sceneDidBecomeActive(_:)更新数据模型并更新UI,处理用户事件,如:切换视图控制器,启动计时器等等
  • sceneWillResignActive(_:)保存数据,挂起操作队列,销毁计时器
  • sceneDidEnterBackground(_:)隐藏私密信息,释放资源,如:图像,视频,相机权限等
  • sceneDidDisconnect(_:)执行清理操作,释放对文件或共享资源的引用并保存数据