What we're doing
During time-limited sales, our app shows a countdown Live Activity on the Lock Screen. It's started locally when the user opens the app (no push, no pushType, no push tokens), and its end is scheduled for the sale's start/end time:
let activity = try Activity<SaleAttributes>.request(attributes: attributes, contentState: .init())
await activity.end(using: .init(), dismissalPolicy: .after(saleEndDate))The sale time is the same for every user, so the Live Activity ends at the same second on every device.
What we expected
At saleEndDate, the system removes the Live Activity from the Lock Screen, and nothing else happens.
What actually happens
If the app isn't running at that moment (the user left it earlier and didn't swipe it away), the system removes the Live Activity and then launches our app in the background:
01:18:59.995 SpringBoard [BundleID: com.example.app] finished, removing from the list...
01:19:00.019 liveactivitiesd Sending request to open "com.example.app"
01:19:00.023 SpringBoard Received trusted open application request … from <… com.apple.liveactivitiesd …>
01:19:00.069 SpringBoard Bootstrapping app<com.example.app> with intent backgroundThe app receives a normal application(_:didFinishLaunchingWithOptions:) with applicationState == .background and empty launchOptions. No other app delegate callback follows. Our app can't tell this apart from any other launch, so it runs its full startup: it builds the home screen and calls our backend APIs.
Because this happens on a large number of devices in the same second, our backend gets a sharp burst of traffic exactly at sale start and sale end, from users who never opened the app.
What we've checked
App still running in the background at the end time: no new launch.
App swiped away by the user before the end time: no launch.
Live Activity removed by the user before the end time: no launch at the end time.
Steps to reproduce
Open the app; it starts a Live Activity with its end scheduled 15 minutes ahead.
Leave the app with the Home gesture (don't swipe it away) and lock the device.
Wait until the system terminates the app process.
At the scheduled end time, the Live Activity is removed and the app is launched in the background (log above).
Environment
iPhone 15, iOS 26.6 (23G71)
UIKit app, UIApplicationDelegate lifecycle (no scenes)
NSSupportsLiveActivities = YES; UIBackgroundModes = [processing, remote-notification]
Questions
Why does the system launch the app when a Live Activity reaches its scheduled end? Is this intended?
Can we avoid it? Is there a supported way to end a Live Activity at a scheduled time without the system launching the app?
If not, how should we handle it? Is there a way to know at launch that it was caused by the Live Activity ending, or what's the recommended way to avoid running the full startup (UI and network calls) for this launch?
0
0
9