Kuba Suder's blog on Mac & iOS development

Architecting Your App for Multiple Windows

Categories: UIKit, WWDC 19 0 comments Watch the video

App delegate should still handle things like initializing/cleaning up the whole process

It should not however handle things like setting up the UI or updating it when the app goes into foreground/background – because this will now happen separately per session

Additionally, application delegate is now notified when a scene is created or discarded

Lifecycle delegate methods like willEnterForeground, didBecomeActive etc. will not be called at all if scene lifecycle is enabled

Modern lifecycle flow:

Starting the app:

  • AppDelegate: didFinishLaunching
  • AppDelegate: _:configurationForConnecting:options: -> UISceneConfiguration – config for scene
  • SceneDelegate: _:willConnectTo:options: – this is where you set up your new scene

Scene configuration: built dynamically or (better) statically in Info.plist, describes the delegate class, storyboard etc.

Then you return an object: UISceneConfiguration(name: “Default”, sessionRole: session.role)

Going to the background:

  • SceneDelegate: willResignActive
  • SceneDelegate: didEnterBackground
  • SceneDelegate: sceneDidDisconnect – after some time, the system will release your scene (including the delegate object and all views and VCs) to save memory; you should now release any objects loaded to build that piece of UI

When the user force-closes a scene:

  • AppDelegate: _:didDiscardSceneSessions: (may be called on the next launch instead)

“State restoration is no longer a nicety”

Watch out for cases where a view controller needs to be updated if there are multiple scenes presenting the same view – it’s better to only update the model and observe changes in the model instead of updating the view directly when the user adds some new content

  • pro tip: you can pass Swift-only objects like enums in NSNotification if you use them as the sending object instead of in userInfo

Leave a comment


This will only be used to display your Gravatar image.


What property can you use on iOS to get a unique device ID that the user can reset in Settings?