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

iOS 16 Beta 3获取设备活动数据时localizedDisplayName返回nil求助

iOS 16 Beta 3 获取应用屏幕使用时长时localizedDisplayName返回nil的问题

我正在使用iOS 16 Beta 3,尝试获取所有应用的每日屏幕使用时长。目前代码能正常获取时长与bundleIdentifier,但localizedDisplayName始终返回nil。想问有没有其他开发者遇到过相同问题?这是Beta版本的问题,还是我的代码存在错误?

我的代码:

struct TotalActivityReport: DeviceActivityReportScene {

    // Define which context your scene will represent.
    let context: DeviceActivityReport.Context = .totalActivity

    // Define the custom configuration and the resulting view for this report.
    let content: (ActivityReport) -> TotalActivityView

    func makeConfiguration(representing data: DeviceActivityResults<DeviceActivityData>) async -> ActivityReport {
        // Reformat the data into a configuration that can be used to create
        // the report's view.
        var list: [AppDeviceActivity] = []
        let totalActivityDuration = await data.flatMap { $0.activitySegments }.reduce(0, {
            $0 + $1.totalActivityDuration
        })
        for await d in data {
            for await a in d.activitySegments{
                for await c in a.categories {
                    for await ap in c.applications {
                        let appName = (ap.application.localizedDisplayName ?? "nil")
                        let bundle = (ap.application.bundleIdentifier ?? "nil")
                        let duration = (ap.totalActivityDuration)
                        let app = AppDeviceActivity(id: bundle, displayName: appName, duration: duration)
                        list.append(app)
                    }
                }
            }
        }
        
        return ActivityReport(totalDuration: totalActivityDuration, apps: list)
    }
}

问题分析与解决方案:

  1. Beta版本的已知问题
    iOS 16早期Beta版本(包括Beta 3)的DeviceActivity框架存在API不稳定情况,localizedDisplayName返回nil是其中常见的系统层面bug,后续Beta更新或正式版大概率会修复该问题。

  2. 代码兜底方案
    你的代码逻辑本身无明显错误,但可以增加兜底逻辑,通过bundleIdentifier手动获取应用名称替代:

for await ap in c.applications {
    let bundleId = ap.application.bundleIdentifier ?? "未知应用"
    // 优先使用系统返回的名称,为空则手动获取
    var appName = ap.application.localizedDisplayName ?? ""
    
    if appName.isEmpty {
        if let appBundle = Bundle(identifier: bundleId) {
            // 依次尝试获取本地化显示名称、默认显示名称、Bundle名称
            appName = appBundle.localizedInfoDictionary?["CFBundleDisplayName"] as? String
                ?? appBundle.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
                ?? appBundle.object(forInfoDictionaryKey: kCFBundleNameKey as String) as? String
                ?? bundleId
        } else {
            appName = bundleId
        }
    }
    
    let duration = ap.totalActivityDuration
    let app = AppDeviceActivity(id: bundleId, displayName: appName, duration: duration)
    list.append(app)
}
  1. 权限确认
    确保应用已正确获取Screen Time权限,无权限时DeviceActivity部分字段可能无法正常返回。可在系统设置中检查应用权限状态,或在代码中增加权限校验逻辑。

内容的提问来源于stack exchange,提问作者Tarık Yılıkoğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:36:21