使用FamilyControls和DeviceActivity开发屏幕时间应用:eventDidReachThreshold不触发
问题排查与解决方案
针对你使用FamilyControls和DeviceActivity开发屏幕时间应用时eventDidReachThreshold未触发的问题,从配置、代码和系统层面整理以下排查点:
1. 修复ManagedSettingsStore的App Group配置
你的DeviceActivityMonitorExtension中初始化ManagedSettingsStore时未指定共享的App Group,导致扩展和主应用无法同步屏蔽规则,这是屏蔽功能不生效的核心原因。修改代码:
// 扩展中指定App Group let store = ManagedSettingsStore(appGroup: "group.com.aung.Cooked")
主应用中初始化ManagedSettingsStore时同样需要指定该App Group,确保数据共享。
2. 验证DeviceActivityMonitorExtension的配置
- 检查扩展的
Info.plist,确认NSExtensionPrincipalClass的值为$(PRODUCT_MODULE_NAME).DeviceActivityMonitorExtension,确保系统能正确识别扩展类。 - 扩展的Deployment Target必须与主应用一致,不能低于主应用的iOS版本。
3. 调整DeviceActivitySchedule的时间区间
你当前设置的intervalStart和intervalEnd都是午夜0点的组件,可能被系统判定为无效的时间范围。修改为覆盖全天的有效区间:
// 替换原startComponents和endComponents的生成逻辑 let startComponents = DateComponents(hour: 0, minute: 0, second: 0) let endComponents = DateComponents(hour: 23, minute: 59, second: 59)
或者直接使用DeviceActivitySchedule.daily简化配置:
let schedule = DeviceActivitySchedule.daily(from: startComponents, to: endComponents)
4. 缩小阈值快速验证
将测试阈值设为1分钟,快速验证事件是否触发,排除长时间等待带来的误差:
let threshold = DateComponents(minute: 1)
5. 排查iOS 26.5 Beta的系统问题
由于你使用的是Beta版本,存在API不稳定的可能性:
- 在iOS 25正式版环境下测试相同代码,若问题消失则说明是Beta系统的bug。
- 查看Apple Beta Release Notes,确认是否有已知的DeviceActivityEvent触发问题。
6. 确认事件与活动名称的匹配
在eventDidReachThreshold中添加日志,打印event.rawValue和activity.rawValue,确认与启动监控时设置的名称一致:
override func eventDidReachThreshold(_ event: DeviceActivityEvent.Name, activity: DeviceActivityName) { super.eventDidReachThreshold(event, activity: activity) print("Event triggered: \(event.rawValue), Activity: \(activity.rawValue)") let store = ManagedSettingsStore(appGroup: "group.com.aung.Cooked") store.shield.applicationCategories = .all() }
内容的提问来源于stack exchange,提问作者jj win
相关产品推荐
相关产品推荐

