UIScene in iOS

UIScene是iOS 13引入的,核心要解决的是,原来的基于1个Window管理App UI的策略,不能很好的适配像iPad中出现的一个App对应多个Window的场景

iOS 13之前

在iOS 13以前,App启动后执行的方法以及AppDelegate所负责的工作如下图所示

  • App Delegate一方面要负责App进程生命周期方法执行、事件回调
  • 另一方面还要处理UI的生命周期

iOS 13开始

从iOS 13开始,变化如下:

  • 关于App进程生命周期,还是App Delegate在负责,保持不变
  • 但UI生命周期的管理则是交给了Scene Delegate

这也就引出了Scene、Scene Delegate、UIWindowScene等概念。最核心的理念在于:

原来是一个App进程对应一个UI场景;现在开始,一个App进程将对应多个UI场景,其中的每一个场景都叫做Scene

既然引入了场景Scene,那场景所对应的实例(UISceneUIWindowScene)、代理(Scene Delegate)、场景管理的window等概念也就非常合理了

对于上图,还有几点需要关注:

  1. App Delegate中负责创建、切换Scene
  2. 当实现Scene Delegate中的各种UI回调后,原来App Delegate的UI回调变不再执行
  3. 由于一个App进程可能有多个Scene,所以App Delegate中也会有Scene创建、连接、断开连接、销毁等逻辑,这一点在后面的图中更能看出来

引入Scene后的App启动流程

Q&A

1. iPhone是否支持多个Scene

不支持

尽管官方文档中说iOS支持,但通过UIApplication.shared.supportsMultipleScenes结果来看,iOS应用并不支持

2. 一个Scene是只对应一个Window吗

  • 不是的,可以对应多个Window,可以通过APIUIWindowScene.windows了解到
  • 尽管如此,大部分情况下一个Scene只有1个Window

3. 如何初始化Scene

开发者不要直接创建UIWindowScene实例,而是交给系统创建,创建方式有如下几种:

  • 通过在Info.plist中scene配置中指定scene的类名
  • 或者在app delegate的 application(_:configurationForConnecting:options:)方法中,创建UISceneConfiguration时指定scene的类名
  • 也可以通过嗲用UIApplication.requestSceneSessionActivation(_:userActivity:options:errorHandler:)方法来获取/创建scene实例

参考

相关推荐
人月神话-Lee1 天前
【图像处理】图像直方图——从“频率分布“到“智能决策“
图像处理·人工智能·ios·ai编程·swift
会Tk矩阵群控的小木1 天前
imessage虚拟机群发系统搭建:基于UTM+Frida的完整实现与海外社媒集成
macos·ios·objective-c·cocoa·开源软件·个人开发·tk矩阵
灰鲸广告联盟1 天前
新老用户广告价值不同?差异化策略如何实现收益最大化
android·开发语言·flutter·ios
壹方秘境1 天前
iOS抓包新选择:ApiCatcher同时支持捕获HTTP(s)和WebSocket(s)协议数据包
websocket·ios·api
2501_915918411 天前
Python如何抓取HTTPS请求包的完整教程与代码示例
android·ios·小程序·https·uni-app·iphone·webview
linweidong1 天前
iOS 开发面试 50 个高频易混淆知识点详解
ios·设计模式·面试·cocoa·uikit·uiview·uistackview
MonkeyKing1 天前
iOS 屏幕旋转与多窗口适配原理:横竖屏控制、SizeClasses、iPad分屏终极适配
ios
MonkeyKing1 天前
iOS 事件传递与响应链全解:hitTest、pointInside 底层流程
ios
人月神话Lee1 天前
【图像处理】图像直方图——从"频率分布"到"智能决策"
ios·ai编程·图像识别
2501_916008891 天前
全面解析常用Web前端开发工具:编辑器、调试工具、性能分析器与框架
android·前端·ios·小程序·uni-app·编辑器·iphone