如何通过Device Activity和Family Controls获取iPhone应用24小时使用数据
Swift 获取过去24小时屏幕时间数据并转为JSON格式
我正尝试在Swift中编写一个函数,用于请求个人授权,并获取iPhone设备上所有已安装应用过去24小时的屏幕时间使用数据。我已添加了必要的权限和功能。现有代码如下,希望获取JSON或类似格式的数据以便在自定义UI视图中展示:
import UIKit import DeviceActivity import FamilyControls func requestScreenTimeData() { Task { do { try await AuthorizationCenter.shared.requestAuthorization(for: .individual) print("Authorization successful!") // Define the filter for activity monitoring let endDate = Date() // Current time let startDate = Calendar.current.date(byAdding: .hour, value: -24, to: endDate)! let dateInterval = DateInterval(start: startDate, end: endDate) let activityFilter = DeviceActivityFilter( segment: .daily(during: dateInterval), users: .all, devices: .init([.iPhone]) ) // Fetch and return the app usage data } catch { print("Authorization failed with error: \(error.localizedDescription)") } } }
实现数据获取与JSON转换
你可以通过DeviceActivityCenter的queryActivityReport方法获取屏幕时间数据,再将数据序列化转为JSON格式。以下是修改后的完整代码:
import UIKit import DeviceActivity import FamilyControls // 定义符合Codable协议的数据模型,用于JSON序列化 struct AppUsageData: Codable { let appName: String let bundleID: String let usageDuration: TimeInterval let dateInterval: DateInterval } func requestScreenTimeData() { Task { do { try await AuthorizationCenter.shared.requestAuthorization(for: .individual) print("Authorization successful!") // 计算过去24小时的时间范围 let endDate = Date() guard let startDate = Calendar.current.date(byAdding: .hour, value: -24, to: endDate) else { print("Failed to calculate start date") return } let dateInterval = DateInterval(start: startDate, end: endDate) // 修正筛选器配置:个人授权场景使用.current用户 let activityFilter = DeviceActivityFilter( segment: .daily(during: dateInterval), users: .current, devices: .init([.iPhone]) ) // 获取屏幕时间活动报告 let report = try await DeviceActivityCenter.shared.queryActivityReport(for: activityFilter) // 解析报告中的应用使用数据 var appUsageList = [AppUsageData]() for (activity, summary) in report.activitySummaries { guard let appActivity = activity as? ApplicationActivity else { continue // 只处理应用类型的活动数据 } let appName = appActivity.application.localizedDisplayName ?? "Unknown App" let bundleID = appActivity.application.bundleIdentifier let totalDuration = summary.totalActivityDuration let usageData = AppUsageData( appName: appName, bundleID: bundleID, usageDuration: totalDuration, dateInterval: dateInterval ) appUsageList.append(usageData) } // 将数据转为JSON字符串 let jsonEncoder = JSONEncoder() jsonEncoder.dateEncodingStrategy = .iso8601 // 指定日期编码格式 if let jsonData = try? jsonEncoder.encode(appUsageList), let jsonString = String(data: jsonData, encoding: .utf8) { print("App Usage JSON:\n\(jsonString)") // 此处可将jsonString或jsonData传递给自定义UI视图进行展示 } } catch { print("Authorization failed with error: \(error.localizedDescription)") } } }
关键说明
- 数据模型:
AppUsageData遵循Codable协议,自动支持JSON的序列化与反序列化。 - 筛选器修正:个人授权场景下,
users参数需使用.current,.all仅适用于家庭控制的多用户场景。 - 报告解析:遍历活动报告,筛选出
ApplicationActivity类型数据,提取应用名称、BundleID和总使用时长。 - JSON转换:通过
JSONEncoder将应用使用数据转为JSON字符串,可直接用于UI展示或本地存储。
内容的提问来源于stack exchange,提问作者Muhammad Ahmad
相关产品推荐
相关产品推荐

