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的设置如二。