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…

@chockenberry you might find that that’s SpringBoard generating thumbnails for all your app’s states
@stroughtonsmith Yeah. The problem is that there's no consistent indicator that you're not front & center.