Android has a similar feature called Android Live Notifications.
Requirements
- Follow the iOS SDK setup if using native iOS (Swift/Objective-C).
- If using a wrapper SDK (React Native, Flutter, Unity, etc.) follow Mobile SDK setup and then Cross-platform Live Activity SDK Setup.
- OneSignal iOS SDK version 5.2.0+ for push-to-start support (see release notes).
- OneSignal iOS SDK version 5.2.15+ for click tracking and Confirmed Delivery.
- iOS 16.1+ and iPadOS 17+.
- A .p8 APNs key. Apple does not support p12 certificates with Live Activities.
- Xcode 14 or higher.
Setup
These steps walk you through setting up Live Activities quickly. For more details and design customizations, see Apple’s Live Activities Developer docs.1. Add a Widget Extension
In Xcode, go to File > New > Target… > Widget Extension.
OneSignalWidget) and ensure Include Live Activity is selected. Then click Finish.


2. Update Info.plist
In your main target’s Info.plist, add the key Supports Live Activities as Boolean, and set it to YES.

Info.plist
When updating Live Activities, you can set a
priority that Apple uses to determine urgency. Apple throttles requests that use high priority (10) too frequently.If your use case requires more frequent high-priority updates, add the key NSSupportsLiveActivitiesFrequentUpdates to your Info.plist as a Boolean set to YES. See Apple’s Developer Docs for details. When the push budget is exceeded, iOS prompts the user to allow additional updates.3. Add SDK
- Package Manager
- Cocoapods
In your Widget Extension target, add the 
OneSignalFramework under General > Frameworks, Libraries and Embedded Content:
4. Define widget attributes and UI
Open theyour-nameLiveActivity.swift file (example: OneSignalWidgetLiveActivity.swift) to define the properties of the struct and to make changes to the widget UI.
your-nameAttributesdescribes the static content of your Live Activity.ContentStatedescribes the dynamic content of your Live Activity.
OneSignalWidgetLiveActivity.swift file.
your-nameLiveActivity.swift
5. Allow main target membership
Add your main app target to the Target Membership list in theyour-nameLiveActivity.swift file.
In Xcode, open the Inspector panel on the right side of the screen. Within Target Membership, click the + button and select your main app target containing the ContentView and your OneSignal initialization code.

6. Add the setup method to your AppDelegate
CallOneSignal.LiveActivities.setup in your AppDelegate, after OneSignal SDK initialization.
Replace OneSignalWidgetAttributes with the name of your Live Activity attributes struct.
AppDelegate
Starting a Live Activity
There are 2 options to start a Live Activity on a device:- Push-to-start
- Trigger-in-app
Send a Push To Start API request. Be sure all names and IDs match your widget’s configuration exactly (parameters are case-sensitive). If anything is missing or incorrectly added, you may encounter issues when trying to launch the widget.Here is an example request that will work for the example above.Replace:
-
YOUR_APP_IDwith your OneSignal App ID. -
YOUR_APP_API_KEYwith your OneSignal API key. -
OneSignalWidgetAttributeswith the name of your Widget Attributes struct.

You successfully started a Live Activity with push-to-start!Users will need to select “Allow” to continue getting updates.
Tracking Live Activity clicks
Track when users tap on your Live Activities and Dynamic Islands by implementing OneSignal’s click tracking. This enables you to measure engagement and optionally deep link users to specific content in your app.Step 1: Add Click Tracking to Your Widget
Add the.onesignalWidgetURL() modifier to any UI component in your Live Activity widget that you want to track clicks on:
- You can pass a URL for deep linking or
nilif you only want click tracking without navigation - The view hierarchy cannot include Apple’s
.widgetURL()modifier if you’re using.onesignalWidgetURL() - Apply the modifier to both the main Live Activity view and Dynamic Island if you want to track clicks on both
Step 2: Handle URLs in Your App
Add URL handling in your app to track clicks and route users appropriately:trackClickAndReturnOriginal() method automatically tracks the click with OneSignal and returns the original URL you specified in the widget for your app to handle.
Updating a Live Activity
Use the Update Live Activity API to update active widgets. Match theactivity_id used when starting the activity.
This example request updates the push-to-start widget because it has the activity_id of push-to-start defined when starting the activity.
To update the click-to-start widget, update the request path to use click-to-start instead of push-to-start.

