application(_:didFinishLaunchingWithOptions:) not called on MDM iPads after overnight idle — app resumes without cold start

We are seeing a strange lifecycle issue on multiple MDM-managed iPads where application(_:didFinishLaunchingWithOptions:) is not called after the device is idle overnight.

Even if we terminate the app manually via the app switcher, the next morning the system does not perform a cold launch. Instead, the app resumes directly in:

applicationDidBecomeActive(_:)

This causes all initialization logic that depends on didFinishLaunching to be completely skipped.

This behavior is consistent across four different supervised MDM devices.

Environment

Devices: iPads enrolled in MDM (supervised)

iOS version: 18.3

Xcode: 16.4

macOS: Sequoia 15.7.2

App type: Standard UIKit iOS app

App: Salux Audiometer (App Store app)

Expected Behavior

If the app was terminated manually using the app switcher, the next launch should:

Start a new process

Trigger application(_:didFinishLaunchingWithOptions:)

Follow the normal cold-start lifecycle

Actual Behavior

After leaving the iPad idle overnight (8–12 hours):

The next launch skips didFinishLaunching

The app resumes directly in applicationDidBecomeActive

No new process is started

App behaves as if it had been suspended, even though it was manually terminated

Logs (Relevant Extracts) Day 1 — Normal cold launch [12:06:44.152 PM] PROCESS_STARTED [12:06:44.214 PM] DID_FINISH_LAUNCHING_START launchOptions=[] [12:06:44.448 PM] DID_FINISH_LAUNCHING_END

We then used the app and terminated it via app switcher.

Day 2 — Unexpected resume without cold start [12:57:49.328 PM] APP_DID_BECOME_ACTIVE

No PROCESS_STARTED No didFinishLaunching No cold-start logs

This means the OS resumed the app from a previous state that should not exist.

Reproducible Steps

Use an MDM-enrolled iPad.

Launch the app normally.

Terminate it manually via the multitasking app switcher.

Leave the device idle overnight (8–12 hours).

Launch the app the next morning.

Observe that:

didFinishLaunching does not fire

applicationDidBecomeActive fires directly

Questions for Apple Engineers / Community

Is this expected behavior on MDM-supervised devices in iOS 18?

Are there any known OS-level changes where terminated apps may be revived from disk/memory?

Could MDM restrictions or background restoration policies override app termination?

How can we ensure that our app always performs a clean initialization when launched after a long idle period?

Additional Information

We have full logs from four separate MDM iPads showing identical behavior. Happy to share a minimal reproducible sample if required.

We are seeing a strange lifecycle issue on multiple MDM-managed iPads where application(_:didFinishLaunchingWithOptions:) is not called after the device is idle overnight.

Even if we terminate the app manually via the app switcher, the next morning the system does not perform a cold launch. Instead, the app resumes directly in:

So, my first question here is how sure you are about EXACTLY what's happening. In particular, how do you KNOW didFinishLaunchingWithOptions is not being called?

In particular, how does your logging infrastructure work and how far "back" in time would it track? My concern here is that what's missing here isn't that didFinishLaunchingWithOptions isn't being called, but that the app was actually initialized at some much earlier point in time when the system launched your app into the background and then suspended it, potentially hours earlier than the point you actually opened it.

We have full logs from four separate MDM iPads showing identical behavior. Happy to share a minimal reproducible sample if required.

Do you have sysdiagnose(s) or just your own app logs? If you have a sysdiagnose, the please file a bug and post the bug number back here. In the bug report please make sure you mention exactly which app launch you consider problematic.

__
Kevin Elliott
DTS Engineer, CoreOS/Hardware

application(_:didFinishLaunchingWithOptions:) not called on MDM iPads after overnight idle — app resumes without cold start
 
 
Q