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

Viewed 1135

I'm finding it extraordinarily difficult to categorize and account for what events I get (or don't get) when the user swipes my app up in the app switcher on iOS 13. This seems to be because of changes caused by the multiple scene support. What are the events that I get in that situation?

2 Answers

Let's assume that your app supports window scenes. So what the user is swiping up in the app switcher is really a scene, not your app as a whole. Then the possibilities appear to be as follows.

On an iPhone

If the scene was frontmost:

  • sceneDidEnterBackground
  • applicationWillTerminate(_:)

But if the scene was not frontmost, you'll get nothing; you already received sceneDidEnterBackground, and you won't get applicationWillTerminate(_:) now because the app isn't running.

On an iPad, if the app does not support multiple windows

If the scene was frontmost:

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

But if the scene was not frontmost, you'll get nothing; you already received sceneDidEnterBackground, and you won't get applicationWillTerminate(_:) now because the app isn't running.

On an iPad, if the app does support multiple windows

If the scene was frontmost:

  • sceneDidEnterBackground
  • applicationWillTerminate(_:) (perhaps)

But if the scene was not frontmost, you'll get nothing; you already received sceneDidEnterBackground, and you won't get applicationWillTerminate(_:) now because either the app isn't running or the app isn't terminating (if there's another window). If the app is still running, you might get sceneDidDisconnect(_:) and possibly application(_:didDiscardSceneSessions:) later.


Conclusions

What's the odd-man-out here? It's the case where we're running on an iPad and we support scenes but not multiple windows. We don't get sceneDidEnterBackground! I regard that as incoherent. Since we don't support multiple windows, this is basically an iPhone app and it should behave like an iPhone app. I shouldn't have to double up my code just because my app runs on both iPhone and iPad.

in my case, I want to save user state when the app is terminated by the user or the system, applicationWillTerminate(_:) does not being called for me most of the time.

I achieved what I want by using sceneWillResignActive(_ scene: UIScene)

Related