为什么没有可靠地调用 UIApplicationDelegate 方法`application(_:configurationForConnecting:options:)`

Why is UIApplicationDelegate method `application(_:configurationForConnecting:options:)` not called reliably

问题:

我发现有关 AppDelegate 方法的一些意外行为 application(_:configurationForConnecting:options:)

文档指出:

UIKit calls this method shortly before creating a new scene.

我希望每次启动应用程序时都是这种情况。
当我第一次启动我的应用程序时确实调用了该方法,但是对于所有后续启动,它不是

转载:

我有一个非常简单的测试用例可以重现:

问题:

为什么 application(_:configurationForConnecting:options:) 没有在第二次启动时被调用?
(这是预期的行为吗,如果是,为什么/这是 Apple 的错误)

这似乎是预期的行为,一旦您理解了正在发生的事情就很有意义,但没有记录在案。我刚刚花了一些相当痛苦的时间来深入了解它。哦,苹果。

要知道的关键是,当您重新启动应用程序时,之前 运行 中的 windows 会恢复。

(还有助于记住一个应用程序可以有多种类型的 window – 每种都由一个场景配置表示 – 这就是您可能首先实现此委托方法的原因。)

案例 1:应用首次启动

应用程序不知道要在 window 中放入什么类型的场景,并调用 application(_:configurationForConnecting:options:) 来查找。到目前为止,一切都如我们所料。 (如果您不实现此委托方法,它只会回退到您的 Info.plist 场景清单中的第一个合适的条目,如果它有的话。)

案例 2:新建 window(适用于支持多个 windows 的应用)

(例如,通过拖动 iPad 上的停靠图标)。该应用程序也不知道要在此 window 中放入什么。同案例一

案例 3:应用重新启动

OS 想要恢复你的 windows。为此,它记住了您上次打开的 windows 的场景配置。惊喜! 它知道要在 windows 中放入什么场景,并且不会询问您的应用委托。 它只是继续创建使用记忆配置的场景。

对于考虑在应用程序启动时创建 window 的可怜的开发人员来说,这是令人困惑的。但是,如果您认为 windows 在启动时被恢复,而不是被创建 - 即使只有一个 - 它开始有意义。


现在,如果您想重置一些东西以便忘记您的 windows 并在下次启动时调用您的委托方法:

  • 对于 iOS,删除应用程序
  • 对于 Catalyst,删除应用的容器

注意 1: 在 Catalyst 中,似乎只有第一个 window 在重新启动时恢复,但其他行为与上面相同. 现在观察到这不是真的。可能不一致。

注2:您还可以恢复您的windows'内容,而不仅仅是他们的类型,使用 UIWindowSceneDelegateUISceneSession.stateRestorationActivity,但那是另一回事了。