iOS13:UISceneDelegate

本文涉及的内容:

  1. iOS13中UISceneDelegate所带来的的变化;
  2. 如何配置使得在iOS13中不使用默认的UISceneDelegate

概述

iOS13上,仍然不支持 iPhone 分屏功能,其带来的是 iOS开发中 App 生命中期代理者的改变,原先生命周期函数由 AppDelegate 进行管理,现在不仅 AppDelegate 可以管理,SceneDelegate 也可以对 App 的声明周期函数进行代理,且在 Xcode10 中默认为SceneDelegate 。若两者同时存在,SceneDelegate 优先级更高。

变化

此次改变只涉及到app状态的变化,也就是app的声明周期函数,比如WillEnterForegroundWillResignActiveDidEnterBackground等。didFinishLaunchingWithOptions不属于 App 状态的变化,准确来讲,官网用的词语为transition。其变化内容为:

  • iOS13之前:在app状态发生改变时,UIKit 框架会发送通知到UIApplicationDelegate 对象上;
  • iOS13及其以后,在app状态发生改变时,UIKit 会优先发送通知到 SceneDelegate对象上;

结果就是:

  • UIApplicationDelegate对象上只剩下三个函数:
  1. 加载完成:didFinishLaunchingWithOptions
  2. 配置将要连接的场景:configurationForConnectingSceneSession
  3. 丢弃场景对象之后:didDiscardSceneSessions
  • SceneDelegate接管了所有的 app 过渡函数和场景的连接:
  1. 将要连接场景:willConnectToSession
  2. 已连接场景:sceneDidDisconnect
  3. sceneDidBecomeActive
  4. sceneWillResignActive
  5. sceneWillEnterForeground
  6. sceneDidEnterBackground

注意

  1. iOS13 之后不代表一定有分屏,也不代表 iPhone 可以使用分屏功能,当前仍然只有 iPad 可以使用分屏功能;
  2. 开启分屏需要勾选Supports multiple windows并进行配置和支持,iPad 开发在此不讨论,所以不会展开分屏功能的开发细节;

新工程的配置

Xcode10 中,默认会创建SceneDelegate并且在 info.plist 中生成对应的配置,如下:

SceneDelegate

info.plist 如下


info.plist

如果不想使用SceneDelegate也是可以的,需要:

  1. 删除 info.plist 中的Scene Configuration配置;

    info.plist

  2. AppDelegate中添加applicationWillEnterForeground等函数;

- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"applicationWillEnterForeground");

}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"applicationDidEnterBackground");

}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    NSLog(@"applicationDidBecomeActive");

}

- (void)applicationWillResignActive:(UIApplication *)application {
    NSLog(@"applicationWillResignActive");

}
  1. AppDelegate中添加UIWindow属性;
@interface AppDelegate : UIResponder 
@property (strong, nonatomic) UIWindow *window;
@end

其他

其实,UISceneDelegate使得原先的AppDelegate中的代码更加简洁,是推荐使用的。如果原本项目中已经采用自定义的AppDelegate来对业务和transition函数进行了分离,可以忽略。

你可能感兴趣的:(iOS13:UISceneDelegate)