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实例

参考

相关推荐
忆江南16 分钟前
Flutter深度全解析
ios
山水域18 分钟前
Swift 6 严格并发检查:@Sendable 与 Actor 隔离的深度解析
ios
楚轩努力变强1 小时前
iOS 自动化环境配置指南 (Appium + WebDriverAgent)
javascript·学习·macos·ios·appium·自动化
游戏开发爱好者81 天前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
黑码哥1 天前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
2501_915106321 天前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
2501_915106321 天前
使用 Sniffmaster TCP 抓包和 Wireshark 网络分析
网络协议·tcp/ip·ios·小程序·uni-app·wireshark·iphone
熊猫钓鱼>_>1 天前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
徐同保2 天前
通过ip访问nginx的服务时,被第一个server重定向了,通过设置default_server解决这个问题
ios·iphone
2501_915918412 天前
在 iOS 环境下查看 App 详细信息与文件目录
android·ios·小程序·https·uni-app·iphone·webview