We are evaluating the new behavior mentioned in the Nearby Interaction documentation for iOS 18.4+, which states:
“In iOS 18.4 and later, your app can continue ranging in the background with any supported device if the app starts a Live Activity as it goes to the background."
Could you clarify what situations are considered “can continue ranging” versus cases where it will not continue?
Specifically, if my app:
starts a NISession in the foreground
starts a Live Activity with that data
then the app goes to background
should the NI session still deliver ranging updates so the app can update the Live Activity?
also, my app already enable Background Modes capability
Widgets & Live Activities
RSS for tagDiscuss how to manage and implement Widgets & Live Activities.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Created
I have a watchOS WidgetKit complication that needs the user's location to show the nearest transit station, but the widget never gets location permission and CLLocationManager times out.
Setup:
NSWidgetWantsLocation = YES in Widget Extension's Info.plist
NSLocationWhenInUseUsageDescription and NSLocationAlwaysAndWhenInUseUsageDescription in Widget Extension's Info.plist
Watch App successfully has location authorization
Problem:
The system never presents a location permission prompt for my widget. Apple's own World Clock widget does get one on watchOS (see screenshot) — I can't figure out what triggers it.
When the widget tries to get location via CLLocationManager, the request times out and never returns a location.
Questions:
What triggers the system location prompt for a watchOS widget? Is NSWidgetWantsLocation sufficient or is something else required?
Why would CLLocationManager time out and never return a location inside a widget extension? Is there a specific pattern required for requesting location in a WidgetKit timeline provider?
Screenshots
Sorry for swedish, but it says "Do you allow widgets from World Clock to use your location services?"
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Tags:
WatchKit
watchOS
Core Location
WidgetKit
Our app is using the CLLocationManager to wake up the app near an iBeacon and then tries to connect to the accessory via bluetooth and UWB.
For this to work in the background we need to create a Live Activity and show the user that the app is doing something.
When the app is in the foreground or just recently got into the inactivity mode this works fine and we can use CoreBluetooth/NearbyInteraction even when the app then enters the background mode.
But when the app is longer in the background creating a Live Activity via Activity.request() throws an ActivityAuthorizationError.visibility.
According to the documentation the LiveActivityIntent is able to workaround this background restriction but I get the same exception when
I create the LiveActivity from the perform() method.
Is there another API to create Live Activities? Do I need to prepare the LiveActivityIntent somehow?
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Tags:
Nearby Interaction
Core Bluetooth
ActivityKit
Environment
iOS Version: 26.4 Beta (Build 17E5170d)
Xcode Version: 26.4 Beta
Framework: AccessoryNotifications, AccessoryTransportExtension
Description
When implementing AccessoryNotifications.NotificationsForwarding.AccessoryNotificationsHandler, I'm unable to retrieve the URL for sourceIcon from AccessoryNotification.
The file.url property throws AccessoryError error 0 with the message "unable to get file URL".
Code Sample
func add(
notification: AccessoryNotification,
alertingContext: AlertingContext,
alertCoordinator: any AlertCoordinating
) {
Task {
if let sourceIcon = notification.sourceIcon {
do {
let url = try await sourceIcon.url // Throws AccessoryError error 0
let data = try Data(contentsOf: url)
// Process icon data...
} catch {
print("Failed to get sourceIcon URL: (error)")
// Error: The operation couldn't be completed.
// (AccessoryNotifications.AccessoryError error 0.)
}
}
}
}
Observed Behavior
The sourceIcon property is present and its type is correctly reported as public.image:
│ sourceIcon : present
│ type.identifier : public.image
│ type.description : image
│ url : (error: The operation couldn't be completed.
(AccessoryNotifications.AccessoryError error 0.))
Error details:
Error: customError(message: "unable to get file URL")
Type: AccessoryError
Code: 0
Expected Behavior
The file.url property should return a valid URL that allows reading the source icon image data, or the documentation should clarify any limitations or prerequisites for
accessing this resource.
Questions
Is this a known limitation in the current beta?
Are there additional entitlements or permissions required to access sourceIcon.url?
Is there an alternative API to retrieve the actual image data for sourceIcon?
Additional Context
The same error occurs when accessing url in both describeNotification (debug logging) and sendAttachment methods
contextIcon is typically nil for the notifications tested (e.g., WeChat messages)
The notification metadata (title, body, actions, etc.) is correctly received
Could you please provide guidance on the following points:
Start Token Throttling
Are there any throttling limits or rate restrictions applied to Start Tokens?
Token Invalidation Scenarios
Under what specific conditions can a Start Token become invalidated?
Are there known scenarios that trigger invalidation?
Token Regeneration Timeline
Once a Start Token is invalidated, how long does it typically take before a new token can be successfully generated and validated?
Frequency of Invalidation
Is there any documented or expected frequency with which Start Tokens may become invalid, assuming a normal development workflow?
Impact on Push Notification Token
When a live activity Start Token becomes invalid, does this also cause APNs Push Notification Tokens to be invalidated or refreshed automatically?
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Tags:
APNS
Extensions
Notification Center
WidgetKit
I have been experiencing many issues trying to integrate the Apple AlarmKit in my app. I essentially keeping getting authorization errors. I was wondering if anyone else was experiencing issues like this and if anyone had guidance or a fix for what I am experiencing. I was under the impression that any devices IOS26+ could use the AlarmKit but maybe I am mistaken. Getting (com.apple.AlarmKit.Alarm error 1.) every time I try and enable alarms.
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Hello,
I’m working on an iOS app where we have integrated ActivityKit to support Live Activities.
Our app currently supports iOS 16.x and above, and we do not have an Apple Watch app or watchOS support. However, we noticed that when a Live Activity starts on the iPhone, it automatically appears on the Apple Watch as well.
Since our app is not designed for Apple Watch, we would like to prevent the Live Activity UI from appearing on the watch.
My questions:
Is there any way to disable or prevent Live Activities from showing on Apple Watch via code?
Are there any configuration options in ActivityKit or Widget configuration that can restrict Live Activities to iPhone only?
Our current setup:
Minimum iOS version: 16.x
Using ActivityKit for Live Activities
No watchOS target in the app
Any guidance or recommended approach would be greatly appreciated.
Thanks
Hi!
My users have reported (and I have observed) a blank Live Activity where only a black capsule is shown in the dynamic island. When tapping that capsule, the app opens, but inside the capsule, nothing is shown. The Live Activity is created through the AlarmKit API like this:
let identifier = UUID()
Task {
do {
_ = try await AlarmManager.shared.schedule(
id: identifier,
configuration: .init(
countdownDuration: countdownDuration,
attributes: attributes,
stopIntent: CancelTimerIntent(),
secondaryIntent: RestartTimerIntent(),
sound: Settings.shared.systemAlarmToneEnabled ? .default : .named(Settings.shared.alarmTone[.loop].filename)
)
)
Log.debug("Alarm scheduled successfully: \(identifier.uuidString)")
} catch {
Log.error("Error scheduling alarm with id \(identifier.uuidString), error: \(error)")
}
}
I've read some other forum posts where developers reported the same issue:
https://developer.apple.com/forums/thread/807335
https://developer.apple.com/forums/thread/812006
I assume, it has something to do with state management. However, in my case, this only happens very rarely. I use the app on a daily basis and the issue with the blank live activity only occurs like once a month, so I cannot reproduce it.
I also have some logic to resume an existing alarm or snooze:
do {
for alarm in try AlarmManager.shared.alarms {
switch alarm.state {
case .paused:
try AlarmManager.shared.resume(id: alarm.id)
case .alerting:
try AlarmManager.shared.countdown(id: alarm.id)
default:
break
}
}
} catch {
Log.error("Error resuming alarm: \(error)")
}
Is there any way I can debug this issue properly?
I have checked the Device Logs and the Console in Xcode and didn't find any hints. Only one log made me a little suspicious, but I read that this might happen occasionally and may be ignored:
Couldn't read values in CFPrefsPlistSource<0x10ae0d080> (Domain: group.myappgroupidentifier User: kCFPreferencesAnyUser, ByHost: Yes, Container: (null), Contents Need Refresh: Yes): Using kCFPreferencesAnyUser with a container is only allowed for System Containers, detaching from cfprefsd
Any ideas on how I could proceed to find the cause of this empty (apparently crashed) Live Activity?
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Good afternoon all,
I have a question about Live Activities, specifically ProgressView. Why are they so hard to customize? You can't even really, consistently make the bar a specific height in points. You can't provide any progress view style to make it richer and more dynamic.
We want to build a progress bar that's built up of 3 components: a track with its value constant on 1.0 (the full progress) with a specific color, another track that's the actual progress from ProgressView(timerInterval:countsDown:), and some way to create a visual gap in between.
The progress bar should also be bigger than the standard size from iOS, but that's also not possible. The corners become really ugly when you use the scaleEffect modifier.
Please, if anyone has any ideas about customizing the ProgressView without me having to send push notifications to manually make sure the bar updates, comment down below.
Hi everyone,
I’m implementing Live Activities in my iOS app and encountering an issue when starting a Live Activity via an APNS push. The Live Activity card appears on the Lock Screen / Dynamic Island for a moment, then immediately disappears. In the console, I see the following error:
Content load failed: unable to find or unarchive file for key: [com.meituan.imeituan-beta::com.meituan.imeituan-beta.liveactivity:Attributes type: SAKUniversalReminderAttributes:6DBCC2DC-E613-48F5-B97F-3EF72AA0877B]:[w:fix-374.00-h:dyn-64.00-160.00-cr:23.5-s:1.0.fam:medium]. The session may still produce one shortly. Error: Using url file:///private/var/mobile/Containers/Data/PluginKitPlugin/04F7B437-3C41-4823-8559-42E18F82B283/SystemData/com.apple.chrono/activities/6DBCC2DC-E613-48F5-B97F-3EF72AA0877B-w:fix-374.00-h:dyn-64.00-160.00-cr:23.5-s:1.0.fam:medium.activity-archive ... Error Domain=NSCocoaErrorDomain Code=4 "文件“6DBCC2DC-E613-48F5-B97F-3EF72AA0877B-w/fix-374.00-h/dyn-64.00-160.00-cr/23.5-s/1.0.fam/medium.activity-archive”不存在。" UserInfo={NSFilePath=/private/var/mobile/Containers/Data/PluginKitPlugin/04F7B437-3C41-4823-8559-42E18F82B283/SystemData/com.apple.chrono/activities/6DBCC2DC-E613-48F5-B97F-3EF72AA0877B-w:fix-374.00-h:dyn-64.00-160.00-cr:23.5-s:1.0.fam:medium.activity-archive, NSUnderlyingError=0x712b56820 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}<…>
The Live Activity is started by sending an APNS payload with the necessary content-state and attributes. I’ve verified that the attributes and content state types match the ones defined in the app, and the app is built with the correct entitlements.This happens on my iPhone 17 Pro device.
Has anyone encountered a similar issue? Could it be related to the archive file not being written correctly by the system, or perhaps a mismatch in the activity attributes? Any guidance on debugging or resolving this would be greatly appreciated.
Thank you!
I have a Live Activity on iOS. Love it.
However, that Live Activity via remote hosting (I'm not building for other targets) shows the Live Activity on watchOS, macOS and CarPlay.
disfavoredLocations are for widgets, but I don't appear to have a method to limit or provide exclusive locations the live activity should appear.
I am encountering an issue where the Lock Screen Quick Action fails to visibly open my app.
My app is a camera application that utilizes a CameraCaptureIntent to launch a standalone, lightweight camera view (accessible while the device is locked), distinct from the main application.
Steps to Reproduce:
Open the lightweight camera view using the Lock Screen Quick Action.
From this view, launch the Main App.
Lock the iPhone (put it to sleep).
Attempt to launch the lightweight camera view via the Quick Action again.
A slight animation occurs, but the camera view does not appear on screen. After multiple tests, it seems the view is actually launching but remains in an "invisible state."
I suspect that the system hides the lightweight camera view when transitioning to the Main App, but fails to reset this hidden state when the Quick Action is triggered subsequently.
I would appreciate any guidance on a potential workaround or confirmation if this is a known issue awaiting a system update.
How to eliminate this spacing?
Hi,
we start and update Live Activities with ActivityKit push notifications in our app, but want to do so only if the user is logged in. Therefore we only send the pushToStartToken to the server when a user logs in (or when the token changed and the user is still logged in.)
When the user logs out, we remove that start token from our server so that no LA can be started while the app is in the logged out state. This means that the logout isn't happening immediately but is waiting for that deletion request to succeed. This could also fail and lead to the use rnot being able to log out, e.g. if the user has no internet access.
If that deletion request would be fire and forget, we would end up in a state where the server still has the token and might start LAs without any user being logged in.
The token flow for Remote Push Notifications is different, on the other hand: requesting a token asynchronously via UIApplication.shared.registerForRemoteNotifications() but invalidating it synchronously (at least from the app's perspective) on logout via UIApplication.shared.unregisterForRemoteNotifications(), which makes it way easier for us to make sure the app does not get notifications when no user is logged in.
We're wondering if we're just holding it wrong or if our way of handling the LA token deletion is indeed the intended one?
Some of the users of my app reported that, the widgets cannot be loaded, event after restarts and re-installs. It seems that it is not rare, I have tens of reports on this (and probably much more who didn't report).
It seems the widget is blank even on the gallery screen while you are first adding it:
struct SingleWidgetProvider: AppIntentTimelineProvider {
@Environment(\.widgetFamily) var family
private let viewModel: WidgetViewModel = WidgetViewModel()
func placeholder(in context: Context) -> SingleEntry {
SingleEntry(date: Date(), habit: .singleSample)
}
func snapshot(for configuration: SingleWidgetConfigurationIntent, in context: Context) async -> SingleEntry {
guard let habit = Array(PersistenceManager.shared.retrieveHabitList().habits).first else {
return SingleEntry(date: Date(), habit: .singleSample)
}
let displayable = viewModel.displayableFromHabit(habit, separateComponents: true, secondOffset: 0)
return SingleEntry(date: Date(), habit: displayable)
}
func timeline(for configuration: SingleWidgetConfigurationIntent, in context: Context) async -> Timeline<SingleEntry> {
var entries: [SingleEntry] = []
guard let counter = configuration.currentCounter else {
return Timeline(entries: [SingleEntry(date: Date(), habit: .singleSample)], policy: .atEnd)
}
guard let habit = PersistenceManager.shared.retrieveHabit(habitKey: counter.id) else {
return Timeline(entries: [SingleEntry(date: Date(), habit: .singleSample)], policy: .atEnd)
}
let currentDate = Date()
for secondOffset in 0 ..< 100 {
let displayable = viewModel.displayableFromHabit(
habit,
separateComponents: true,
secondOffset: secondOffset,
symbolName: habit.habitSymbol?.name ?? "",
overrideColor: configuration.currentColor.color,
overrideButtonVisibility: configuration.currentButtonVisibility,
overrideDisplayOption: configuration.currentDisplayOption
)
let entryDate = Calendar.current.date(byAdding: .second,
value: secondOffset,
to: currentDate)!
let entry = SingleEntry(date: entryDate, habit: displayable)
entries.append(entry)
}
return Timeline(entries: entries, policy: .atEnd)
}
}
struct SingleEntry: TimelineEntry {
let date: Date
let habit: HabitDisplayable
}
static var singleSample: HabitDisplayable {
return HabitDisplayable(habitKey: nil,
title: LS("sampleWidgetHabitTitle"),
dates: [Date(timeIntervalSince1970: 1507158360)],
displayOption: .dayMonthYear,
secondOffset: 0,
separateComponents: true)
}
func displayableFromHabit(
_ habit: Habit,
separateComponents: Bool,
secondOffset: Int,
symbolName: String = "",
overrideColor: Color? = nil,
overrideButtonVisibility: WidgetButtonVisibility? = nil,
overrideDisplayOption: WidgetDisplayOption? = nil
) -> HabitDisplayable {
let latestDates: [HabitDate]
let displayOption: DisplayOption
if let overrideDisplayOption {
if overrideDisplayOption == .sameAsCounter {
displayOption = habit.settings?.toValue.displayOption ?? .dayMonthYear
} else {
displayOption = DisplayOption(rawValue: overrideDisplayOption.rawValue - 1) ?? .dayMonthYear
}
} else {
displayOption = habit.settings?.toValue.displayOption ?? .dayMonthYear
}
let displayMode = displayOption.mode
switch displayMode {
case .timePassed, .date:
latestDates = PersistenceManager.shared.latestDate(habit: habit).map { [$0] } ?? []
case .activity:
latestDates = PersistenceManager.shared.retrieveHabitDates(habit: habit, limitDate: displayOption.limitDate())
}
let displayButton: Bool
if let overrideButtonVisibility {
if overrideButtonVisibility == .sameAsCounter {
displayButton = habit.settings?.toValue.buttonType == .onRow
} else {
displayButton = overrideButtonVisibility == .show
}
} else {
displayButton = false
}
return HabitDisplayable(
habitKey: habit.habitKey,
title: habit.title,
dates: latestDates.map { $0.date },
displayOption: displayOption,
secondOffset: secondOffset,
separateComponents: separateComponents,
color: overrideColor ?? habit.habitColor?.color ?? .appPrimary,
symbolName: symbolName,
displayButton: displayButton
)
}
I provided a large portion of my code, let me know if you need more. The strange thing here is, even if the DB connection is broken somehow, it should have shown the default option (singleSample).
I am not able to reproduce/fix this for months now, so any help is very appreciated.
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Hello Apple Developer Technical Support,
I’m following up on case #102807413324 and submitting this as a code-level support request.
We are integrating iOS Live Activities (ActivityKit + WidgetKit extension written in SwiftUI) into an Expo/React Native app. We’re seeing behavior where the Live Activity UI shown on the Lock Screen appears to “stick” to an older layout and ignores updated SwiftUI code and/or bundled assets, even after rebuilding, reinstalling, and removing existing Live Activities before testing again.
Environment
Device: iPhone 13
iOS: 26.2
macOS: 15.7.3 (24G419)
Xcode: 16.4 (16F6)
Expo SDK: 52
React Native: 0.76.9
expo-live-activity: ^0.4.2
Build type: Ad-Hoc signed IPA (EAS local build)
Summary
We have a WidgetKit extension target (LiveActivity.appex, bundle id: stimul8.LiveActivity) using ActivityConfiguration(for: LiveActivityAttributes.self).
The extension contains multiple SwiftUI views selected via a “route” (derived from deepLinkUrl / title / subtitle), and uses images/backgrounds from the extension asset catalog (Assets.xcassets). We also support loading images from an App Group container with a fallback to the asset catalog.
After shipping updates, the Live Activity UI shown on the Lock Screen continues to resemble an older/default layout (example: a progress-bar-like element remains visible even after removing ProgressView usage from LiveActivityView.swift). Some custom backgrounds/images also fail to display as expected.
Routing (examples)
/streak -> StreakLiveActivityView
/streak-urgent -> StreakUrgentLiveActivityView
/lesson/create -> AILessonLiveActivityView1
/lesson/reminder -> AILessonLiveActivityView2
default -> LiveActivityView
Steps to reproduce (high-level)
Install/build and trigger a Live Activity.
Modify the SwiftUI layout in the extension (e.g., remove ProgressView and change obvious UI elements), rebuild, and reinstall.
Remove any existing Live Activities from the Lock Screen, then trigger a new Live Activity again.
Observed: Lock Screen Live Activity still renders the prior/older-looking UI and/or ignores updated assets.
Troubleshooting already done
Verified the extension (LiveActivity.appex) is included in the IPA and properly signed.
Verified Assets.car is present in the extension and PNG assets are present in the build artifacts.
Ensured SwiftUI source files used by the extension are overwritten during prebuild so the intended versions are present in ios/LiveActivity.
Cleared DerivedData related to LiveActivity builds.
Reinstalled the app and removed existing Live Activities from the Lock Screen before re-triggering new ones.
Questions
Is there any known caching behavior where Live Activities can continue to display a previous UI layout after an app/extension update, even when the activity is re-created?
Are there recommended steps to force the system to load the newest widget extension binary/UI beyond reinstalling and removing existing Live Activities?
What’s the recommended way to confirm which exact extension binary/UI version is being rendered on-device (e.g., specific Console logs, sysdiagnose signals, or other indicators)?
Are there any known constraints with Assets.xcassets usage for Live Activities that could cause bundled assets not to render even when present?
We can provide
A minimal reproduction Xcode project (preferred)
The IPA build
Build logs (Xcode/EAS)
Screenshots/video and a sysdiagnose captured after reproduction
Thank you for your guidance.
Best regards
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Summary
A crash occurs in ViewBridge framework when a TUINSRemoteViewController object
receives -release message after being deallocated. This appears to be a
reference counting issue within the ViewBridge framework's internal
autorelease pool management.
Environment
macOS Version: [15.0.0]
Application: Custom Qt-based application using Chromium Embedded Framework (xcode version: xcode 15; QT version: 6.5.4 ; CEF version: 138.0.47+g2728d53+chromium-138.0.7204.221)
Steps to Reproduce
Users are typically using the app normally, but a crash occasionally occurs when they activate and click on the application. This happens infrequently, but it occurs roughly every day. Currently, only a few specific users experience this crash, and it may appear for several consecutive days before disappearing for several days.
We cannot reliably reproduce this issue but have collected crash logs
from affected users.
Crash Analysis
Zombie Detection Log:
Zombie <TUINSRemoteViewController: 0x338708020> received -release
Deallocation Stack Trace (when object was first released):
0 Chromium Embedded Framework 0x000000014283a7f4 rust_png$cxxbridge1$ResultOfWriter$operator$sizeof + 933592
1 AppKit 0x000000019eac0d80 -[NSResponder dealloc] + 340
2 AppKit 0x000000019ebb5e34 -[NSViewController dealloc] + 276
3 ViewBridge 0x00000001a3f6ab9c -[NSRemoteViewController dealloc] + 92
4 AppKit 0x000000019eada4b4 -[NSViewController release] + 236
5 ViewBridge 0x00000001a3eda130 -[NSRemoteViewController release] + 380
6 libobjc.A.dylib 0x000000019aa8806c objc_autoreleasePoolPop + 56
7 CoreFoundation 0x000000019aefc7c0 _CFAutoreleasePoolPop + 32
8 Foundation 0x000000019c0d14f4 -[NSAutoreleasePool drain] + 136
9 ViewBridge 0x00000001a3ed609c __CONSIDER_WHO_REQUESTED_THIS_WAIT_BEFORE_SENDING_BUG_TO_VIEWBRIDGE__ + 24
10 ViewBridge 0x00000001a3f82a10 deferredBlockOpportunity_block_invoke_2 + 436
11 CoreFoundation 0x000000019af3dfa0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 28
12 CoreFoundation 0x000000019af3deb0 __CFRunLoopDoBlocks + 356
13 CoreFoundation 0x000000019af3d330 __CFRunLoopRun + 2432
14 CoreFoundation 0x000000019af3c334 CFRunLoopRunSpecific + 572
15 HIToolbox 0x00000001a63740cc RunCurrentEventLoopInMode + 292
16 HIToolbox 0x00000001a6379ebc ReceiveNextEventCommon + 636
17 HIToolbox 0x00000001a637a020 _BlockUntilNextEventMatchingListInModeWithFilter + 76
18 AppKit 0x000000019ea7fa70 _DPSNextEvent + 660
19 AppKit 0x000000019f3a57b8 -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 688
Crash Stack Trace (second release attempt):
0 Chromium Embedded Framework 0x14a03a37c rust_png$cxxbridge1$ResultOfWriter$operator$sizeof + 932448
1 Chromium Embedded Framework 0x14a03a04c rust_png$cxxbridge1$ResultOfWriter$operator$sizeof + 931632
2 CoreFoundation 0x19af1cbe8 ___forwarding___ + 200
3 CoreFoundation 0x19af1ca60 _CF_forwarding_prep_0 + 96
4 libobjc.A.dylib 0x19aa8bd94 AutoreleasePoolPage::releaseUntil(objc_object**) + 204
5 libobjc.A.dylib 0x19aa88138 objc_autoreleasePoolPop + 260
6 CoreFoundation 0x19aefc7c0 _CFAutoreleasePoolPop + 32
7 Foundation 0x19c0d14f4 -[NSAutoreleasePool drain] + 136
8 ViewBridge 0x1a3ed609c __CONSIDER_WHO_REQUESTED_THIS_WAIT_BEFORE_SENDING_BUG_TO_VIEWBRIDGE__ + 24
9 ViewBridge 0x1a3f82a10 deferredBlockOpportunity_block_invoke_2 + 436
10 CoreFoundation 0x19af3dfa0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 28
11 CoreFoundation 0x19af3deb0 __CFRunLoopDoBlocks + 356
12 CoreFoundation 0x19af3d330 __CFRunLoopRun + 2432
13 CoreFoundation 0x19af3c334 CFRunLoopRunSpecific + 572
14 HIToolbox 0x1a63740cc RunCurrentEventLoopInMode + 292
15 HIToolbox 0x1a6379ebc ReceiveNextEventCommon + 636
16 HIToolbox 0x1a637a020 _BlockUntilNextEventMatchingListInModeWithFilter + 76
17 AppKit 0x19ea7fa70 _DPSNextEvent + 660
18 AppKit 0x19f3a57b8 -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 688
19 AppKit 0x19ea72b7c -[NSApplication run] + 480
20 libqcocoa.dylib 0x1057b7514 QCocoaEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 2156
21 QtCore 0x109bb55c4 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 532
22 QtCore 0x109babff8 QCoreApplication::exec() + 112
23 HoYowave 0x1009fc740 QWidgetFrameAdapter::RunMessageLoop() + 132
24 HoYowave 0x1008ae908 0x10088c000 + 141576
25 HoYowave 0x1008b7038 0x10088c000 + 176184
26 HoYowave 0x1008a3544 0x10088c000 + 95556
27 HoYowave 0x1008a294c 0x10088c000 + 92492
28 dyld 0x19aad4274 start + 2840
Technical Analysis
The crash pattern indicates:
A TUINSRemoteViewController was autoreleased multiple times
During autorelease pool drain, the first release triggered dealloc
Subsequent release attempts accessed the deallocated object (zombie)
This is entirely within ViewBridge framework's internal code path
The function name __CONSIDER_VIEW_SERVICE_BEFORE_SENDING_BUG_TO_VIEWBRIDGE__
in the stack trace suggests this is a known problematic area.
Questions
Is this a known issue in ViewBridge framework?
Is there any workaround or mitigation we can apply from the application side?
Could you provide guidance on what might trigger this condition?
I have report this in Feedback Assistant FB21809243
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
I'm building out a live activity that has a button which is meant to update the content state of the Live Activity. It calls a LiveActivityIntent that runs in the app process.
The push server starts my live activity and the buttons work just fine. I pass the push token back to the server for further updates and when the next update is pushed by the server the buttons no longer work. With the debugger I'm able to verify the app intent code runs and passes the updated state to the activity. However the activity never updates or re-renders. There are no logs in Xcode or Console.app that indicates what the issue could be or that the update is ignored.
I have also tried adding the frequent updates key to my plist with no change.
I'm updating the live activity in the LiveActivityIntent like this:
public func perform() async throws -> some IntentResult {
let activities = Activity<WidgetExtensionAttributes>.activities
for activity in activities {
let currentState = activity.content.state
let currentIndex = currentState.pageIndex ?? 0
let maxIndex = max(0, currentState.items.count - 1)
let newIndex: Int
if forward {
newIndex = min(currentIndex + 1, maxIndex)
} else {
newIndex = max(currentIndex - 1, 0)
}
var newState = currentState
newState.pageIndex = newIndex
await activity.update(
ActivityContent(
state: newState,
staleDate: nil
),
alertConfiguration: nil,
timestamp: Date()
)
}
return .result()
}
To sum up:
Push to start -> tap button on activity -> All good!
Push to start -> push update -> tap button -> No good...
Topic:
App & System Services
SubTopic:
Widgets & Live Activities
Tags:
APNS
Intents
App Intents
ActivityKit
I’m implementing a Live Activity that shows some text and a button.
When the user taps the button, I want to open the host app.
What I’ve done so far:
Implemented a LiveActivityIntent to handle the button tap.
The intent is triggered successfully. However, the app does not open by using deep link/universal app link.
From what I can tell, LiveActivityIntent seems limited to system/background execution and doesn’t bring the app to the foreground.
Questions:
Is it possible for a LiveActivityIntent to open the app?
Is this behavior a documented/intentional limitation?
If not supported, is using a Universal Link or deep link the recommended solution for opening the app from a Live Activity button?
Any official clarification or recommended best practice would be helpful.
Issue Description:
Tapping the app widget sometimes triggers the Universal Link twice, causing duplicate navigation or actions within the app
Steps to Reproduce:
Add the app widget to the home screen
Tap the widget to open the app via the Universal Link
Observe that the Universal Link is sometimes fired twice
Expected Behavior:
Tapping the widget should trigger the Universal Link only once.
Actual Behavior:
Universal Link is triggered twice, causing duplicate
navigation or actions.