在 iOS 13 中,当用户在应用程序切换器中向上滑动我的应用程序时,我会得到什么事件?

In iOS 13, what events do I get when the user swipes my app up in the app switcher?

当用户在 iOS 13 上的应用程序切换器中向上滑动我的应用程序时,我发现很难对我收到(或没有收到)的事件进行分类和说明。这似乎是因为多场景支持引起的变化。在这种情况下我会遇到什么事件?

假设您的应用支持 window 场景。因此,用户在应用切换器中向上滑动的实际上是一个 场景 ,而不是整个应用。那么出现的可能性如下

iPhone

如果场景在最前面:

  • sceneDidEnterBackground
  • applicationWillTerminate(_:)

但如果场景不在最前面,你将一无所获;您已经收到 sceneDidEnterBackground,现在不会收到 applicationWillTerminate(_:),因为该应用不是 运行.

在 iPad 上,如果该应用 支持多个 windows

如果场景在最前面:

  • sceneDidDisconnect(_:)
  • application(_:didDiscardSceneSessions:)
  • applicationWillTerminate(_:)

但如果场景不在最前面,你将一无所获;您已经收到 sceneDidEnterBackground,现在不会收到 applicationWillTerminate(_:),因为该应用不是 运行.

在 iPad 上,如果应用 支持多个 windows

如果场景在最前面:

  • sceneDidEnterBackground
  • applicationWillTerminate(_:)(也许)

但如果场景不在最前面,你将一无所获;您已经收到 sceneDidEnterBackground,现在不会收到 applicationWillTerminate(_:),因为该应用未 运行 或该应用未终止(如果有另一个 window) .如果该应用程序仍然是 运行,您可能会得到 sceneDidDisconnect(_:),稍后可能会得到 application(_:didDiscardSceneSessions:)


结论

这里有什么奇怪的人?这是我们 运行 在 iPad 上的情况,我们支持场景但 多个 windows。我们没有得到 sceneDidEnterBackground!我认为这是不连贯的。由于我们不支持多个 windows,这基本上是一个 iPhone 应用程序,它的行为应该像一个 iPhone 应用程序。我不应该仅仅因为我的应用程序同时在 iPhone 和 iPad.

上运行而将我的代码加倍

在我的例子中,我想在应用程序被用户或系统终止时保存用户状态,applicationWillTerminate(_:) 大多数时候我不会被调用。

我通过使用 sceneWillResignActive(_ scene: UIScene)

实现了我想要的