iOS13,Xcode11新建项目在模拟器上运行时,没有问题,程序跑在iOS13以下的手机时,就会出现黑屏。
原因:
Xcode 11 默认是会创建通过 UIScene
管理多个UIWindow
的应用,工程中除了 AppDelegate 外会多一个SceneDelegate
AppDelegate
和SceneDelegate
这是iPadOS带来的新的多窗口支持的结果,并且有效地将应用程序委托的工作分成两部分。
也就是说在我们用多窗口开发iPadOS中,从iOS 13开始,您的应用代表应该:
设置应用程序期间所需的任何数据。
响应任何专注于应用的事件,例如与您共享的文件。
注册外部服务,例如推送通知。
配置您的初始场景。
相比之下,在iOS 13中的新顶级对象是一个UIWindowScene
,场景代表可以处理应用程序用户界面的一个实例。因此,如果用户创建了两个显示您的应用程序的窗口,则您有两个场景,均由同一个应用程序委托支持。
这些场景旨在彼此独立工作。因此,您的应用程序不再移动到后台,而是单个场景执行 - 用户可以将一个移动到后台,同时保持另一个打开。
生命周期与Window由UIScene管理,它的出现是为了iPadOS的多进程准备的
(可以同时开启多个相同App)
,现在的逻辑是用AppDelegate管理单个或多个UIScene,一个UIScene管理单个或多个UIWinow
工程文件以及Info.plist中的一些变化:
AppDelegate中少了一些生命周期的方法: 在SceneDelegate中,window被放在了SceneDelegate.h中,而一些生命周期也出现在SceneDelegate.m中 Info.plist中: 适配方案一:如果我们不开发iPadOS多窗口APP,SceneDelegate窗口管理我们可以不需要直接删掉就好了。
1.删除掉info.plist中Application Scene Manifest选项,同时,文件SceneDelegate可删除可不删
2.相关代码注释掉
3.Appdelegate新增
window
属性适配方案二:
既要用iOS 13中新的SceneDelegate,又可以在iOS 13一下的设备中完美运行。
那就添加版本判断.
1.SceneDelegate中添加
@available(iOS 13, *)
2.AppDelegate中同样声明
window
属性3.AppDelegate中两个关于Scene的类也添加版本控制,OC/Swift中可以用扩展单独拎出来
切记:这种方式,AppDelegate中的有关程序的一下状态的方法,iOS 13设备是不会走的,iOS13一下的是会收到事件回调的。13以上的设备会走SceneDelegate对应的方法
参考学习链接:
https://www.cnblogs.com/henusyj-1314/p/11684444.html
https://blog.csdn.net/weixin_43031192/article/details/101677910
网友评论