文章目录

  • AppDelegate
  • 说明
  • 应用
  • SceneDelegate
  • 生命周期
  • App的生命周期状态
  • IOS13以前(不包括13)
  • IOS13以后
  • 总结
  • 参考文档


AppDelegate

说明

打开你 app 的 main.m 文件,可以看到

// UIApplicationMain主要负责了:从给定的类名初始化应用程序对象、从给定的应用程序委托类,初始化一个应用程序委托、启动主事件循环,并开始接收事件
// 第三个参数 principalClassName -- UIApplication 或 UIApplication 子类,nil 默认为 UIApplication
// 第四个参数 delegateClassName -- AppDelagate 类名
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

从代码可以看出,AppDelegate 就是一个 App 的入口,有点像 vue 的 App.vue。

应用

苹果的官方文档都建议应该由AppDelegate来处理这些工作:

  1. app的启动代码;
  2. 响应app的状态,比如app切换到后台和前台等状态;
  3. 响应外部传递给app的通知,比如说push,low-memory warnings;
  4. 决定了app的状态是否应该保存或者恢复;
  5. 响应不是发送给特定view或者vc,而是发送给app本身的事件;
  6. 用来保存一些不属于特定vc的数据。

虽然官方建议将上述操作放在 AppDelegate 来处理,但是一个业务逻辑稍复杂点的项目,上述6点的所有功能的代码直接一股脑塞到一个文件里,会比较臃肿,可能会将其拆开。

SceneDelegate

在iOS 13(及以后版本)上,SceneDelegate将负责AppDelegate的某些功能。 最重要的是,window(窗口)的概念已被scene(场景)的概念所代替。 一个应用程序可以具有不止一个场景,而一个场景现在可以作为您应用程序的用户界面和内容的载体(背景)。

尤其是一个具有多场景的App的概念很有趣,因为它使您可以在iOS和iPadOS上构建多窗口应用程序。 例如,文档编辑器App中的每个文本文档都可以有自己的场景。 用户还可以创建场景的副本,同时运行一个应用程序的多个实例(类似多开)。

生命周期

App的生命周期状态

  • Not running(未运行):程序未运行
  • Inactive(未激活):程序在前台运行,但没有接收到事件。在没有事件处理情况下程序通常停留在这个状态。
  • Active ( 激活 ): 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。
  • Backgroud ( 后台 ): 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态- (Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。
  • Suspended ( 挂起 ): 程序在后台但是却不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在 内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

IOS13以前(不包括13)

func application(_:willFinishLaunchingWithOptions:)
func application(_:didFinishLaunchingWithOptions:)
// app初始化

func applicationDidBecomeActive(UIApplication)
// app已经被激活

func applicationWillResignActive(UIApplication)
// app即将被挂起

func applicationDidEnterBackground(UIApplication)
// app已经进入后台

func applicationWillEnterForeground(UIApplication)
// app即将回到前台

func applicationWillTerminate(UIApplication)
// app即将被杀死

IOS13以后

scene:(UIScene *)scene willConnectToSession
// 初始化

sceneDidBecomeActive:(UIScene *)scene
// 已经被激活

sceneWillResignActive:(UIScene *)scene
// 即将被挂起

sceneDidEnterBackground:(UIScene *)scene
// 已经进入后台

sceneWillEnterForeground:(UIScene *)scene
// 即将回到前台

sceneDidDisconnect:(UIScene *)scene
// 即将被杀死

总结

1、iOS13之前,appDelegate的职责全权处理App生命周期和UI生命周期

2、iOS13之后,appDelegate的职责是处理App生命周期和新的SceneSession生命周期。

3、所有UI生命周期交给SceneDelegate处理,appDelegate不在负责UI生命周期。