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

参考

相关推荐
2501_915918412 小时前
TCP 抓包分析在复杂网络问题中的作用,从连接和数据流层面理解系统异常行为
网络·网络协议·tcp/ip·ios·小程序·uni-app·iphone
二流小码农3 小时前
鸿蒙开发:个人开发者如何使用华为账号登录
android·ios·harmonyos
wvy7 小时前
Xcode 26还没有适配SceneDelegate的app建议尽早适配
ios
游戏开发爱好者87 小时前
苹果 App 上架流程,结合 Xcode、CI 等常见工具
macos·ios·ci/cd·小程序·uni-app·iphone·xcode
前端老白8 小时前
webview在微信小程序中,安卓加载失败,IOS正常加载
android·ios·微信小程序·webview
2501_915106328 小时前
用 HBuilder 上架 iOS 应用时如何管理Bundle ID、证书与描述文件
android·ios·小程序·https·uni-app·iphone·webview
2501_915909068 小时前
资源文件混淆在 iOS 应用安全中的实际价值
android·安全·ios·小程序·uni-app·iphone·webview
2501_915918418 小时前
iOS App 性能测试中常被忽略的运行期问题
android·ios·小程序·https·uni-app·iphone·webview
Name_NaN_None8 小时前
iPhone怎么投屏到电脑上?
ios·电脑·iphone
sweet丶20 小时前
UIWindowScene 使用指南:掌握 iOS 多窗口架构
ios