Adopting Scenes in iPadOS
- Getting Started
- Scene Components
- iPadOS and Multiple Scenes
- Creating New Windows
- Through the App Exposé Multitasking View
- Via an Explicit User Interaction
- Via Drag and Drop
- The Example App
- The Plan
- Adding Multiple Scene Support
- Update the Info.plist
- Adding a New Scene
- Create a New Scene Delegate
- Add a New Scene to the Scene Manifest
- Add UI to Display the New Scene
- Create a Constant Declaration for Scene Names
- Create an enum Declaration for User Activities
- Add UI to Create a New Window
- Update the App Delegate to Configure the New Scene
- Keeping Scenes up to Date
- Keeping Foreground Scenes up to Date
- Keeping Background Scenes up to Date
- Attaching Identifying Information to Scenes
- Updating Scenes from the Background
- Updating Your App From iOS 12
- Update Info.plist
- Add a Scene Delegate
- Update the Scene Delegate
- Where to Go From Here?
iPadOS recently debuted alongside iOS 13.1 and adopts an exciting new feature available for the first time: window support!
Window support allows users to create multiple windows of your running app. Windows can contain similar content, or a new window can contain a completely different view, such as accessory information.
In this tutorial, you’ll learn how to:
- Update your existing apps to include scene support.
- Interact with the new set of objects in the app delegate to support multiple windows.
- Create new windows and update them whether they’re in the foreground or background.
Before getting started, make sure to click the Download Materials button at the top or bottom of this tutorial.
There are some fundamental changes to the application lifecycle with iPadOS and iOS 13. Windows are now managed by a
There is a new set of objects to manage the window lifecycle:
UISceneConfiguration. Scenes manage windows, and they have their own dedicated lifecycle managed outside of the
These changes to the components also change the way you interact with
UIApplicationDelegate. A lot of the delegate callbacks used in iOS 12 have now moved to
There are several new objects that you’ll have to interact with to support multiple scenes.
UIWindowScene is a subclass of
UIScene and the most common type of scene you’ll interact with.
This object represents one instance of your app’s user interface. You shouldn’t instantiate
UIWindowScene directly; UIKit will create it for you. In most cases, you’ll interact with
UIScene through its delegate,
UIWindowSceneDelegate is a delegate protocol that extends from
UISceneDelegate and contains the core methods you’ll use to respond to
UIWindowScene lifecycle events.
You don’t instantiate this object directly. UIKit creates it for you and pairs it with each
UIWindowScene. Your Info.plist dictates how UIKit creates the scene delegate. You’ll learn how to set this up in a later section.
This object contains information that tells UIKit how to instantiate your scene. You configure a
UISceneConfiguration in code or in your Info.plist.
Apple’s preferred method is to use the Info.plist, and this tutorial will also use the plist file for scene configuration.
This object contains information about an app’s scene. It manages the lifecycle of exactly one
UIScene and contains persisted interface states. The operating system creates scene sessions. You shouldn’t instantiate them directly. The graph below shows the relationship between some of these objects.
iPadOS and Multiple Scenes
iPadOS adds several new user interactions related to scene support. Time to explore how users employ these new interactions.
Creating New Windows
A user creates new windows using several different methods:
If your app declares multiple-window support, your user can enter multitasking view by swiping up to show the dock and on your app icon in the dock while the app is already running. This shows the following view of your app’s windows, including a plus button to create a new window:
You should only create new windows in reaction to explicit user interaction, such as the user tapping a New Window button. This allows your user to control windows and window management. You create a new window programmatically using a new API on
A drag and drop session can instantiate a new scene. The use case for this interaction is dragging an object from your app to expose a new view with detail.
For example, a user drags a list item out of the list, and it instantiates a new window side-by-side with the existing list view. The new window content contains the detail view of the item.
The Example App
If you haven’t already, download the example app and open it in the begin folder. Build and run it on an iPad simulator to check it out — it’s a simple app that allows you to create notes, view them in a list and delete them. You can also view and update your profile.
The starter version of the app does not support multiple windows. You can only launch one instance of the app at a time.
This is a SwiftUI app using Core Data to persist notes and user defaults to store profile information. This allows you to work on multiple-window support without worrying about backing storage, network requests or sync issues.
Add a few notes by tapping the plus button in the navigation bar in the top-right. You’ll see the new note modal launches in a sheet over top of the existing content:
Add or update some profile information by tapping the profile button in the navigation bar on the top-left. The profile modal displays in a sheet:
The rest of this tutorial will teach you how to implement multiple windows in an iOS 13 app.
- Display multiple windows.
- Add new scene types.
- Sync data across windows, whether they are in the foreground or background.
Adding Multiple Scene Support
First, you’ll add support for multiple scenes to your app. If you created your app with Xcode 11, then Xcode set up the scene delegate and scene configuration for you. Xcode also handles the connection between app delegate and scene delegate in the default iOS 13 template.
If you are upgrading an existing app from iOS 12, follow the steps in the Updating Your App from iOS 12 section before you get started.
Update the Info.plist
First, update Info.plist to support multiple scenes:
- Open Info.plist.
- Expand the Application Scene Manifest node.
- Set the value of Enable Multiple Windows to YES.
After you have set this value, you can launch multiple windows of the same scene.
Build and run now on an iPad simulator.
Switch to landscape to give yourself more room. You can now perform the following actions with the app:
- While the app is in the foreground, slide up from the bottom bezel to launch the dock. Tap and hold the right-hand app icon. Select Show All Windows from the menu. You’ll now see the App Exposé view and can tap the plus icon on the top right to launch a new window:
- With the app in the foreground, slide up to show the dock again. This time, drag the app icon out of the dock until it becomes a hovering window. Drop the window on the right or left side of the screen. You now have a second window running in slideover mode:
- With the slideover window still running, tap and hold on the drag handle at the top of the window. Pull down and to the right until the window changes shape. Drop the window onto the side of the screen. Now you have two windows running side-by-side. You can also move the split handle in the middle to resize these windows:
That’s a lot of support for updating one value in the plist! Moving forward, adding support for additional scenes is not so simple. You have to consider where it makes sense to add support and how to keep your scenes in sync.