158

我目前正在使用 Xcode 11 Beta 5。在我的应用程序中,它在 iOS 12 及更低版本上运行良好。但是,在 iOS 13 上,它看起来UIScene默认使用的是 。这导致我的应用程序不执行任何操作。

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

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

“支持多个窗口”已在应用程序目标的常规设置中禁用。我还在 info.plist 文件中将 Enable Multiple Windows 设置为 NO。

到目前为止,还没有真正奏效。基本上我想选择退出/禁用多个窗口和 UIScene/SwiftUI 以恢复 iOS 10-12 中的原始行为。这在 iOS 13 中是否可行,或者我们必须更新它?

更新:

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

4

6 回答 6

405

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

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

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

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

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

您的应用现在应该只使用应用委托,并且在 iOS 13 下它应该具有与 iOS 12 相同的生命周期。

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

于 2019-08-12T19:34:45.207 回答
46

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

  • 如果您想在 Xcode 11 中处理现有UIKit应用程序,只需打开它,它应该可以正常工作。我所有的应用程序都有,没有 SceneDelegate文件,也没有任何更改AppDelegate或故事板。
  • 如果您想创建一个针对 iOS 13的UIKIT应用程序,只需创建它,同时确保未选中“使用 SwiftUI”复选框。

但我想知道您是否面临第三种情况——我大约一周前所做的。创建一个新的 `UIKit 应用程序,目标是早于 iOS 13。(我实际上是针对 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 及更早版本的正在运行的应用程序。

于 2019-08-12T19:34:23.170 回答
13

我使用 dfd 的答案让这个工作,但因为我的应用程序是在 Objective-C 中,我不得不做一个改变:

在 Objective-C 中,你想把

@property (strong, nonatomic) UIWindow *window;

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

于 2020-03-28T22:30:36.427 回答
4

好的,所以我想通了。由于 iOS 13 中 Apple 的新默认卡片演示样式发生了变化,在我的故事板中,从我的初始屏幕到我的自定义流导航控制器默认为新演示(见下面的屏幕截图)。

转场

我如何解决这个问题是回到默认为旧生命周期的旧样式。请参阅下面的屏幕截图。

故事板序列类型

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

于 2019-08-15T15:31:17.330 回答
3

Xcode 12 - 斯威夫特 5.3 - iOS 14

从 Xcode 12 开始,在 Swift 5.3 和 的帮助下@main,您可以拥有一个没有SceneDelegate或事件的多平台应用程序AppDelegate。只有一个简单的文件,如:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
于 2020-07-09T11:30:54.263 回答
0

当您希望退出它时,有时阻止它找到您的 sceneDelegate 文件的问题在于 info.plist 文件。

如果你在info.plist.

Scene Configuration
    Application Session Role
        Item 0 (Default Configuration)
            Delegate Class Name : SceneDelegate
            Storyboard Name : Main

它应该是。

Scene Configuration
    Application Session Role
        Item 0 (Default Configuration)
            Delegate Class Name : $(PRODUCT_MODULE_NAME).SceneDelegate
            Storyboard Name : Main
于 2021-06-22T21:44:06.940 回答