Frequently asked questions mobile-live-faq
General Questions
An iOS app can run multiple Live activity instances simultaneously, including several that use the same ActivityAttributes type.
There is no hard limit imposed by developers on how many Live activity instances of a given attribute type can exist. You can start as many as your app logic requires, for instance, one per ongoing delivery or ride. However, iOS enforces a system-level limit on how many Live activity instances can be active or visible at once.
In practice:
-
iOS typically supports up to about five concurrent Live activity instances per app.
-
If you exceed this number, the system may stop displaying some activity instances or terminate older ones to conserve resources.
-
Each Live activity instance has a unique
Activity.id, which lets you update or end it individually.
- iOS 16.1+: Basic Live activities support
- iOS 17.2+: Push-to-start functionality (remotely start without opening the app)
- iOS 18+: Broadcast channel support for audience-based Live activities
dismissalDate or explicitly calling activity.end() in your app.Developer Questions
ActivityConfiguration.Learn more about Widget configuration
LiveActivityAttributes class for both local and remote Live activities?Messaging.registerLiveActivity().liveActivityID or channelID, the request will fail silently on the device. Always ensure you are tracking which Live activity instances are active for each user.Yes, you can test locally-started as well as remotely-started Live activities in the iOS Simulator.
-
Local: This includes creating, updating, and ending a Live activity directly from your app using ActivityKit APIs.
-
Remote: To test Live activity functionality remotely, integrate our Messaging SDK into your app and use the provided execution APIs to send remote start, update and end to your test device or iOS Simulator. Similar to how push notifications can be tested currently with Adobe SDKs integration.
liveActivityID and channelID?liveActivityID: Used for individual (unitary) Live activity targeted at specific users. Each ID represents a unique Live activity instance.channelID: Used for broadcast Live activity sent to audiences. All users in the audience receive the same updates on the same channel.
ActivityConfiguration has separate closures for Lock Screen content and Dynamic Island content (expanded, compact, and minimal states), each design independently.Messaging.registerLiveActivity(), the SDK automatically collects and manages push tokens for you.ActivityKit are subject to system-enforced limits. If you attempt multiple start requests in quick succession, iOS may reject further starts due to Live activity quotas or budget constraints. After about 5 consecutive start attempts, subsequent requests begin failing until a brief cooldown period passes.Apple does not specify an exact numerical cap for high-priority (priority: 10) Live activity updates. The system maintains a dynamic internal budget that limits how frequently such updates can be sent. If too many high-priority updates are issued in a short span, iOS may throttle or delay subsequent ones.
To minimize throttling:
- Balance priority levels: Combine both standard
(priority: 5)and high(priority: 10)updates depending on importance. - Use high priority sparingly: Reserve high priority for time-critical updates, such as delivery progress, order status, or live sports scores.
- Support frequent updates: Include
NSSupportsLiveActivitiesFrequentUpdatesin your app’sInfo.plistand set it to YES if you need frequent updates.
Marketer Questions
When remotely starting a Live activity through Adobe’s Execution APIs:
-
You can include an
x-request-idheader in your request. Ideally, there should be a one-to-one relationship between eachliveActivityIDand its correspondingx-request-id. This ensures that if multiple requests are made with the samex-request-idandliveActivityIDcombination, only one Live activity instance will be started on the device, and duplicate requests will be ignored. -
If the
x-request-idheader is omitted, each request is treated independently, which can result in multiple Live activity instances being created with the sameliveActivityID. In such cases, future updates may fail or apply to only one of the active instances. -
The
x-request-idvalue should not be reused across differentliveActivityIDsin separate API requests.
API Questions
timestamp and dismissal-date?timestamp: The current epoch time when the event occurs, required for all events.dismissal-date: A future epoch time when the Live activity should auto-dismiss, required only for “end” events.
attributes fields in every update call?Yes, based on you LiveActivityAttribute class.
- All fields from your attributes object, including
liveActivityDatashould be included in every call, for start, updates or end. - Only the
content-statefields represent what actually changes dynamically on a running live activity. - Include an alert object as well, it ensures that the push is treated as a user-visible notification, not as a silent background one. Required only for ‘start’ cases and otherwise optional.
1759937682requestId for multiple API calls?requestId to ensure idempotency and proper tracking. Use UUIDs or similar unique identifiers.event field in the payload. However, some organizations prefer separate campaigns for better analytics tracking.Troubleshooting Questions
Common causes:
- Mismatched
liveActivityIDorchannelIDbetween start and update calls. content-statefields don’t match yourContentStatestruct.- The Live activity has already ended.
- Network connectivity issues on the device.
- The epoch time used as timestamp is not up-to-date.
attributes-type field is not being recognized. What should I check?- Ensure the class name matches exactly (case-sensitive) with your Swift struct name
- Verify the struct is properly defined and registered
- Check for typos in the JSON payload
- Confirm the app version installed has the Live activity implementation
alert field is optional and may be suppressed by iOS in certain conditions, for example Do Not Disturb mode. A Live activity can update silently, which is often the intended behavior. The alert field is mandatory for sending remote starts otherwise apple treats it like a silent background notification.- Verify your widget implementation properly accesses
context.stateandcontext.attributes. - Check that default values or error states are handled in your widget interface.
- Use the
LiveActivityAssuranceDebuggableprotocol to debug the schema. - Test with Adobe Assurance to see if data is being received.