如何在运行时从 InfoPlist.string 获取值?

Posted

技术标签:

【中文标题】如何在运行时从 InfoPlist.string 获取值?【英文标题】:How to get a value from InfoPlist.string at runtime? 【发布时间】:2021-06-09 11:54:36 【问题描述】:

Project/SupportingFiles/en.lproj/InfoPlist.strings我有这个值:

NSUserTrackingUsageDescription = "虚拟";

这是一个本地化 InfoPlist.strings 文件,它可以是多种语言。在这种情况下,文件夹en.lproj 是英文的。

例如,假设在编译之前我可以向NSUserTrackingUsageDescription 写入一个值,并且我需要确保它在运行时是否为“虚拟”。

如果NSUserTrackingUsageDescription 是“dummy”或其他字符串,是否可以在 Swift 运行时检查 Swift?

我正在研究,但找不到任何 Swift 代码来检查。

编辑

我尝试使用此代码:

let string = Bundle.main.infoDictionary!["NSUserTrackingUsageDescription"] as! String
    
if (string == "dummy")
     logger.debug("NSUserTrackingUsageDescription is dummy")
else
     logger.debug("NSUserTrackingUsageDescription is \(string)")

但它不起作用,因为它进入了 else 并打印了这个:

LauncherViewController.requestAppTrackingTransparencyPermission():131

NSUserTrackingUsageDescription 是虚拟的,替换为来自 InfoPlist.strings 的翻译

我不知道系统为什么将, replaced with translation from InfoPlist.strings添加到dummy

【问题讨论】:

在你的代码库中搜索 "replaced with translation from" 。具体来说,也许这个后缀是由“logger”类出于某种原因添加的 “NSUserTrackingUsageDescription 可以有多个值”,你确定吗? 您是否在此 Plist 中为“NSUserTrackingUsageDescription”添加了多个值? @JoakimDanielson 我的意思是我需要知道这个价值。如果我在那里执行一个带有 dummy 的项目,我想在那里阅读 dummy。 @ManuRaphy 阅读我之前的评论 【参考方案1】:

最好的方法是使用:

guard let string = Bundle.main.object(forInfoDictionaryKey: "NSUserTrackingUsageDescription") as? String 
    else  fatalError("not found") 

来自 Apple 的 docs:

使用此方法优于其他访问方法,因为它会在键可用时返回键的本地化值。

【讨论】:

以上是关于如何在运行时从 InfoPlist.string 获取值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时从超级视图中删除视图?

如何在运行时从 DynamoDB 获取排序结果

如何在插入时从笔式驱动器运行 .exe 文件?

如何在运行时从 JVM 中提取类文件

如何在运行时从文件中加载 HTML 模板?

c# - 如何在运行时从模块代码中获取 PowerShell 模块版本