如何在Swift中通过Screen Time API获取应用使用时长?
能否通过Screen Time API获取应用使用时长?如何用Swift实现?
可以通过Apple的Screen Time API获取应用使用时长,该API从iOS 13开始提供,支持获取设备上各类应用的使用统计数据。以下是Swift中的实现步骤:
1. 配置项目权限
首先需要在Info.plist中添加权限描述,否则无法请求用户授权:
- 添加键
NSFamilyUsageDescription,值填写你的应用需要访问Screen Time数据的原因(例如:"需要统计应用使用时长以帮助你合理规划屏幕使用时间")
2. 请求Screen Time授权
在使用API前必须先请求用户授权,示例代码如下:
import ScreenTime func requestScreenTimeAuthorization() { STAuthorizationCenter.shared.requestAuthorization { status in switch status { case .authorized: // 授权成功,可开始获取数据 fetchAppUsageData() case .denied, .restricted: // 授权失败,提示用户开启权限 print("Screen Time授权被拒绝或受限") @unknown default: print("未知授权状态") } } }
3. 获取应用使用时长数据
授权成功后,可通过STUsageReport获取指定时间范围内的应用使用数据:
func fetchAppUsageData() { // 设置时间范围:例如过去24小时 let endDate = Date() guard let startDate = Calendar.current.date(byAdding: .hour, value: -24, to: endDate) else { print("无法计算起始时间") return } let usageReport = STUsageReport(dateInterval: DateInterval(start: startDate, end: endDate)) usageReport.fetchReports { reports, error in if let error = error { print("获取使用数据失败:\(error.localizedDescription)") return } // 遍历数据,提取应用包名和使用时长 reports?.forEach { report in guard let bundleID = report.bundleIdentifier, let usageTime = report.totalUsageTime else { return } // 将秒转换为更易读的格式(时:分:秒) let hours = Int(usageTime) / 3600 let minutes = (Int(usageTime) % 3600) / 60 let seconds = Int(usageTime) % 60 print("应用:\(bundleID),使用时长:\(hours)h \(minutes)m \(seconds)s") } } }
注意事项
- 该API仅支持iOS 13及以上版本,需在项目部署目标中设置最低版本为iOS 13.0
- 必须在真机上测试,模拟器可能无法正常获取Screen Time数据
- 用户可以随时在系统设置中关闭Screen Time权限,需处理授权状态变化的情况
内容的提问来源于stack exchange,提问作者Deepak ravi
相关产品推荐
相关产品推荐

