AppDelegate 详解
在 iOS 开发中,AppDelegate
(应用程序委托)是一个特殊的类,负责管理应用程序的生命周期、处理系统事件以及协调应用的主要行为。它是应用程序与系统之间的重要桥梁,遵循委托模式(Delegate Pattern),通过实现特定协议方法响应系统通知。
一、AppDelegate 的核心作用
AppDelegate
主要承担以下职责:
- 管理应用程序的生命周期(从启动到退出的全过程)
- 处理系统级事件(如内存警告、推送通知、深链接等)
- 配置应用初始化选项(如根视图控制器、服务注册等)
- 协调应用与系统的交互(如后台任务、状态保存与恢复)
二、默认实现与文件结构
AppDelegate
通常由两个文件组成:
AppDelegate.h
:声明遵循的协议和公共方法AppDelegate.m
:实现协议方法和核心逻辑
默认代码结构(Objective-C):
objc
// AppDelegate.h
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
objc
// AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 应用启动完成时调用
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
self.window.rootViewController = [[UIViewController alloc] init];
[self.window makeKeyAndVisible];
return YES;
}
// 其他生命周期方法...
@end
Swift 版本(AppDelegate.swift
):
swift
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 应用启动完成时调用
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = UIViewController()
window?.makeKeyAndVisible()
return true
}
// 其他生命周期方法...
}
三、应用程序生命周期方法
AppDelegate
中最核心的是生命周期方法,这些方法按固定顺序被系统调用,反映应用从启动到退出的状态变化。
1. 启动阶段
objc
// 应用完成启动时调用(只调用一次)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 初始化操作:设置根视图控制器、注册服务、读取配置等
// launchOptions 包含启动参数(如通过推送通知启动)
return YES; // 返回 YES 表示启动成功
}
关键用途:
- 初始化
UIWindow
并设置根视图控制器 - 注册推送通知、第三方 SDK(如统计、支付)
- 处理冷启动参数(如从 URL Scheme 启动)
2. 进入前台阶段
objc
// 应用即将从后台进入前台时调用
- (void)applicationWillEnterForeground:(UIApplication *)application {
// 恢复 UI 状态、刷新数据、重新开启定时器等
}
// 应用已进入前台并处于活动状态时调用
- (void)applicationDidBecomeActive:(UIApplication *)application {
// 恢复用户交互、重新连接网络、暂停后台任务等
// 注意:从后台返回前台会触发,首次启动也会触发
}
3. 进入后台阶段
objc
// 应用即将进入后台时调用
- (void)applicationWillResignActive:(UIApplication *)application {
// 保存临时数据、暂停动画/定时器、释放共享资源等
// 如游戏暂停、视频暂停
}
// 应用已进入后台时调用
- (void)applicationDidEnterBackground:(UIApplication *)application {
// 执行后台任务(如下载、数据同步)
// 保存持久化数据、释放内存
// 最多有 30 秒执行时间,超过会被系统终止
}
4. 终止阶段
objc
// 应用即将终止时调用(正常退出或被系统杀死)
- (void)applicationWillTerminate:(UIApplication *)application {
// 最后一次保存数据的机会
// 释放所有资源
}
生命周期流程图:
markdown
启动 → didFinishLaunchingWithOptions → didBecomeActive(前台活动)
↓
前台退到后台 → willResignActive → didEnterBackground(后台运行)
↓
后台回到前台 → willEnterForeground → didBecomeActive(前台活动)
↓
退出应用 → willTerminate
四、系统事件处理方法
AppDelegate
还负责处理多种系统级事件:
1. 内存警告
objc
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
// 收到内存警告时释放不必要的资源
// 如清除缓存、释放大图、取消网络请求等
}
2. 推送通知处理
objc
// 收到远程推送通知时(iOS 10 以前)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// 处理推送内容
}
// 远程推送授权成功后获取 deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 将 deviceToken 上传到服务器
}
3. 打开 URL(深链接)
objc
// 处理通过 URL Scheme 或 Universal Link 打开应用的请求
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// 解析 URL 并执行对应操作(如跳转到指定页面)
return YES; // 表示已处理
}
4. 后台任务处理
objc
- (void)applicationDidEnterBackground:(UIApplication *)application {
// 请求额外的后台执行时间
UIBackgroundTaskIdentifier taskId = [application beginBackgroundTaskWithExpirationHandler:^{
// 时间到后执行的清理操作
[application endBackgroundTask:taskId];
}];
// 执行后台任务(如下载)
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 任务完成后结束后台任务
[application endBackgroundTask:taskId];
});
}
五、与 SceneDelegate 的关系(iOS 13+)
在 iOS 13 及以上版本中,苹果引入了 SceneDelegate
,用于管理应用的"场景"(多窗口支持),分担了 AppDelegate
的部分职责:
功能 | AppDelegate(iOS 13+) | SceneDelegate(iOS 13+) |
---|---|---|
生命周期管理 | 应用级生命周期(如启动、终止) | 场景级生命周期(如窗口显示、隐藏) |
UI 管理 | 不再负责 | 管理窗口和根视图控制器 |
系统事件 | 全局事件(如内存警告、推送) | 场景相关事件(如深链接) |
兼容处理:
- 若需支持 iOS 12 及以下,仍需在
AppDelegate
中管理 UI - iOS 13+ 可通过
UIScene
相关 API 适配多窗口
六、最佳实践
- 职责单一 :
AppDelegate
只处理系统事件和生命周期,避免写入业务逻辑 - 代码拆分:将复杂逻辑(如推送处理、后台任务)拆分到专门的工具类
- 延迟初始化:启动时只初始化必要组件,非关键操作延迟到应用进入前台后执行
- 状态保存 :在
applicationWillResignActive
中保存临时状态,确保应用恢复时体验一致 - 内存管理:在内存警告和进入后台时主动释放资源,避免应用被系统杀死
总结
AppDelegate
是 iOS 应用的"大管家",负责协调应用与系统的交互,管理整个应用的生命周期。理解其核心方法和职责,能帮助开发者更好地控制应用行为,处理各种系统事件,优化应用的启动性能和用户体验。在 iOS 13+ 环境下,需注意与 SceneDelegate
的分工协作,以适配多窗口等新特性。