通过Flutter插件访问Apple DeviceActivity API遇阻求助
获取Apple Screen Time DeviceActivityData 完整示例
关键修复与补充步骤
- 确认
AuthorizationCenter授权状态为.authorized(你已实现授权,可在查询前检查状态) - 启动监控后,需调用
DeviceActivityCenter的queryActivityData方法主动获取数据 - 注意时间范围的合理设置,数据收集存在延迟,刚启动监控可能返回空结果
完整代码示例
public class SwiftAppUsagePlugin: NSObject, FlutterPlugin { //** boilerplate flutter plugin code removed for readability **// func startMonitoring() { let schedule = DeviceActivitySchedule(intervalStart: DateComponents(hour: 0, minute: 0), intervalEnd: DateComponents(hour: 23, minute: 59), repeats: true, warningTime: nil) let center = DeviceActivityCenter() do { try center.startMonitoring(.daily, during: schedule) print("Monitor started") // 启动监控后触发数据查询(可根据业务逻辑调整查询时机) queryDeviceActivityData() } catch { print("Could not start monitoring \(error)") } } func queryDeviceActivityData() { let center = DeviceActivityCenter() let calendar = Calendar.current // 设置查询时间范围:今日0点至当前时间 let startOfDay = calendar.startOfDay(for: Date()) let endDate = Date() center.queryActivityData(for: .daily, from: startOfDay, to: endDate) { result in switch result { case .success(let activityData): print("获取到设备活动数据:\(activityData)") // 遍历应用使用数据 for appActivity in activityData.applicationActivity { print("应用BundleID:\(appActivity.bundleIdentifier),总使用时长:\(appActivity.totalUsageTime)秒") } case .failure(let error): print("查询设备活动数据失败:\(error.localizedDescription)") } } } } extension DeviceActivityName { static let daily = Self("daily") }
额外注意事项
- 确保
Info.plist中添加了NSFamilyUsageDescription字段,填写访问屏幕时间数据的用途说明 - 数据收集存在系统级延迟,建议在监控启动一段时间后再发起查询
- 若涉及家庭共享场景,需确保已完成Family Control的相关配置与权限申请
内容的提问来源于stack exchange,提问作者DerCommodore
相关产品推荐
相关产品推荐

