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) } }
问题分析与解决方案:
Beta版本的已知问题
iOS 16早期Beta版本(包括Beta 3)的DeviceActivity框架存在API不稳定情况,localizedDisplayName返回nil是其中常见的系统层面bug,后续Beta更新或正式版大概率会修复该问题。代码兜底方案
你的代码逻辑本身无明显错误,但可以增加兜底逻辑,通过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) }
- 权限确认
确保应用已正确获取Screen Time权限,无权限时DeviceActivity部分字段可能无法正常返回。可在系统设置中检查应用权限状态,或在代码中增加权限校验逻辑。
内容的提问来源于stack exchange,提问作者Tarık Yılıkoğlu
相关产品推荐
相关产品推荐

