React Native(iOS端)获取设备活跃屏幕时间的方法咨询
iOS设备活跃屏幕时间获取方案
1. 官方Screen Time API(iOS 12及以上)
这是获取系统级屏幕活跃时间的正规途径,能拿到设备上所有应用的使用数据,但必须获得用户授权。
- 步骤:
- 先在
Info.plist中添加NSUsageDescription键,明确说明请求屏幕时间权限的原因(比如"需要统计您的设备使用时长以提供个性化功能")。 - 请求授权:
import ScreenTime STAuthorizationCenter.shared.requestAuthorization { status in switch status { case .authorized: fetchScreenTimeData() case .denied, .restricted: // 提示用户前往设置开启权限 @unknown default: break } } - 获取活跃时间数据:
func fetchScreenTimeData() { let calendar = Calendar.current let startDate = calendar.startOfDay(for: Date()) let endDate = Date() let predicate = STUsageReport.predicate(for: .daily, startDate: startDate, endDate: endDate) let sortDescriptor = NSSortDescriptor(key: "startDate", ascending: true) STUsageReport.fetchReports(with: predicate, sortDescriptors: [sortDescriptor]) { reports, error in guard let reports = reports, error == nil else { return } var totalActiveTime: TimeInterval = 0 for report in reports { totalActiveTime += report.totalActiveTime } print("今日总活跃时长:\(totalActiveTime / 3600)小时") } } - 注意:该API仅能获取过去7天内的数据,且返回的是系统汇总后的结果,无法拿到实时毫秒级数据。
- 先在
2. 自行统计本应用的活跃时间
如果只需要统计自身应用的屏幕活跃时长,无需系统级权限,可通过监听应用状态变化实现:
- 核心思路:监听
UIApplicationDidBecomeActiveNotification和UIApplicationWillResignActiveNotification,记录应用进入活跃状态的时间,退到后台时计算时长并累加。 - 代码示例:
import UIKit class AppDelegate: UIResponder, UIApplicationDelegate { private var activeStartTime: Date? private var totalActiveTime: TimeInterval = 0 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { NotificationCenter.default.addObserver(self, selector: #selector(appDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(appWillResignActive), name: UIApplication.willResignActiveNotification, object: nil) return true } @objc private func appDidBecomeActive() { activeStartTime = Date() } @objc private func appWillResignActive() { guard let startTime = activeStartTime else { return } let duration = Date().timeIntervalSince(startTime) totalActiveTime += duration activeStartTime = nil print("累计活跃时长:\(totalActiveTime / 60)分钟") } }- 注意:这种方法仅能统计本应用在前台的活跃时间,无法获取其他应用或系统整体的屏幕使用情况。
3. 额外限制说明
- iOS对隐私数据获取管控严格,所有方案必须遵守Apple隐私政策,否则应用可能被拒审。
- 若需实时判断屏幕是否点亮,可结合
UIScreen.isBright属性和相关通知,但这仅能判断状态,无法直接拿到累计时长。
内容的提问来源于stack exchange,提问作者Mahed Shahzad Dogar
相关产品推荐
相关产品推荐

