I recently went on a quest for Live Activities. There’s a ton of gotchas or subtle notes that aren’t clearly mentioned. Think of the series as an unofficial rfc.


Intro

Example app - wwdc code - docs confusion points

I saw Apple’s videos and docs on ActivityKit. They do a decent job of showing you 80% of the API and how Live Activity works. The remaining 20% is an enigma though.

  • How to dismiss a live activity
  • How to properly update a live activity in a timely manner
  • How to update a live activity that wasn’t started from the app
  • How to show a live activity while the app is in foreground
  • How to properly handle observations once app is launched into the background
  • If Background Tasks aren’t immediate then why does Apple Recommend using Background Tasks for updating something categorized as live / getting updated in real time?
  • How to present a live activity once a live activity payload is sent
  • How to use tokens to start vs update a live activity.
  • Why has Apple not just re-used the existing APNs token for live activities
  • What’s the difference between Live Activity and regular Push Notification?
  • How and which parts of code should I share between Targets
  • etc.

The whole problem was a bit exacerbated because:

  1. When Apple first introduced ActivityKit, the ability to begin live activities from APNs was not added. It only came later. As a result their sessions and example app don’t use ‘push-to-start’ tokens. You have to find information about that from docs and forums. This also caused some duality in documentations and their sessions.
  2. As of Mar 24 2025 docs on How to begin a live activity from Push Notification are INCORRECT🤬🤬🤬
  3. While the EmojiRanger sample app has a lot of good stuff, it’s app UI is a bit weird. The health of the characters don’t update as time progresses. The app has a lot of focus on how to update the in-app ui or live activities from the app. But then it’s totally mute on:
    • How to update the app while the app is backgrounded. Having knowledge of how Background Tasks work is implied and required but the example project offers no code on that. Perhaps it’s the right choice, but then I had to go finding how that works elsewhere.
    • How to start / update / end a live activity from server.
  4. App Extensions, Push Notifications, Background Operations and Live Activities (and potentially more) introduce significant architectural complexity. You no longer have a single token across the app, but instead need to maintain a correlation between each activity and its token, and handle app launching into the background. All architecturally complex endeavors.
  5. Understanding how certain features (or how things get updated) of the app work require you to also have some understanding on how App Intent works. Which requires more learnings.
  6. Some of the code in the example app are not for the iOS app but are instead for for the watchOS app / target. It’s not very clear. I don’t know own an Apple Watch. Nor was able to get the app build with Xcode 16.1 into the watchOS simulator. It failed to run. Giving me this error
  7. Since it’s a new API that has lots of interactions with other things of the OS, ChatGPT or other LLMs don’t provide empirical nor correct information.

App Intent is out of scope for this series. Though that also might be reason for some of my confusions. 🤷

All these confusions led me do watch and re-watch a lot of the referenced videos.

The series assumes some understanding of the ActivityKit API, but less understanding of its life-cycle and overall architecture with regards to the app and apns.

References

Also don’t forgot to check out some less used references:

👉 Next Post - Live Activities - The missing doc