I have a UIApplicationDelegate, where I want to terminate a live activity (in dynamic island) in applicationWillTerminate. However, ending an activity is asynchronous. When I end it within a Task, it's never called.
ActivityKit
RSS for tagHelp people keep track of tasks and events that they care about with Live Activities on the Lock Screen, the Dynamic Island, and in StandBy.
Posts under ActivityKit tag
117 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
When my app is in the background, I create a Live Activity through a push notification with token get from pushToStartTokenUpdates, and this process works fine. However, without opening the app, how can I retrieve the new push token for this Live Activity again and use it for subsequent updates to the Live Activity content?
For devices running iOS 18 and iPadOS 18 or later, you can add input-push-token: 1 to your payload to start a Live Activity and receive a new push token. After you receive a new push token, you can use it to send updates to a Live Activity.
I read from https://developer.apple.com/documentation/ActivityKit/starting-and-updating-live-activities-with-activitykit-push-notifications#Start-new-Live-Activities-with-ActivityKit-push-notifications
that I can start a live activity from CUSTOM SERVER by the start token I get from MyApp.Does that paragraph means my CUSTOM SERVER can receive a new token from aps?
If not, how can update the live activity started by Push-Notification when MyApp doesn't alive?
And what "input-push-token: 1 " can do, when I put it in the payloads?
Our app occasionally crashes when creating a Live Activity using ActivityKit.
Crash log analysis indicates a wild pointer issue originating within ActivityKit.
The crash appears to be linked to the coexistence of multiple Live Activities.
Could this be a compatibility issue with ActivityKit?
We would appreciate any guidance or potential workarounds to resolve this issue.
Looking forward to your response.
Thread 0 Crashed:
0 ActivityKit 0x000000023023d034 0x230235000 + 32820 ( + 13792)
1 ActivityKit 0x000000023023d014 0x230235000 + 32788 ( + 13760)
2 Combine 0x00000001ac5bd168 0x1ac5b5000 + 33128 ( + 292)
3 Combine 0x00000001ac5c0658 0x1ac5b5000 + 46680 ( + 24)
4 Combine 0x00000001ac5d1714 0x1ac5b5000 + 116500 ( + 204)
5 Combine 0x00000001ac5c8da0 0x1ac5b5000 + 81312 ( + 24)
6 Combine 0x00000001ac5e8e98 0x1ac5b5000 + 212632 ( + 2520)
7 Combine 0x00000001ac5d1a4c 0x1ac5b5000 + 117324 ( + 24)
8 Combine 0x00000001ac68316c 0x1ac5b5000 + 844140 ( + 56)
9 Combine 0x00000001ac5d4a4c 0x1ac5b5000 + 129612 ( + 176)
10 Combine 0x00000001ac5bd43c 0x1ac5b5000 + 33852 ( + 392)
11 Combine 0x00000001ac5b7198 0x1ac5b5000 + 8600 ( + 24)
12 Combine 0x00000001ac5ead74 0x1ac5b5000 + 220532 ( + 712)
13 Combine 0x00000001ac5e2320 0x1ac5b5000 + 185120 ( + 24)
14 Combine 0x00000001ac5bfe74 0x1ac5b5000 + 44660 ( + 488)
15 Combine 0x00000001ac5b81b8 0x1ac5b5000 + 12728 ( + 24)
16 Combine 0x00000001ac5b8804 0x1ac5b5000 + 14340 (Just.receive(subscriber:) + 424)
17 Combine 0x00000001ac5f7a7c 0x1ac5b5000 + 273020 (Publishers.Merge.receive(subscriber:) + 820)
18 Combine 0x00000001ac5d9850 0x1ac5b5000 + 149584 (PublisherBox.receive(subscriber:) + 108)
19 Combine 0x00000001ac5b8154 0x1ac5b5000 + 12628 (AnyPublisher.receive(subscriber:) + 64)
20 Combine 0x00000001ac5dc9cc 0x1ac5b5000 + 162252 ( + 548)
21 Combine 0x00000001ac5dc764 0x1ac5b5000 + 161636 (Publishers.HandleEvents.receive(subscriber:) + 620)
22 Combine 0x00000001ac5d9850 0x1ac5b5000 + 149584 (PublisherBox.receive(subscriber:) + 108)
23 Combine 0x00000001ac5b8154 0x1ac5b5000 + 12628 (AnyPublisher.receive(subscriber:) + 64)
24 Combine 0x00000001ac5d92e8 0x1ac5b5000 + 148200 (Publishers.FlatMap.receive(subscriber:) + 416)
25 Combine 0x00000001ac5dc9cc 0x1ac5b5000 + 162252 ( + 548)
26 Combine 0x00000001ac5d9850 0x1ac5b5000 + 149584 (PublisherBox.receive(subscriber:) + 108)
27 Combine 0x00000001ac5b8154 0x1ac5b5000 + 12628 (AnyPublisher.receive(subscriber:) + 64)
28 Combine 0x00000001ac5f062c 0x1ac5b5000 + 243244 (Publishers.CompactMap.receive(subscriber:) + 572)
29 Combine 0x00000001ac5d9850 0x1ac5b5000 + 149584 (PublisherBox.receive(subscriber:) + 108)
30 Combine 0x00000001ac5b8154 0x1ac5b5000 + 12628 (AnyPublisher.receive(subscriber:) + 64)
31 Combine 0x00000001ac5e64e4 0x1ac5b5000 + 201956 (Publishers.SetFailureType.receive(subscriber:) + 552)
32 Combine 0x00000001ac5d92e8 0x1ac5b5000 + 148200 (Publishers.FlatMap.receive(subscriber:) + 416)
33 Combine 0x00000001ac5dc9cc 0x1ac5b5000 + 162252 ( + 548)
34 Combine 0x00000001ac5d9850 0x1ac5b5000 + 149584 (PublisherBox.receive(subscriber:) + 108)
35 Combine 0x00000001ac5b8154 0x1ac5b5000 + 12628 (AnyPublisher.receive(subscriber:) + 64)
36 Combine 0x00000001ac5f062c 0x1ac5b5000 + 243244 (Publishers.CompactMap.receive(subscriber:) + 572)
37 Combine 0x00000001ac5d9850 0x1ac5b5000 + 149584 (PublisherBox.receive(subscriber:) + 108)
38 Combine 0x00000001ac5b8154 0x1ac5b5000 + 12628 (AnyPublisher.receive(subscriber:) + 64)
39 Combine 0x00000001ac5bdd68 0x1ac5b5000 + 36200 (Publishers.ReceiveOn.receive(subscriber:) + 812)
40 Combine 0x00000001ac5f1e10 0x1ac5b5000 + 249360 (Publisher.sink(receiveCompletion:receiveValue:) + 304)
41 ActivityKit 0x00000002302594a0 0x230235000 + 148640 ( + 6064)
42 ActivityKit 0x0000000230258c18 0x230235000 + 146456 ( + 3880)
43 ActivityKit 0x0000000230258410 0x230235000 + 144400 ( + 1824)
44 ActivityKit 0x0000000230258124 0x230235000 + 143652 ( + 1076)
45 ActivityKit 0x0000000230258080 0x230235000 + 143488 ( + 912)
46 ActivityKit 0x000000023026d280 0x230235000 + 230016 ( + 4228)
47 ActivityKit 0x000000023026d39c 0x230235000 + 230300 ( + 4512)
48 libswiftDispatch.dylib 0x00000001ac59e7f4 0x1ac59d000 + 6132 ( + 28)
49 libswiftDispatch.dylib 0x00000001ac5a5a90 0x1ac59d000 + 35472 ( + 16)
50 libswiftDispatch.dylib 0x00000001ac59f97c 0x1ac59d000 + 10620 ( + 188)
51 libswiftDispatch.dylib 0x00000001ac59fa90 0x1ac59d000 + 10896 ( + 28)
52 libswiftDispatch.dylib 0x00000001ac59f5ec 0x1ac59d000 + 9708 ( + 28)
53 libdispatch.dylib 0x00000001ab37feac 0x1ab37c000 + 16044 ( + 20)
54 libdispatch.dylib 0x00000001ab38f428 0x1ab37c000 + 78888 ( + 56)
55 libswiftDispatch.dylib 0x00000001ac59ef38 0x1ac59d000 + 7992 ( + 180)
56 libswiftDispatch.dylib 0x00000001ac59e0dc 0x1ac59d000 + 4316 ( + 56)
57 libswiftDispatch.dylib 0x00000001ac59ec48 0x1ac59d000 + 7240 ( + 396)
58 libswiftDispatch.dylib 0x00000001ac59e188 0x1ac59d000 + 4488 (OS_dispatch_queue.sync(execute:) + 164)
59 ActivityKit 0x000000023026be70 0x230235000 + 224880 ( + 3228)
60 ActivityKit 0x000000023026b400 0x230235000 + 222208 ( + 556)
61 ActivityKit 0x00000002302d10b4 0x230235000 + 639156 ( + 25780)
62 ActivityKit 0x00000002302d0cd0 0x230235000 + 638160 ( + 24784)
63 ActivityKit 0x00000002302d0b94 0x230235000 + 637844 ( + 24468)
64 xxxx 0x0000000100919638 specialized static LiveActivityManager.startActivity(title:) + 169528 (LiveActivityManager.swift:96)
I'm implementing iOS Live Activities in my Flutter app using the live_activities package. While the activity seems to be created (I can get the activity token, and clicking the Dynamic Island opens the app), the LiveActivity UI does not show up as expected.
Logs: The following errors/warnings appear in the logs:
Not updating lastKnownShmemState in CFPrefsPlistSource<0x6000006bc7e0> (Domain: group.powerdock.sessionactivity, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): 34 -> 33
What Works: The activity token is created successfully. Clicking the Dynamic Island opens my app.
What Does Not Work: The LiveActivity UI does not display on the lock screen or elsewhere.
Hello,
I am experiencing an issue with the Live Activity feature in my application. Despite extensive debugging efforts, the problem persists, and I would greatly appreciate your assistance.
Here are the key details of the issue:
We are not using APNS; everything related to Live Activities is handled locally within the app.
The Live Activity displays task details, including: Task title, icon and A label functioning as a timer that shows the remaining time in seconds for the task.
The Live Activity appears as expected when the app is opened. However, when the app is sent to the background, the Live Activity does not appear consistently. It disappears unexpectedly in some random instances.
I have tried various debugging methods, including:
Ensuring the activity is correctly created and updated as per the Apple Documentation.
Verifying the ActivityAttributes and ActivityContentState configurations.
Testing with different app lifecycle events to determine when the issue occurs.
Despite these efforts, the issue remains unresolved, and the cause is unclear. The app behavior seems inconsistent, as the Live Activity sometimes remains visible and at other times disappears when the app is backgrounded.
I would greatly appreciate your help in understanding and addressing this issue. Specifically:
Are there any system-level constraints or conditions that could cause a Live Activity to terminate when the app is backgrounded?
Are there best practices or configurations to ensure the persistence of locally managed Live Activities?
Can you suggest additional debugging techniques or tools that could help identify the root cause?
Thank you for your time and support. Please let me know if further information or logs are needed to assist in troubleshooting
Hello,
I am experiencing an issue with the Live Activity feature in my application. Despite extensive debugging efforts, the problem persists, and I would greatly appreciate your assistance.
Here are the key details of the issue:
We are not using APNS; everything related to Live Activities is handled locally within the app.
The Live Activity displays task details, including: Task title, icon and A label functioning as a timer that shows the remaining time in seconds for the task.
The Live Activity appears as expected when the app is opened. However, when the app is sent to the background, the Live Activity does not appear consistently. It disappears unexpectedly in some random instances.
I have tried various debugging methods, including:
Ensuring the activity is correctly created and updated as per the Apple Documentation.
Verifying the ActivityAttributes and ActivityContentState configurations.
Testing with different app lifecycle events to determine when the issue occurs.
Despite these efforts, the issue remains unresolved, and the cause is unclear. The app behavior seems inconsistent, as the Live Activity sometimes remains visible and at other times disappears when the app is backgrounded.
I would greatly appreciate your help in understanding and addressing this issue. Specifically:
Are there any system-level constraints or conditions that could cause a Live Activity to terminate when the app is backgrounded?
Are there best practices or configurations to ensure the persistence of locally managed Live Activities?
Can you suggest additional debugging techniques or tools that could help identify the root cause?
Thank you for your time and support. Please let me know if further information or logs are needed to assist in troubleshooting
STEPS TO REPRODUCE
Download and Install the Owaves App from the App Store.
Create a Live Activity:
Open the app and create an activity for the current time on Today.
Example: If the current time is 9:30 AM, create an activity with a time range such as 9:00 AM - 10:00 AM to ensure it is live.
Enable Live Activity:
Tap on the newly created activity to open the Event Details page.
Scroll to the bottom of the page and locate the toggle switch labeled "Live Activity".
Switch the toggle to the ON position to enable the Live Activity.
Background the App:
Send the app to the background.
Check the Lock Screen:
Swipe down to enable iOS' Lock Screen and check for the Live Activity from the Owaves app.
Repeat the Steps:
If the Live Activity appears on the Lock Screen initially, repeat steps 3-5 multiple times.
Eventually, you will encounter instances where the Live Activity does not appear on the Lock Screen, despite following the same process
I'm implementing a timer feature and facing the issue that the live activity I'm starting just continues showing after the timer is complete.
The body of the live activity widget is more or less:
ActivityConfiguration(for: WhendyWidgetAttributes.self) { context in
VStack {
Text(
context.state.timerEndDate,
style: .timer
)
// if Date.now < timerEndTime { Text("Done") }
self.expandedView(state: context.state)
}
} …
Ideally I could get the activity to show something else when it is done but I don't know how to get it to re-evaluate it's body once the end time is reached.
I create the activity with
let activity = try ActivityKit.Activity.request(
attributes: attributes,
content: .init(
state: .init(timerEndDate: timerEndDate),
staleDate: timerEndDate
),
pushType: nil
)
Can I schedule the activity to do a refresh it's body (and reevaluating Date.now) once the timerEndDate is reached?
Considered Approaches
trying staleDate
However, the activity never shows that it has become stale. Would it be expected that it shows the stale-ness?
scheduling dismissal
I also thought about starting and immediately stopping the activity with a delayed dismissal, but unfortunately it seems this is limited to a 4 hour window, and I'd like longer timers too.
remote updates
I understand I could use remote notifications to update the live activity, but I'd really like to keep things local as all the functionality is locally plannable.
Background Tasks
I understand these don't run reliably or at a predictable time.
A Timer in the app that updates the content
I think this would only update the activity while the app is in foreground.
I have implemented a Live Activity with Dynamic Island support for my charging app. Currently, the Dynamic Island expands when tapped, but I want to disable this interaction completely. Here's my current implementation:
**dynamicIsland: { context in
DynamicIsland {
// Expanded Regions
DynamicIslandExpandedRegion(.leading) {
// Leading expanded content
}
DynamicIslandExpandedRegion(.trailing) {
// Trailing expanded content
}
DynamicIslandExpandedRegion(.bottom) {
// Bottom expanded content
}
} compactLeading: {
// Compact leading view content
} compactTrailing: {
// Compact trailing view content
} minimal: {
// Minimal view content
}
.keylineTint(Color.clear)
}**
Hello
i ve implemented progressview and updating the state via push notification.
the progress view wants closedrange which i followed but whenever i get update, the progress value resets to beginning
my range is like :
Date.now..endDate
but i dont get it, lets assume that i get the date from database and initialized already then how the code will understand that what progress value will be as current ?
it has to be something like i suppose :
startDate..Date.now..endDate
thanks
hello,
i'm not able to activate Live activities from app id configuration.
Do i miss something ?
thanks for your help
Hi, so i'm trying to use Activity.update but XCode throws an error if I don't use the ios 16 syntax, only to throw a warning that it's deprecated if I do. Screenshots below. Should I bug report or is there a known workaround?
I'm trying to create a preview for my live activities when it's stale, so I created a preview provider. I followed some examples, but XCode says I'm missing preview context. Am I doing something wrong?
I tried adding .previewContext(WidgetPreviewContext(family: .systemSmall)) but that doesn't seem to work.
(Also have a case ID, 9879068)
We have an app that user use to check in/out from work for example. We have a button in-app do do this. Now I'm trying to add buttons to our widgets and our new live activity so that users don't have to open the app.
It's crucial that the live activity and widgets always show the exact same state.
Otherwise it'll look pretty bad if a user has both a live activity and a widget showin at the same time.
However, we have noticed that sometimes, pressing the button in the live activity, running the app intent, will not always make the widget update (we call reloadAllTimelines()). The other way around, i.e. press the button on widget to update live activity always works. (they both call the same app intent)
When running it in debug mode on a phone from Xcode, it always works, but when running it just on the phone it's unreliable.
My first thought was, of course, that's related to the widget "budget", but according to the docs HERE, it should not be applied when interacting with a widget, calling an app intent.
My question: HOW can I make my widget reliably refresh using an app intent invoked from a live activity??
I have a ready small project with simple buttons and trace labels that display this issue that I'm happy to supply to someone.
frequentPushEnablementUpdates asynchronous sequence is never called even if 'More Frequent Updates' is toggled ON or OFF.
for await frequentPushEnabled in ActivityAuthorizationInfo().frequentPushEnablementUpdates {
// never called
}
Though we are able to get the 'More Frequent Updates' value once by the following:
var isEnabled = ActivityAuthorizationInfo().frequentPushesEnabled //true if ON, false if OFF
This only gives the result once as it is not async observation sequence.
But the 'frequentPushEnablementUpdates' async sequence is never called. As per the doc - 'frequentPushEnablementUpdates' is an asynchronous sequence you use to observe whether a person permitted you to update Live Activities with frequent ActivityKit push notifications.
Our context involves smart kitchen appliances, where cooking may be initiated by an app or directly by the device.
When the app is not running, we can only start a Live Activity through a remote push notification. However, an increasing number of users report issues where they cannot update or terminate the Live Activity.
While we can reproduce this issue in some cases, it is inconsistent and lacks a clear pattern.
I have a sample project and would like to confirm the following questions:
When the app is not running, does each pushToStartToken update wake the app and reliably trigger the callback below?
for await pushToken in Activity<DeviceAttributes>.pushToStartTokenUpdates {
}
When the app is not running, does each pushTokenUpdates update wake the app and reliably trigger the callback below?
Task {
for await activity in Activity<DeviceAttributes>.activityUpdates {
Task {
for try await tokenData in activity.pushTokenUpdates {
}
}
}
}
Must pushToStartTokenUpdates and pushTokenUpdates be placed directly in application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?), or can they be in another wrapper, such as an RxSwift wrapper?
If pushTokenUpdates is updated, but the received pushToken fails to synchronize to the server due to network issues, how should this be handled?
Alternatively, if you have any better suggestions, I would be very grateful to hear them.
Here is a simple example.
Hello everyone,
I’m currently receiving feedback from clients in a production environment who are encountering a BadDeviceToken error with Live Activities, which is preventing their states from updating. However, for other clients, the token is working fine and everything functions as expected.
I’m collaborating with the back-end developers to gather more information about this issue, but the only log message we’re seeing is:
Failed to send a push, APNS reported an error: BadDeviceToken
I would greatly appreciate it if anyone could provide some insight or information on how to resolve this issue.
Hey there,
Create Live activity in my project, after executing the creation method, back to the background, real-time activity UI is not displayed, but click Smart Island is effective,
now do not know where the problem appears?
Has anyone experienced this problem?
Thanks
I'm unable to find sample code that demonstrates how to support a custom Live Activity layout for Apple Watch. I have read the documentation and have added the supplementalActivityFamilies with small and medium. However, I am not able to detect when the activityFamily is set to small.
This is what I'm trying to use without success:
struct MyWidgetLiveActivity: Widget {
@Environment(\.activityFamily) var activityFamily: ActivityFamily
var body: some WidgetConfiguration {
ActivityConfiguration(for: MyWidgetAttributes.self) { context in
if activityFamily == .small {
Text("Apple Watch! \(activityFamily.description)")
} else {
Text("Not small family: \(activityFamily.description)")
}
} dynamicIsland: { context in
return DynamicIsland {
DynamicIslandExpandedRegion(.leading) {
Text("Leading")
}
DynamicIslandExpandedRegion(.trailing) {
Text("Trailing")
}
DynamicIslandExpandedRegion(.bottom) {
Text("Bottom")
}
} compactLeading: {
Text("CL")
} compactTrailing: {
Text("CT")
} minimal: {
Text("M")
}
}
.supplementalActivityFamilies([.small, .medium])
}
}
This code shows "Not small family: medium" on my Apple Watch. Could somebody provide some insight into why this doesn't work for me?
Greetings,
i have been watched the video and looked for codes to apply live activity for watch.
problem is in preview always show my widget as medium size even if apply supporting widget family and changing the content of preview to dynamicIsland .compact
however preview still shows me the medium size everytime. what is wrong ?