Pro Tip iPad Windows Special Edition™

If you use SceneDelegate to know when your app is active/inactive or foreground/background, you're going to need to look at that code on iPadOS 26: the delegate messages aren't called like on iPhone.

(Tip: set sound breakpoints in SceneDelegate and run your app to understand where they happen.)

You'll want to use a view's traitCollection to monitor activeAppearance, and do any syncing/backup when .inactive is detected. It acts like a Mac now.

Pro Tip iPad Windows Special Edition™ (Part II)

And, unfortunately, the view's traitCollection is not updated on iOS/iPadOS 18.

So now you're going to have two code paths for tracking your app's overall state.

Fun.

But we got what we wanted: Windows!

Pro Tip iPad Windows Special Edition™ (Part III)

This is going to catch a lot of folks off guard. Things like widgets not updating because you update a shared container when the app goes into the background are going to be super hard to track down.

If you look at the behavior of Stage Manager on iPadOS 18, it was trying to insulate apps from this behavior with the "task collections": you got delegate callbacks when those changed.

That no longer happens. Beware.

Pro Tip iPad Windows Special Edition™ (Part IV)

The "am I active or not?" question is not easy to answer in a way that works well on both iPhone and iPad.

The reason is that the iPad, with windows, reports activeAppearance predictably as windows become frontmost or not.

The iPhone, however, reports .inactive, then .active as you put the app in the background. When you return to the foreground, .active, then .inactive, then .active is reported.

So you save state returning to foreground…

Dupe this:

FB18443571: It's impossible to know when to save view state across platforms.

• SceneDelegate doesn't report activation/deactivation of windows on iPad.
• UITraitCollection activeAppearance changes are erratic on iPhone.

This is a huge problem: every app needs to save view state, sync changes, and perform other background operations when a user switches to another app or the home screen. There isn't a reliable way to know that this has happened in iOS 26.

@chockenberry to confirm, you’re saying sceneWillResignActive doesn’t work anymore in iPadOS 26? or it behaves differently now?
@Joekw It’s not called when the window becomes inactive.
@chockenberry @Joekw I replied in a thread here, but I think there’s a misconception. A scene not being frontmost does not mean it is UIScene.ActivationState.foregroundInactive. That scene lifecycle state means something specific and it usually does not apply here (unless another scene is almost entirely occluding it).
@chockenberry @Joekw Also, I think I screwed up the threading on the reply. It may be easier to look at the posts on my profile and look at them chronologically. Sorry!
@chockenberry Thank you for the feedback and apologies for the late reply! I think there’s a conceptual misunderstanding here as well as what seems to be a bug that may be resolved. More on each in the thread below.

@chockenberry 1) Activation state vs active appearance

The documentation and descriptions for UIScene.ActivationState.foregroundInactive and UIApplication.State.inactive are a bit opaque. Both say something like this:

> The app is running in the foreground but isn’t receiving events.

This can mean a lot of things:
- Control Center or Notification Center was presented over the app
- The app is foreground but the user has activated the App Switcher
- And more…

@chockenberry The point is that there’s usually some sort of system occlusion or reason why events would no longer go to your application.

From your blog post:
https://furbo.org/2025/06/28/ipados-windows/

> That’s because apps stay active even when their windows do not.

And the mastodon thread:
https://mastodon.social/@chockenberry/114761717903621566

> It’s not called when the window becomes inactive.

These statements are not correct from our perspective.

iPadOS Windows • furbo.org

The first thing I installed after the WWDC25 Keynote was the beta for iPadOS. There was only one reason: it had the windows we have all wanted for so long. And generally, windows on iPad work exactly how we want them to. But there’s a problem, and I suspect that the root cause is that […]

Furbo.org by Craig Hockenberry

@chockenberry There is a difference between the scene visually being inactive as a user affordance and the actual lifecycle state of the UIScene instance.

From the perspective of the UIScene instance that’s on screen with another scene, both are (likely) UIScene.ActivationState.foregroundInactive. Tapping another scene so that the current one is no longer frontmost is _not_ the same as UIScene.ActivationState.foregroundInactive.

@chockenberry Because in many of those cases, you can still interact with the no-longer frontmost scene through scrolling with a pointing device or your finger.
@chockenberry Note that there is a difference here if you take one of these scenes and resize it to almost entirely occlude the other. Now the occluded scene will be UIScene.ActivationState.foregroundInactive because you are generally unable to interact with it.
@chockenberry So the misconception here is a conflation of the visual appearance of the scene (and its frontmost status) with its actual lifecycle state. The lifecycle state is determined by UIScene.ActivationState. Its “appearance” is based on the UITraitCollection’s UIUserInterfaceActiveAppearance. A scene not being frontmost does not mean it is UIScene.ActivationState.foregroundInactive.
@chockenberry As to the specific question, we would recommend you save state when the UIScene.ActivationState changes to either UIScene.ActivationState.foregroundInactive or UIScene.ActivationState.background. If you do need to know when a scene is no longer front-most, UITraitCollection’s UIUserInterfaceActiveAppearance is the thing to use. That’s why we enabled it on iOS and iPad this year.

@chockenberry 2) Active appearance on the phone

From what we can tell this is no longer reproducing on recent builds for iOS 26 or iPadOS 26. We took phone and pad apps on both systems and observed the change of UIUserInterfaceActiveAppearance when the scene was backgrounded to return to the Home Screen. We did not observe erratic behavior, but instead saw predicable changes from UIUserInterfaceActiveAppearance.active to UIUserInterfaceActiveAppearance.inactive.

@chockenberry If that’s not what you are seeing in recent Betas, please do give us more information so we can dig into that as that’s a bug.

Hope this helps!

@chockenberry you might find that that’s SpringBoard generating thumbnails for all your app’s states
@stroughtonsmith @chockenberry Isn’t that kind of how Palm’s webOS worked (generating a thumbnail image of the current state constantly)?
@stroughtonsmith Yeah. The problem is that there's no consistent indicator that you're not front & center.

@stroughtonsmith Just added this to the FB 😀

It's likely that the erratic behavior on the iPhone is caused by SpringBoard generating previews of the various application states.

Trying to outsmart SpringBoard is not something any developer should do.

@chockenberry NGL, I'm real curious now what you're trying to drive with this API. It's meant to be for changing your tint colors on things
@stroughtonsmith It's the only way to know that a window has resigned the active state. Since there isn't an application-level state change (as there is on macOS), it's the only way to trigger some state maintenance (in my case, it's a local backup of iCloud data).