随着iOS 26的发布,苹果对应用生命周期管理提出更高要求。本文将深入解析适配要点,手把手带你完成从传统AppDelegate到UIScene生命周期的平滑迁移!
一、强制迁移条件检查
不满足以下两个条件都要升级:
1、 Info.plist 查看是否包含UIApplicationSceneManifest key
<dict>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
</dict>
2、app delegate中是否实现以下函数
funcapplication(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
returnUISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
二、生命周期类相关介绍
生命周期函数介绍:
AppDelegate 负责处理应用层面的生命周期(如应用启动、场景会话管理)
SceneDelegate 负责处理 UI 场景层面的生命周期(如窗口显示、前后台切换)
1. AppDelegate.swift
核心职责: 处理应用启动、全局配置以及 SceneSession 的管理。
application(_:didFinishLaunchingWithOptions:)
作用 :应用程序启动的入口点。通常用于进行一次性的全局配置(如初始化 SDK、配置全局外观、注册推送通知等)。
调用场景 :App 进程启动并加载完成后立即调用。
application(_:configurationForConnecting:options:)
- 作用 :当应用需要创建一个新的 UI 场景(Scene)时,系统会询问 AppDelegate 需要使用什么配置(例如加载哪个 Storyboard 或使用哪个类作为代理)。
- 调用场景 :App 首次启动显示 UI 时,或者在 iPadOS 上用户创建新窗口时。
application(_:didDiscardSceneSessions:)
- 作用 :通知代理用户已丢弃(关闭)了一个或多个场景会话。用于清理与这些场景相关的数据或资源。
- 调用场景 :用户在多任务切换器中上滑关闭了某个窗口(Scene),或者系统为了释放内存销毁了场景会话。
2. SceneDelegate.swift
核心职责: 管理单个 UI 窗口(Scene)的生命周期。
scene(_:willConnectTo:options:)
作用 :场景(UIWindowScene)即将连接到应用。这是设置 UI 窗口(UIWindow)和根视图控制器(RootViewController)的地方。
调用场景 :App 启动或新窗口创建时。在此方法中, window 属性通常会被初始化并与 scene 关联。
sceneDidBecomeActive(_:)
作用 :场景已从非活动状态移动到活动状态。此时 UI 是可见的且可以响应用户交互。用于恢复暂停的任务(如游戏计时器)。
调用场景 :App 启动完成进入前台,或用户从后台/多任务界面切回 App。
sceneWillResignActive(_:)
作用 :场景即将从活动状态变为非活动状态。此时 UI 仍可见但不再响应交互。用于暂停游戏、保存临时数据。
调用场景 :来电、下拉通知中心、上滑进入多任务切换器时。
sceneWillEnterForeground(_:)
作用 :场景即将从后台进入前台。用于撤销进入后台时所做的更改(如重新加载网络数据)。
调用场景 :App 从后台被重新打开,在 sceneDidBecomeActive 之前调用。
sceneDidEnterBackground(_:)
作用 :场景已进入后台。此时 UI 不可见。 这是保存数据、释放共享资源的关键时机 。
调用场景 :用户按下 Home 键或上滑回到桌面。
sceneDidDisconnect(_:)
作用 :场景与应用断开连接。系统可能会为了释放资源而释放场景。
调用场景 :应用进入后台一段时间后被系统回收 Scene,或者用户主动关闭该窗口。 注意: 这并不意味着 App 进程被杀掉,只是该 UI 场景被释放。
补充:如果窗口的根视图控制器是通过编程方式加载的,需要在下面的函数中添加根控制器的代码
classSceneDelegate: UIResponder, UIWindowSceneDelegate{
var window: UIWindow?
funcscene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guardlet windowScene = scene as? UIWindowSceneelse { return }
// 手动设置根控制器
window = UIWindow(windowScene: windowScene)
window?.rootViewController = YourRootViewController()
window?.makeKeyAndVisible()
}
}
// 新创建项目的默认代码
funcscene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guardlet_ = (scene as? UIWindowScene) else { return }
}
3. 关键方法映射
UIApplicationDelegate和UISceneDelegate对应代理方法映射表如下:
| | | |
|---|
| applicationDidBecomeActive(_:) | | | App 启动完成进入前台,或用户从后台/多任务界面切回 App |
| applicationWillResignActive(_:) | sceneWillResignActive(_:) | | |
| applicationDidEnterBackground(_:) | sceneDidEnterBackground(_:) | | |
| applicationWillEnterForeground(_:) | sceneWillEnterForeground(_:) | | App 从后台被重新打开,在 sceneDidBecomeActive 之前调用 |
以上便是iOS 26生命周期迁移全解析过程了。
如果觉得这篇文章对你有帮助,请 推荐+点赞+评论+关注+分享 本篇文章。