You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:10:31