Post

Replies

Boosts

Views

Activity

Color picker not working
HStack{ FormLable(text: NSLocalizedString("Color", comment: "")) Spacer() Image(systemName: "circle.fill") .font(.system(size: AppFontSize.baseSize.size() * 1.2, weight: .medium)) .foregroundColor(color) .overlay(ColorPicker("Color", selection: $color).labelsHidden().opacity(0.015)) } This is how I use the color picker. I used the same code in two different apps, and the color picker appeared in one app but not in the other. By the way, I upgraded Xcode to the latest version.
2
0
435
Feb ’25
FamilyActivityPicker will have a problem closing the parent element fullScreenCover in the 18.4 official version
.fullScreenCover(isPresented: $isShow) { Button(action : { isPresented.toggle() }){ Text("Choose") } .familyActivityPicker( isPresented: $isPresented, selection: $selection) .onChange(of: selection){ value in } } In the official version of iOS 18, when I click the Done button of familyActivityPicker, the fullScreenCover pop-up box will disappear.
2
2
194
Apr ’25
Live Activity (Dynamic Island) suddenly stopped working without code changes
Hi everyone, I am encountering an issue where my Live Activity (Dynamic Island) suddenly became invalid and failed to launch. It was working perfectly before, and I haven't modified any code since then. My Environment: Xcode: 26.1.1 Device iOS: 26.1 Testing: I also tested on iOS 18, but the Live Activity fails to start there as well. Here is my code: Live Activity Manager (Start/Update/End): func startLiveActivity() { // Initial static data let attributes = SimpleIslandAttributes(name: "Test Order") // Initial dynamic data let initialContentState = SimpleIslandState(message: "Preparing...") // Adapting for iOS 16.2+ new API (Content) let activityContent = ActivityContent(state: initialContentState, staleDate: nil) do { let activity = try Activity.request( attributes: attributes, content: activityContent, pushType: nil // Set to nil as remote push updates are not needed ) print("Live Activity Started ID: \(activity.id)") } catch { print("Failed to start: \(error.localizedDescription)") } } // 2. Update Live Activity func updateLiveActivity() { Task { let updatedState = SimpleIslandState(message: "Delivering 🚀") let updatedContent = ActivityContent(state: updatedState, staleDate: nil) // Iterate through all active Activities and update them for activity in Activity<SimpleIslandAttributes>.activities { await activity.update(updatedContent) print("Update") } } } // 3. End Live Activity func endLiveActivity() { Task { let finalState = SimpleIslandState(message: "Delivered ✅") let finalContent = ActivityContent(state: finalState, staleDate: nil) for activity in Activity<SimpleIslandAttributes>.activities { // dismissalPolicy: .default (immediate), .after(...) (delayed), .immediate (no animation) await activity.end(finalContent, dismissalPolicy: .default) print("End") } } } The Models (Shared between App and Widget Extension): // 1. Define State (Dynamic data, changes over time, e.g., remaining delivery time) public struct SimpleIslandState: Codable, Hashable { var message: String } // 2. Define Attributes (Static data, constant after start, e.g., Order ID) public struct SimpleIslandAttributes: ActivityAttributes { public typealias ContentState = SimpleIslandState var name: String // e.g., "My Order" } The Widget Code: // // SimpleIslandWidget.swift // ReadyGo // // Created by Tang Yu on 2025/11/19. // import WidgetKit import SwiftUI import ActivityKit struct SimpleIslandWidget: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: SimpleIslandAttributes.self) { context in // UI shown on the Lock Screen VStack { Text("Lock Screen Notification: \(context.state.message)") } .activityBackgroundTint(Color.cyan) .activitySystemActionForegroundColor(Color.black) } dynamicIsland: { context in // Inside Widget Extension DynamicIsland { // Expanded Region DynamicIslandExpandedRegion(.center) { Text("Test") // Pure text only } } compactLeading: { Text("L") // Pure text only } compactTrailing: { Text("R") // Pure text only } minimal: { Text("M") // Pure text only } } } } Additional Info: This is the minimal code setup I created for testing, but even this basic version is failing. I have set NSSupportsLiveActivities (Supports Live Activities) to YES (true) in the Info.plist for both the Main App and the Widget Extension. Has anyone experienced this? Any help would be appreciated.
3
0
322
Nov ’25
About the problem that DeviceActivityMonitorExtension does not work
I am developing an app that can help users disable selected apps at a specified time, so that users can get away from their phones and enjoy real life. Here is my data structure: extension ActivityModel { @NSManaged public var id: UUID @NSManaged public var name: String @NSManaged public var weeks: Data @NSManaged public var weekDates: Data @NSManaged public var appTokens: Data } Among them, weeks is of [Bool] type, indicating which weeks from Sunday to Saturday are effective; weekDates is of [[Date,Date]] type, indicating the effective time period; appTokens is of Set type, indicating the selected apps。 At the beginning, I will open a main monitor: let deviceActivityCenter = DeviceActivityCenter() do{ try deviceActivityCenter.startMonitoring( DeviceActivityName(activityModel.id), during: DeviceActivitySchedule( intervalStart: DateComponents(hour: 0,minute: 0,second: 0), intervalEnd: DateComponents(hour: 23,minute: 59,second: 59), repeats: true ) ) }catch { return false } Since the time range may be different every day, I will start the sub-monitoring of the day every time the main monitoring starts: override func intervalDidStart(for activity: DeviceActivityName) { super.intervalDidStart(for: activity) if activity.rawValue.hasPrefix("Sub-") { ActivityModelManager.disableApps( Tools.getUUIDFromString(activity.rawValue) ) return } let weekIndex = Calendar.current.component(.weekday, from: .now) let weeks = ActivityModelManager.getWeeks(activity.rawValue) if weeks[weekIndex] { let weekDates = ActivityModelManager.getWeekDates(activity.rawValue) let deviceActivityCenter = DeviceActivityCenter() do{ try deviceActivityCenter.startMonitoring( DeviceActivityName("Sub-" + activityModel.id), during: DeviceActivitySchedule( intervalStart: getHourAndMinute(weekDates[weekIndex][0]), intervalEnd: getHourAndMinute(weekDates[weekIndex][1]), repeats: false ) ) }catch { return } }esle { return } } I will judge whether it is main monitoring or sub monitoring based on the different activity names. When the sub-monitor starts, I will get the bound application and then disable it: static func disableApps(_ id : UUID){ let appTokens = ActivityModelManager.getLimitAppById(id) let name = ManagedSettingsStore.Name(id.uuidString) let store = ManagedSettingsStore(named: name) store.shield.applications = appTokens return } When the child monitoring is finished, I resume the application: static func enableApps(_ id : UUID){ let name = ManagedSettingsStore.Name(id.uuidString) let store = ManagedSettingsStore(named: name) store.shield.applications = [] } The above is my code logic. When using DeviceActivityMonitorExtension, I found the following problems: intervalDidStart may be called multiple times, resulting in several sub-monitors being started. After a period of time, the monitoring is turned off. The static methods enableApps and disableApps are sometimes not called
4
0
766
Mar ’25
Summary of issues encountered with the Screen Time interface
I have developed three apps using the Screen Time API. The following are common problems I encountered in the three apps: DeviceActivityMonitorExtension is automatically killed after running for a few days (frequently) The same DeviceActivityEvent in DeviceActivityMonitorExtension is triggered twice during eventDidReachThreshold (especially obvious in iOS18.5) Screen Time authorization is automatically canceled for no reason (occasionally) I hope to get help
5
2
337
Jun ’25
Color picker not working
HStack{ FormLable(text: NSLocalizedString("Color", comment: "")) Spacer() Image(systemName: "circle.fill") .font(.system(size: AppFontSize.baseSize.size() * 1.2, weight: .medium)) .foregroundColor(color) .overlay(ColorPicker("Color", selection: $color).labelsHidden().opacity(0.015)) } This is how I use the color picker. I used the same code in two different apps, and the color picker appeared in one app but not in the other. By the way, I upgraded Xcode to the latest version.
Replies
2
Boosts
0
Views
435
Activity
Feb ’25
FamilyActivityPicker will have a problem closing the parent element fullScreenCover in the 18.4 official version
.fullScreenCover(isPresented: $isShow) { Button(action : { isPresented.toggle() }){ Text("Choose") } .familyActivityPicker( isPresented: $isPresented, selection: $selection) .onChange(of: selection){ value in } } In the official version of iOS 18, when I click the Done button of familyActivityPicker, the fullScreenCover pop-up box will disappear.
Replies
2
Boosts
2
Views
194
Activity
Apr ’25
DeviceActivityCenter startMonitoring Error
I found that in iOS 18.5, DeviceActivityCenter startMonitoring cannot start multiple monitors, even if their names and periods are different, and restarting the phone cannot solve it. My app uses DeviceActivityCenter, which makes the entire function unusable. (I have less than 20 monitors)
Replies
2
Boosts
0
Views
305
Activity
Jul ’25
Live Activity (Dynamic Island) suddenly stopped working without code changes
Hi everyone, I am encountering an issue where my Live Activity (Dynamic Island) suddenly became invalid and failed to launch. It was working perfectly before, and I haven't modified any code since then. My Environment: Xcode: 26.1.1 Device iOS: 26.1 Testing: I also tested on iOS 18, but the Live Activity fails to start there as well. Here is my code: Live Activity Manager (Start/Update/End): func startLiveActivity() { // Initial static data let attributes = SimpleIslandAttributes(name: "Test Order") // Initial dynamic data let initialContentState = SimpleIslandState(message: "Preparing...") // Adapting for iOS 16.2+ new API (Content) let activityContent = ActivityContent(state: initialContentState, staleDate: nil) do { let activity = try Activity.request( attributes: attributes, content: activityContent, pushType: nil // Set to nil as remote push updates are not needed ) print("Live Activity Started ID: \(activity.id)") } catch { print("Failed to start: \(error.localizedDescription)") } } // 2. Update Live Activity func updateLiveActivity() { Task { let updatedState = SimpleIslandState(message: "Delivering 🚀") let updatedContent = ActivityContent(state: updatedState, staleDate: nil) // Iterate through all active Activities and update them for activity in Activity<SimpleIslandAttributes>.activities { await activity.update(updatedContent) print("Update") } } } // 3. End Live Activity func endLiveActivity() { Task { let finalState = SimpleIslandState(message: "Delivered ✅") let finalContent = ActivityContent(state: finalState, staleDate: nil) for activity in Activity<SimpleIslandAttributes>.activities { // dismissalPolicy: .default (immediate), .after(...) (delayed), .immediate (no animation) await activity.end(finalContent, dismissalPolicy: .default) print("End") } } } The Models (Shared between App and Widget Extension): // 1. Define State (Dynamic data, changes over time, e.g., remaining delivery time) public struct SimpleIslandState: Codable, Hashable { var message: String } // 2. Define Attributes (Static data, constant after start, e.g., Order ID) public struct SimpleIslandAttributes: ActivityAttributes { public typealias ContentState = SimpleIslandState var name: String // e.g., "My Order" } The Widget Code: // // SimpleIslandWidget.swift // ReadyGo // // Created by Tang Yu on 2025/11/19. // import WidgetKit import SwiftUI import ActivityKit struct SimpleIslandWidget: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: SimpleIslandAttributes.self) { context in // UI shown on the Lock Screen VStack { Text("Lock Screen Notification: \(context.state.message)") } .activityBackgroundTint(Color.cyan) .activitySystemActionForegroundColor(Color.black) } dynamicIsland: { context in // Inside Widget Extension DynamicIsland { // Expanded Region DynamicIslandExpandedRegion(.center) { Text("Test") // Pure text only } } compactLeading: { Text("L") // Pure text only } compactTrailing: { Text("R") // Pure text only } minimal: { Text("M") // Pure text only } } } } Additional Info: This is the minimal code setup I created for testing, but even this basic version is failing. I have set NSSupportsLiveActivities (Supports Live Activities) to YES (true) in the Info.plist for both the Main App and the Widget Extension. Has anyone experienced this? Any help would be appreciated.
Replies
3
Boosts
0
Views
322
Activity
Nov ’25
About the problem that DeviceActivityMonitorExtension does not work
I am developing an app that can help users disable selected apps at a specified time, so that users can get away from their phones and enjoy real life. Here is my data structure: extension ActivityModel { @NSManaged public var id: UUID @NSManaged public var name: String @NSManaged public var weeks: Data @NSManaged public var weekDates: Data @NSManaged public var appTokens: Data } Among them, weeks is of [Bool] type, indicating which weeks from Sunday to Saturday are effective; weekDates is of [[Date,Date]] type, indicating the effective time period; appTokens is of Set type, indicating the selected apps。 At the beginning, I will open a main monitor: let deviceActivityCenter = DeviceActivityCenter() do{ try deviceActivityCenter.startMonitoring( DeviceActivityName(activityModel.id), during: DeviceActivitySchedule( intervalStart: DateComponents(hour: 0,minute: 0,second: 0), intervalEnd: DateComponents(hour: 23,minute: 59,second: 59), repeats: true ) ) }catch { return false } Since the time range may be different every day, I will start the sub-monitoring of the day every time the main monitoring starts: override func intervalDidStart(for activity: DeviceActivityName) { super.intervalDidStart(for: activity) if activity.rawValue.hasPrefix("Sub-") { ActivityModelManager.disableApps( Tools.getUUIDFromString(activity.rawValue) ) return } let weekIndex = Calendar.current.component(.weekday, from: .now) let weeks = ActivityModelManager.getWeeks(activity.rawValue) if weeks[weekIndex] { let weekDates = ActivityModelManager.getWeekDates(activity.rawValue) let deviceActivityCenter = DeviceActivityCenter() do{ try deviceActivityCenter.startMonitoring( DeviceActivityName("Sub-" + activityModel.id), during: DeviceActivitySchedule( intervalStart: getHourAndMinute(weekDates[weekIndex][0]), intervalEnd: getHourAndMinute(weekDates[weekIndex][1]), repeats: false ) ) }catch { return } }esle { return } } I will judge whether it is main monitoring or sub monitoring based on the different activity names. When the sub-monitor starts, I will get the bound application and then disable it: static func disableApps(_ id : UUID){ let appTokens = ActivityModelManager.getLimitAppById(id) let name = ManagedSettingsStore.Name(id.uuidString) let store = ManagedSettingsStore(named: name) store.shield.applications = appTokens return } When the child monitoring is finished, I resume the application: static func enableApps(_ id : UUID){ let name = ManagedSettingsStore.Name(id.uuidString) let store = ManagedSettingsStore(named: name) store.shield.applications = [] } The above is my code logic. When using DeviceActivityMonitorExtension, I found the following problems: intervalDidStart may be called multiple times, resulting in several sub-monitors being started. After a period of time, the monitoring is turned off. The static methods enableApps and disableApps are sometimes not called
Replies
4
Boosts
0
Views
766
Activity
Mar ’25
Summary of issues encountered with the Screen Time interface
I have developed three apps using the Screen Time API. The following are common problems I encountered in the three apps: DeviceActivityMonitorExtension is automatically killed after running for a few days (frequently) The same DeviceActivityEvent in DeviceActivityMonitorExtension is triggered twice during eventDidReachThreshold (especially obvious in iOS18.5) Screen Time authorization is automatically canceled for no reason (occasionally) I hope to get help
Replies
5
Boosts
2
Views
337
Activity
Jun ’25