WWDC 19
Architecting Your App for Multiple Windows
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:didFinishLaunchingAppDelegate:_:configurationForConnecting:options: -> UISceneConfiguration– configuration for the sceneSceneDelegate:_:willConnectTo:options:– this is where you set up your new scene
Scene configuration (UISceneConfiguration): an object that describes the delegate class, storyboard etc. It's either built dynamically, or (better) statically described in Info.plist and looked up by name using the constructor:
UISceneConfiguration(name: "Default", sessionRole: session.role)
Going to the background:
SceneDelegate:willResignActiveSceneDelegate: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, which you might not have taken into account before – 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
NSNotificationif you use them as the sending object instead of inuserInfo