本文涉及的内容:
- iOS13中
UISceneDelegate
所带来的的变化; - 如何配置使得在iOS13中不使用默认的
UISceneDelegate
;
概述
iOS13上,仍然不支持 iPhone 分屏功能,其带来的是 iOS开发中 App 生命中期代理者的改变,原先生命周期函数由 AppDelegate
进行管理,现在不仅 AppDelegate 可以管理,SceneDelegate
也可以对 App 的声明周期函数进行代理,且在 Xcode10 中默认为SceneDelegate
。若两者同时存在,SceneDelegate
优先级更高。
变化
此次改变只涉及到app状态的变化,也就是app的声明周期函数,比如WillEnterForeground
、WillResignActive
、DidEnterBackground
等。didFinishLaunchingWithOptions
不属于 App 状态的变化,准确来讲,官网用的词语为transition
。其变化内容为:
- iOS13之前:在app状态发生改变时,UIKit 框架会发送通知到
UIApplicationDelegate
对象上; - iOS13及其以后,在app状态发生改变时,UIKit 会优先发送通知到
SceneDelegate
对象上;
结果就是:
-
UIApplicationDelegate
对象上只剩下三个函数:
- 加载完成:didFinishLaunchingWithOptions
- 配置将要连接的场景:configurationForConnectingSceneSession
- 丢弃场景对象之后:didDiscardSceneSessions
-
SceneDelegate
接管了所有的 app 过渡函数和场景的连接:
- 将要连接场景:willConnectToSession
- 已连接场景:sceneDidDisconnect
- sceneDidBecomeActive
- sceneWillResignActive
- sceneWillEnterForeground
- sceneDidEnterBackground
注意
- iOS13 之后不代表一定有分屏,也不代表 iPhone 可以使用分屏功能,当前仍然只有 iPad 可以使用分屏功能;
- 开启分屏需要勾选
Supports multiple windows
并进行配置和支持,iPad 开发在此不讨论,所以不会展开分屏功能的开发细节;
新工程的配置
Xcode10 中,默认会创建SceneDelegate
并且在 info.plist 中生成对应的配置,如下:
info.plist 如下
info.plist
如果不想使用SceneDelegate
也是可以的,需要:
-
删除 info.plist 中的
info.plistScene Configuration
配置;
-
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");
}
-
AppDelegate
中添加UIWindow
属性;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
其他
其实,UISceneDelegate
使得原先的AppDelegate
中的代码更加简洁,是推荐使用的。如果原本项目中已经采用自定义的AppDelegate
来对业务和transition
函数进行了分离,可以忽略。
网友评论