选择退出iOS上的UISceneDelegate/SwiftUI

选择退出iOS上的UISceneDelegate/SwiftUI,swift,xcode,swiftui,ios13,Swift,Xcode,Swiftui,Ios13,我目前正在使用Xcode 11 Beta 5。在我的应用程序中,它在iOS 12及以下版本上运行良好。但是,在iOS 13上,它看起来默认使用的是UIScene。这导致我的应用程序无法执行任何操作 当应用程序在新安装时启动时,用户必须接受一个条款和条件。同意后,他们进入加载屏幕,然后引导他们进入主视图。在我发布的屏幕截图中,前景中当前屏幕后面的视图是启动加载屏幕 我们将很快在整个应用程序中添加多视图场景支持,但现在我们有更高优先级的东西需要处理 应用程序目标的常规设置中已禁用“支持多个窗口”。

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

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

我们将很快在整个应用程序中添加多视图场景支持,但现在我们有更高优先级的东西需要处理

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

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

更新:

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


希望使用答案比评论更好地格式化内容。(请随意评论,我会编辑。)

这也是我面临的问题,这里有几个场景:

  • 如果您想在Xcode 11中的现有
    UIKit
    应用程序上工作,只需打开它,它就会正常工作。我的所有应用都有,没有
    SceneDelegate
    文件,也没有对
    AppDelegate
    或故事板进行任何更改
  • 如果您想创建一个针对iOS 13的
    UIKIT
    应用程序,只需创建它,同时确保未选中“使用SwiftUI”复选框
但我想知道你是否面临着第三种情况——一周前我做过的。创建一个新的UIKit应用程序,目标是iOS 13之前的版本。(我实际上是针对iOS 9的!)

是的,你的模板会给你15个错误(从beta 5开始),还有一个
SceneDelegate
文件/类。幸运的是,Xcode将帮助您自动更正除一个之外的所有错误

最后一个是添加一行,这是
SceneDelegate
类的一部分,但不幸的是,苹果将其排除在
AppDelegate
类之外,这在十几个
@可用(iOS 13.0,*)
子句之后意味着如果运行iOS 12,您选择退出
SceneDelegate
,猜猜怎么着?它不在ApDelegate中

将此添加到AppDelegate:

var window: UIWindow?

在这一点上,您应该有一个针对iOS 12和更早版本的运行的
UIKit
应用程序。

希望使用答案来设置比评论更好的格式。(请随意评论,我会编辑。)

这也是我面临的问题,这里有几个场景:

  • 如果您想在Xcode 11中的现有
    UIKit
    应用程序上工作,只需打开它,它就会正常工作。我的所有应用都有,没有
    SceneDelegate
    文件,也没有对
    AppDelegate
    或故事板进行任何更改
  • 如果您想创建一个针对iOS 13的
    UIKIT
    应用程序,只需创建它,同时确保未选中“使用SwiftUI”复选框
但我想知道你是否面临着第三种情况——一周前我做过的。创建一个新的UIKit应用程序,目标是iOS 13之前的版本。(我实际上是针对iOS 9的!)

是的,你的模板会给你15个错误(从beta 5开始),还有一个
SceneDelegate
文件/类。幸运的是,Xcode将帮助您自动更正除一个之外的所有错误

最后一个是添加一行,这是
SceneDelegate
类的一部分,但不幸的是,苹果将其排除在
AppDelegate
类之外,这在十几个
@可用(iOS 13.0,*)
子句之后意味着如果运行iOS 12,您选择退出
SceneDelegate
,猜猜怎么着?它不在ApDelegate中

将此添加到AppDelegate:

var window: UIWindow?

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

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

  • 从Info.plist中完全删除“应用程序场景清单”条目

  • 如果存在场景代理类,请将其删除

  • 如果应用程序代理中存在任何与场景相关的方法,请删除这些方法

  • 如果缺少,请将属性
    var window:UIWindow?
    添加到您的应用程序代理

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


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

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

  • 从Info.plist中完全删除“应用程序场景清单”条目

  • 如果存在场景代理类,请将其删除

  • 如果应用程序代理中存在任何与场景相关的方法,请删除这些方法

  • 如果缺少,请将属性
    var window:UIWindow?
    添加到您的应用程序代理

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

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

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}