You successfully updated a Live Activity!Check out the Update Live Activity API for more information on updating a Live Activity.
Ending a Live Activity
Using the same Update Live Activity API, you can end a Live Activity by setting"event": "end".
- Use our SDK
exit()method. - User manually swipes the Live Activity away.
- User revokes permission for Live Activities in their iOS Settings.

You successfully ended the Live Activity and completed the example!
Best practices & recommendations
Design considerations
- Follow Apple’s Live Activities Human Interface Guidelines.
- Prioritize important information to make it easy to understand at a quick glance.
- Don’t add elements to your app that draw attention to the Dynamic Island.
- Use margins and maintain space between elements.
- Use a bold color for the background. Design for both Light and Dark mode.
Functionality
- Apple requires each Live Activity presentation to be supported.
- Test your deep links.
- Review Apple’s guide on Displaying Live Data with Live Activities.
- Avoid displaying sensitive information in a Live Activity.
Setting a fallback message
If a user cannot receive an update after a Live Activity has started, opening the app should refresh the activity. Set the stale date to a point in the future after you expect to have sent the first update. Users who have not received the update are shown the fallback message instead. You can listen for the “stale” state in your widget UI to show a fallback message:
Live Activity permission observer
When a user first sees a Live Activity, iOS prompts them to allow or disallow updates. If they select “Don’t Allow”, they do not receive further updates. Use an observer to listen for changes in the user’s Live Activity permission status.
FAQ
What is the budget for high-priority updates?
Apple does not provide a fixed limit for high-priority (priority: 10) updates, but they do enforce a dynamic system-level budget. Sending too many high-priority updates in a short period may result in throttling, where updates are delayed or dropped.
To reduce the risk of throttling:
- Use a mix of priority levels: Apple recommends using both
priority: 5(standard) andpriority: 10(high) for balance. - Reserve
priority: 10for time-sensitive or critical updates only (e.g., order status changes, game scores).
- Add the key
NSSupportsLiveActivitiesFrequentUpdatesto your app’sInfo.plistfile, set as a BooleanYES. - When this budget is exceeded, iOS may prompt the user to allow additional updates. If the user agrees, Apple will automatically expand the allowed update limit to maintain a seamless experience.
Can I read Live Activity updates from the main app?
Yes. You can observe updates for debugging or UI sync:The API returned a 400 with an error message stating I’m over the subscriber limit. What do I do?
If your push subscriber count exceeds your plan’s limit, upgrade your account to the next plan or contactsupport@onesignal.com. See the Pricing page for plan details.
How do I avoid sending both push and Live Activities?
Your application may already send a series of Push Notifications, where your designed Live Activity replaces the need for these Push Notifications. For example, if you send score updates via Push, you could replace this through a Live Activity. When a user opts in for a Live Activity, add a data tag to their profile. You can then exclude users with that tag from push messages that contain the same or similar content using Segments.Troubleshooting
No recipients
For users to be found when starting or updating a Live Activity, the activity type, widget, and API request must all have matching values.-
Check the path parameters in your request to ensure that you are sending a correctly formatted request to the server. The App ID must match your App ID used in the
OneSignal.Initializemethod and the activity type must match that of the type you’ve defined in your Live Activity file. - In the body of the Push To Start API request, you should have the following parameters:
event:"start"event_updates: The dynamic data you have defined in your struct under activity type and that is used in your widget. Ensure the letter casing and variables all match between the request, the type, and the widget.event_attributes: Static data follows the same logic as Event Updates and must include all variables in use, and must match across all parts of the live activity and the requestactivity_id: This will assign an ID to the widget and is what will be used to update the activity after it has been launched on the user’s device.name: The Live Activity Name.contents: The message content required for sending push.headings: The message heading required for sending push.- A targeting parameter like
included_segments. Available options.
Activity sent, but not received
- Ensure that the request is formatted correctly. If any fields that are used in the Widget are omitted, the activity may not launch or update as expected.
-
In your API request, determine the
prioritylevel you are setting. If you are setting this to10(highest priority), try lowering it to5and test again. Apple will throttle requests being sent out too frequently per their own internal rate limits.
NSSupportsLiveActivitiesFrequentUpdates to your Info.plist as a Boolean set to YES. See Apple’s Developer Docs for details. When the push budget is exceeded, iOS prompts the user to allow additional updates.
Need help?Chat with our Support team or email
support@onesignal.comPlease include:- Details of the issue you’re experiencing and steps to reproduce if available
- Your OneSignal App ID
- The External ID or Subscription ID if applicable
- The URL to the message you tested in the OneSignal Dashboard if applicable
- Any relevant logs or error messages

