如何将DeviceActivityReport/Monitor的总屏幕时间数据共享至主应用?
关于DeviceActivityReport Extension与主应用共享屏幕时间数据的解决方案
1. 可行方案:Extension与主应用共享屏幕时间数据
当然有可行方案,最常用的是利用Apple的App Groups机制实现跨组件数据共享:
- App Groups + UserDefaults:先在开发者后台给主应用和Extension配置同一个App Group ID,然后在Extension计算完总屏幕时间后,通过
UserDefaults(suiteName: "your.group.id")将数据存入共享容器;主应用同样通过该suiteName的UserDefaults读取数据即可。 - App Groups + 文件/Core Data:如果数据量偏大(比如包含多维度的屏幕时间明细),可以把数据写入共享容器内的文件,或者使用共享的Core Data持久化存储。Extension负责写入,主应用读取解析。
2. 使用DeviceActivity Monitor实现的可行性及操作步骤
完全可以用DeviceActivity Monitor实现,甚至这是更高效的方式,不需要手动从Extension同步数据,直接在主应用获取同源的屏幕时间报告:
- 第一步:在主应用中初始化
DeviceActivityMonitor,指定和Extension生成报告时一致的DeviceActivitySchedule(比如相同的时间区间、触发条件)。 - 第二步:实现
DeviceActivityMonitorDelegate协议,在monitor(_:didReceiveActivityReports:for:)方法中接收系统推送的活动报告数据——这些数据和Extension中拿到的是同一来源,你可以直接在主应用里计算总屏幕时间,或者和Extension共享的补充数据结合使用。 - 第三步:根据小队功能的需求,将计算后的总时间存储或展示,不需要依赖Extension的主动同步。
3. 其他替代方案
除了上述两种,还有几种可选方案:
- XPC通信:主应用和Extension建立XPC连接,Extension计算完数据后主动通过XPC把数据发送给主应用。适合实时性要求高的场景,但实现起来相对繁琐,需要处理连接建立、消息序列化等细节。
- CloudKit同步:把Extension计算的总屏幕时间上传到CloudKit,主应用从CloudKit拉取数据。这种方案适合跨设备的小队成员共享,但需要用户登录iCloud,还要处理同步冲突的问题。
- 本地通知传递:Extension完成数据计算后,发送本地通知,把总时间数据放在通知的
userInfo里传递给主应用。但userInfo有大小限制,只适合传递简单的数值型数据,不适合复杂的明细结构。
内容的提问来源于stack exchange,提问作者Chirag Gujarati
相关产品推荐
相关产品推荐

