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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:27:22