Xcode 11-在iOS 13上退出UISceneDelegate / SwiftUI


106

我当前正在使用Xcode 11 Beta5。在我的应用程序中,它可以在iOS 12及更低版本上正常运行。但是,在iOS 13上,默认情况下看起来像在使用UIScene。这导致我的应用无法执行任何操作。

当应用程序以全新安装方式启动时,用户必须接受条款和条件。同意后,他们进入加载屏幕,然后将其定向到主视图。在我发布的屏幕截图中,当前当前前景背后的视图是启动加载屏幕。

我们将很快考虑在整个应用程序中添加多视图场景支持,但是现在我们需要处理更高优先级的内容。

https://imgur.com/i0qLhAL

该应用程序目标的“常规”设置中的“支持多个窗口”已被禁用。另外,我在info.plist文件中将“启用多个Windows”设置为“否”。

到目前为止,什么都没有真正起作用。基本上我想选择退出/禁用多个窗口和UIScene / SwiftUI以恢复iOS 10-12中的原始行为。这可能在iOS 13中还是我们必须对其进行更新?

更新:

这是视图调试层次结构的屏幕截图。左侧是iOS 12,右侧是iOS13。没有在Info.plist或场景代理类或方法中添加任何内容,为什么会有所不同?几乎只是在Xcode 11上的现有生产就绪代码中运行了它。

https://imgur.com/C3aLsDo


您只需要支持iOS 13和更高版本,还是需要支持iOS 13和iOS 12?
rmaddy19,19年

iOS 11-13 +(未来版本)之间的@rmaddy支持。
DavidA

您的主界面是通过代码还是情节提要?
rmaddy19年

@rmaddy在情节提要中完成与它引用的xib ViewControllers有关系。
DavidA

没有关于您的应用程序的运行时间的详细信息,这很难说。请注意,例如,viewWill|DidAppear当关闭显示的视图控制器时,在iOS 13中不会将诸如之类的视图控制器方法称为相同。添加许多生命周期调试消息和断点,并比较iOS 12和13之间的流程,看看它们之间的不同之处。
rmaddy19年

Answers:


299

当您的应用在iOS 13及更高版本下运行时,虽然应该拥抱使用场景,但在仍支持iOS 12或更早版本的情况下,您可以完全退出。

  • 从Info.plist中完全删除“ Application Scene Manifest”条目。

  • 如果有场景委托类,请将其删除。

  • 如果您的应用程序委托中有任何与场景相关的方法,请删除这些方法。

  • 如果缺少该属性,则将该属性添加var window: UIWindow?到您的应用程序委托中。

您的应用现在应仅使用应用委托,并且在iOS 13下,其生命周期应与iOS 12相同。

注意:这些都不是特定于Swift或SwiftUI的。


我们同时发布了答案。:-)一个问题- AppDelegate我解决的那条缺失的线。这会自动在您描述的过程中重新出现吗?(我完全喜欢您的回答,因为它完全忽略了场景。)
dfd

1
对我而言,这同样发生,并且我的Info.plist中没有清单条目,也没有任何AppDelegate方法,也没有SceneDelegate类。我将我的控制器设置为David的“条款和条件”,作为rootViewController,并且看起来与上面问题中的显示相同。请帮忙,因为我一直困扰于此UI故障,无法继续前进..啊!
Mohsin Khubaib Ahmed

1
@MohsinKhubaibAhmed您在问一个完全不同的问题。参见stackoverflow.com/questions/56435510/…–
rmaddy

1
嗨,您好!我按照3步说明进行操作,但启动屏幕出现后出现黑屏。选择主情节提要板以及初始视图控制器。你有什么建议吗?
user3191334

1
@ user3191334我也有黑屏。就我而言,这是黑暗模式,为我提供了默认的黑色背景。将一些内容添加到基本情节提要中,所有内容都会出现。
戈登·德芙

40

使用答案希望格式比注释更好。(随时发表评论,我会进行编辑。)

