iOS13之后手动设置程序入口点

一、AppDelegate和SceneDelegate

简略地说:iOS13之前是AppDelegate管理app和UI的生命周期,在iOS13之后AppDelegate管理app的生命周期和SceneDelegate的生命周期,将UI的生命周期交给SceneDelegate管理,这也就是为什么在SceneDelegate.h中有个window。所以,在Xcode11之后创建项目,在设置setRootViewController是不能在AppDelegate里的。

ios12

 1 application:(UIApplication *)application didFinishLaunchingWithOptions
 2 // 初始化
 3 
 4 application:(UIApplication *)applicationDidBecomeActive
 5 // 已经被激活
 6 
 7 application:(UIApplication *)applicationWillResignActive
 8 // 即将被挂起
 9 
10 application:(UIApplication *)applicationDidEnterBackground
11 // 已经进入后台
12 
13 application:(UIApplication *)applicationWillEnterForeground
14 // 即将回到前台
15 
16 application:(UIApplication *)applicationWillTerminate
17 // 即将被杀死

iOS13

 1 scene:(UIScene *)scene willConnectToSession
 2 // 初始化
 3 
 4 sceneDidBecomeActive:(UIScene *)scene
 5 // 已经被激活
 6 
 7 sceneWillResignActive:(UIScene *)scene
 8 // 即将被挂起
 9 
10 sceneDidEnterBackground:(UIScene *)scene
11 // 已经进入后台
12 
13 sceneWillEnterForeground:(UIScene *)scene
14 // 即将回到前台
15 
16 sceneDidDisconnect:(UIScene *)scene
17 // 即将被杀死

 

二、没有分屏的情况继续用AppDelegate

1、直接删除SceneDelegate这个类并在info.plist文件中删除Application Scene Manifest选项。如下图:

 

2、在AppDelegate.m中注释掉下面的代码:

 

3、删除main.storyboard和程序初始信息

 

使main.storyboard为空

 

 

修改程序信息

4、在AppDelegate里设置根视图控制器

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     
 3     UIViewController *vc;
 4     if ([JZFactory isFirstEntry]) {
 5         // 第一次进入 加载引导页
 6         vc = [JZGuideCollectionViewController new];
 7     } else {
 8         // 其他情况加载广告页
 9         vc = [JZAdViewController new];
10     }
11     // 初始化UIWindow
12     self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
13     // 设置根视图控制器
14     _window.rootViewController = vc;
15     // 设置该window可见
16     [_window makeKeyAndVisible];
17     
18     return YES;
19 }

注意:要在AppDelegate.h中声明UIWindow

1 @property (strong, nonatomic) UIWindow * window;

 

三、需要使用分屏,就要使用SceneDelegate

1、如果因项目需要分屏,并且需要适配iOS13以下,就需要在AppDelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中去加判断。代码如下:(别忘了在AppDelegate添加window属性)

1 if (@available(iOS 13,*)) {
2         return YES;
3     } else {
4         self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
5         UINavigationController *rootNavgationController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
6         self.window.rootViewController = rootNavgationController;
7         [self.window makeKeyAndVisible];
8         return YES;
9     }

2、同时在SceneDelegate中写window设置代码:

1 - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
2     
3     self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
4     self.window.windowScene = (UIWindowScene*)scene;
5     UINavigationController *rootNavgationController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
6     self.window.rootViewController = rootNavgationController;
7     [self.window makeKeyAndVisible];
8 }

注意:Info.plist和main.storyboard的设置如二。

 

posted @ 2021-01-07 22:32  健泽  阅读(648)  评论(0编辑  收藏  举报