如何在iOS中使用Screen Time API实现应用时长统计与拦截功能?
iOS实现应用使用时长监控与拦截的可行方案
要实现你需要的功能,唯一合法且长期可行的方案是基于Apple官方的Screen Time框架(iOS 12+),第三方库大多因为API适配问题过时或不符合审核要求,直接使用原生框架是最优解。以下是具体实现步骤:
一、获取已安装应用及使用时长
申请Screen Time权限
首先必须获取用户授权,调用系统API发起权限请求:import ScreenTime STAuthorizationCenter.shared.requestAuthorization { granted, error in if granted { // 权限通过,后续可获取使用数据 } else { // 权限被拒,需引导用户到系统设置开启 } }同时要在
Info.plist中添加权限描述NSFamilyUsageDescription,说明应用访问Screen Time数据的用途(比如"用于监控应用使用时长,帮助你合理管理屏幕时间"),否则用户看不到授权弹窗。获取应用使用时长数据
通过STUsageManager获取指定时间范围的使用报表,解析后得到每个应用的使用时长:let calendar = Calendar.current let startOfDay = calendar.startOfDay(for: Date()) let timeRange = DateInterval(start: startOfDay, end: Date()) STUsageManager.shared.fetchReports(for: .daily, timeRange: timeRange) { reports, error in guard let reports = reports else { return } for report in reports { guard let bundleID = report.bundleIdentifier, let totalSeconds = report.totalUsageTime else { continue } // bundleID对应应用唯一标识,totalSeconds是累计使用时长(秒) print("应用 \(bundleID) 今日使用时长:\(totalSeconds/3600)小时\((totalSeconds%3600)/60)分钟") } }注意:只能获取授权后的使用数据,无法拿到授权前的历史记录。
二、实现应用时长超限拦截
Screen Time框架支持直接配置应用使用限制,达到时长上限后系统会自动拦截应用(用户打开时会显示超时提示,无法进入应用),无需手动拦截:
创建并添加时长限制规则
// 目标应用的bundleID,可通过上述使用报表获取 let targetBundleIDs = ["com.example.targetApp"] // 设置每日时长上限为1小时(单位:秒) let dailyLimit = STAppLimit( bundleIdentifiers: targetBundleIDs, category: .any, dailyDuration: 3600 ) STAppLimitManager.shared.add(dailyLimit) { error in if let error = error { print("添加限制失败:\(error.localizedDescription)") } else { print("限制规则已生效") } }监听限制状态变化
可通过通知监听限制规则的变更或触发状态:NotificationCenter.default.addObserver( forName: STAppLimit.didChangeNotification, object: nil, queue: .main ) { notification in // 限制规则发生变化,可在此更新本地状态或提示用户 }
关于你遇到的第三方库问题
screen-time-api-ios这类第三方库大概率未适配最新iOS版本的API变更(比如iOS 15+对Screen Time接口的调整),直接依赖官方框架能避免兼容性问题,也更符合App Store审核要求。
关键注意事项
- 应用功能必须明确为自我管理或家长控制,不能用于监控他人隐私,否则会被App Store拒审。
- 所有操作必须基于用户主动授权,不能绕过系统权限流程。
内容的提问来源于stack exchange,提问作者Zishan Ansari
相关产品推荐
相关产品推荐