这也是我面临的事情,这里有一些场景在起作用:

  • 如果您想使用Xcode 11中的现有UIKit应用程序,只需打开它,它就可以正常工作。我所有的应用程序都没有 SceneDelegate文件,也没有对AppDelegate故事板的任何更改。
  • 如果要创建针对iOS 13UIKIT应用,只需在确保未选中“使用SwiftUI”复选框的情况下进行创建即可。

但是我想知道您是否面对第三种情况-我大约一个星期前所做的。创建一个针对iOS 13之前的版本新UIKit应用。(我实际上针对的是iOS 9!)

是的,您的模板会给您15个错误(自Beta 5起),以及一个SceneDelegate文件/类。幸运的是,Xcode将帮助您自动纠正除一个以外的所有错误。

最后一个是添加属于SceneDelegate该类的一行,但是不幸的是,Apple将该行排除在AppDelegate类之列-在十几@available(iOS 13.0, *)条子句之后,这意味着您选择退出SceneDelegate运行iOS 12,然后猜猜是什么?它存在ApDelegate

将此添加到您的AppDelegate:

var window: UIWindow?

届时,您应该有一个UIKit针对iOS 12及更早版本的运行应用程序。


谢谢你 我的情况几乎是您所说的第一点,即Xcode 11中现有的UIKit应用程序。但是当我打开它时,它不能正常工作。查看我添加的视图调试层次结构的更新。
DavidA

同样在AppDelegate中,它已经具有var窗口:UIWindow?
DavidA

你让我担心!(而且我仍然有些担心。)对于现有应用程序,我的更新很少-上周对SwiftUI感到沮丧,我很好奇仅在iOS 13的UIKit中尝试布局。但是我现有的应用程序?它们支持iPad多任务处理,但在Xcode 11中保持不变,我没有SceneDelegate,周围的测试表明(a)它们可在iOS 13中运行,并且(b)它们根本不支持多个窗口,只是在两个应用程序之间拆分视图。(我也不支持拖放操作。)您端还有其他情况吗?
dfd

重复一遍,我只是在Xcode 11中打开了Xcode 10应用程序。不SceneDelegate,不SwiftUI,不可以创建我的iOS 9+应用程序的多个实例。性能始终如一-所有这些都是CoreImage实时更新的自定义过滤器-那么,对我来说呢?如果在视图层次结构中存在与场景相关的与操作系统相关的内容,则不支持场景则无济于事。(最后,我还是有点担心。但这也是beta5。)希望您有一个可以复制我所看到的内容的良好备份。
dfd

谢谢。我怀疑它在生命周期中有问题。我将花时间调试我的应用程序。每当发现有类似情况的人时,我都会对其进行更新
DavidA,

4

好吧,我知道了。由于Apple新的默认卡片演示样式的iOS 13中的更改,在我的情节提要中,从我的初始屏幕到自定义流导航控制器的默认设置为新的演示文稿(请参见下面的屏幕截图)。

塞格

我如何解决该问题的方法是回到旧的样式,该样式默认为旧的生命周期。请参见下面的屏幕截图。

情节提要剧情

不知道为什么会这样做,因为这是我的应用程序中唯一导致此问题的地方(相当大的应用程序,因此我必须花一些时间遍历所有情节提要以确保)。


2
您的问题询问如何选择不使用场景。该答案没有提供退出场景的解决方案。这不应是公认的答案。如果您要做的就是避免出现新的卡片式演示,那么您可能会在解决该问题的重复项中找到该答案。
rmaddy19年

4

我可以使用dfd的答案来解决这个问题,但是由于我的应用程序位于Objective-C中,因此我必须进行一项更改:

在Objective-C中,您想放

@property (strong, nonatomic) UIWindow *window;

在AppDelegate.h中(不在.m中)


2

Xcode 11-Swift 5.3

从Xcode 11开始,借助Swift 5.3和更高版本@main,您可以拥有一个没有SceneDelegate或没有事件的多平台应用程序AppDelegate。只有一个简单的文件,例如:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.