Post

Replies

Boosts

Views

Activity

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
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
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
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
Reducing Memory Usage in DeviceActivityMonitor: Help Needed
Hi everyone, I am a beginner in Swift and I am currently using DeviceActivityMonitor to develop an app for parents to control their children's app usage time. During the development process, I found that the DeviceActivityMonitor has a 6MB memory limit in the background, and my app exceeds this limit after running for a long time. I would like to know how to reduce the memory usage of DeviceActivityMonitor in the background, or where I can check the memory usage of DeviceActivityMonitor and see which variables are consuming memory. Additionally, I want to know if a new instance of the DeviceActivityMonitor class is created every time it is called? Thank you for your help!
1
2
671
Aug ’24
Issue with Missing Application Token Data in DeviceActivityEvent
I am developing an application for managing screen time, and I encountered an issue when retrieving DeviceActivityEvent bound to a specific DeviceActivityName using the events method of DeviceActivityCenter. I noticed that the application token data bound to DeviceActivityEvent is missing. Could you help me understand why this might be happening?
1
0
497
Jul ’24
ManagedSettingsStore&socialStore.shield
when i watch the video (https://developer.apple.com/videos/play/wwdc2022/110336/) i find the code let socialStore = ManagedSettingsStore(named: .social) let socialCategory = database.socialCategoryToken socialStore.shield.applicationCategories = .specific([socialCategory]) i try to find ManagedSettingsStore shield and specific([socialCategory]) i Documentation , but i failed. who can tell me wher i can find about ManagedSettingsStore shield or specific([socialCategory]) ? thanks a lot.
0
0
548
Mar ’24
Bug in DeviceActivity
I am developing an app using DeviceActivity. let schedule = DeviceActivitySchedule( intervalStart: DateComponents(hour : 0, minute : 0, second: 1), intervalEnd: DateComponents(hour : 23, minute : 59, second: 59), repeats: true ) I found that on the second day, intervalDidStart(for: DeviceActivityName) gets called multiple times. I also tried let schedule = DeviceActivitySchedule( intervalStart: DateComponents(hour : 0, minute : 0, second: 1), intervalEnd: DateComponents(hour : 23, minute : 59, second: 59), repeats: false ) and started monitoring for the next day in the intervalDidEnd(for: DeviceActivityName) method. but , intervalDidStart(for: DeviceActivityName) still gets called multiple times. How should I resolve this issue?
0
0
476
Oct ’24
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
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
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
How to Access Core Data from Another App via App Group
I have two apps that share data through an App Group. However, I’ve noticed that when one of the apps is uninstalled, the shared Core Data model is also uninstalled. If I don't create a shared model in one of the apps, I cannot access the data. What should I do to resolve this issue?
Replies
2
Boosts
0
Views
720
Activity
Sep ’24
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
How to hide app by familycontrols
I am currently developing an app to help people focus on their work. I use familycontrols , managedsettings and devie activity to develop it. I am currently facing an issue where I would like to hide the app selected by the user from the main screen and resource library. But I did not find any relevant information in the document. Who can help me.
Replies
1
Boosts
0
Views
680
Activity
Mar ’24
Do Extension need extra provisoning profile?
I create two Extensions in my continer app. Do I need create diffierent provisoning profiles for these Extensions ?
Replies
1
Boosts
0
Views
869
Activity
Apr ’24
Reducing Memory Usage in DeviceActivityMonitor: Help Needed
Hi everyone, I am a beginner in Swift and I am currently using DeviceActivityMonitor to develop an app for parents to control their children's app usage time. During the development process, I found that the DeviceActivityMonitor has a 6MB memory limit in the background, and my app exceeds this limit after running for a long time. I would like to know how to reduce the memory usage of DeviceActivityMonitor in the background, or where I can check the memory usage of DeviceActivityMonitor and see which variables are consuming memory. Additionally, I want to know if a new instance of the DeviceActivityMonitor class is created every time it is called? Thank you for your help!
Replies
1
Boosts
2
Views
671
Activity
Aug ’24
Issue with Missing Application Token Data in DeviceActivityEvent
I am developing an application for managing screen time, and I encountered an issue when retrieving DeviceActivityEvent bound to a specific DeviceActivityName using the events method of DeviceActivityCenter. I noticed that the application token data bound to DeviceActivityEvent is missing. Could you help me understand why this might be happening?
Replies
1
Boosts
0
Views
497
Activity
Jul ’24
How to display DeviceActivityReportScene in a widget
How to display DeviceActivityReportScene in a widget. When I was developing a widget, I found that DeviceActivityReportScene could not be displayed in the widget.
Replies
1
Boosts
0
Views
88
Activity
Mar ’25
ManagedSettingsStore&socialStore.shield
when i watch the video (https://developer.apple.com/videos/play/wwdc2022/110336/) i find the code let socialStore = ManagedSettingsStore(named: .social) let socialCategory = database.socialCategoryToken socialStore.shield.applicationCategories = .specific([socialCategory]) i try to find ManagedSettingsStore shield and specific([socialCategory]) i Documentation , but i failed. who can tell me wher i can find about ManagedSettingsStore shield or specific([socialCategory]) ? thanks a lot.
Replies
0
Boosts
0
Views
548
Activity
Mar ’24
I have a host application and I've added an extension to it. The bundle IDs of the two are different. Do I need to apply for a separate Provisioning Profile for the extension?
I have a host application and I've added an extension to it. The bundle IDs of the two are different. Do I need to apply for a separate Provisioning Profile for the extension?
Replies
0
Boosts
0
Views
622
Activity
Apr ’24
Bug in DeviceActivity
I am developing an app using DeviceActivity. let schedule = DeviceActivitySchedule( intervalStart: DateComponents(hour : 0, minute : 0, second: 1), intervalEnd: DateComponents(hour : 23, minute : 59, second: 59), repeats: true ) I found that on the second day, intervalDidStart(for: DeviceActivityName) gets called multiple times. I also tried let schedule = DeviceActivitySchedule( intervalStart: DateComponents(hour : 0, minute : 0, second: 1), intervalEnd: DateComponents(hour : 23, minute : 59, second: 59), repeats: false ) and started monitoring for the next day in the intervalDidEnd(for: DeviceActivityName) method. but , intervalDidStart(for: DeviceActivityName) still gets called multiple times. How should I resolve this issue?
Replies
0
Boosts
0
Views
476
Activity
Oct ’24