如果我在构建配置中添加了一个用户定义设置,我怎样才能在我的Objective-C代码中读取该设置?
我的项目中有两个文件,debug.plist
和release.plist
。我想让我的MainApp.m
文件根据运行的构建配置读取其中一个文件。我在Debug和Release配置中都设置了一个名为"filename"的用户定义设置,用于指向相应的文件。但我不知道如何从当前运行的配置中读取MainApp.m
文件中的文件名变量。
如果我在构建配置中添加了一个用户定义设置,我怎样才能在我的Objective-C代码中读取该设置?
我的项目中有两个文件,debug.plist
和release.plist
。我想让我的MainApp.m
文件根据运行的构建配置读取其中一个文件。我在Debug和Release配置中都设置了一个名为"filename"的用户定义设置,用于指向相应的文件。但我不知道如何从当前运行的配置中读取MainApp.m
文件中的文件名变量。
以下是我所做的事情,我不确定这是否符合您的要求:
创建您的用户定义设置,例如:
MY_LANG -> en_us
然后,在预处理宏的设置中,您可以引用该值:LANGCODE="$(MY_LANG)"
现在,您可以在所有源文件中引用LANGCODE,并且它将是您填写的自定义构建设置的内容。我知道这里有一定的间接性,但在我的情况下,这是有意为之的:我的XCode项目包含了许多不同的目标/配置,它们都有自己的预处理器宏。我不想进入所有这些内容,只是为了更改语言代码。事实上,我在项目级别上定义了语言代码。我还在一些脚本中使用MY_LANG,因此仅使用预处理器宏是不够的。可能有更聪明的方法,但这对我来说有效。你可以在运行时访问自定义的构建设置(如@JWWalker的评论所建议的)
向你的Info.plist
文件添加一个条目,并将其设置为你的用户定义的构建设置。
MySetting -> ${MYSETTING}
从代码中读取它的值
Objective-C
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"MySetting"];
[编辑] Swift
guard let mySetting =
Bundle.main.object(forInfoDictionaryKey: "MySetting") as? String
else { print("MySetting not found") }
Swift 4
假设“filename”是你在应用程序中需要的字符串。
将filename = YOUR_STRING添加到用户定义设置中(用于调试和发布)。
并将filename = $(filename)添加到info.plist中。
然后在Swift代码中:
if let filename = Bundle.main.infoDictionary?["filename"] as? String {
// do stuff with filename
}
else {
// filename wasn't able to be casted to String
}
DEBUGGING=1
,并在“Release”配置中不定义DEBUGGING。然后,在您的源代码中,您可以执行以下操作:#if DEBUGGING
use this file
#else
use the other one
#endif
$MYSETTING
。 - JWWalker我尝试了zmippie的建议,但对我来说没有起作用。
我用以下方法使其工作:
${MY_LANG}
如果还有人在寻找如何使用预处理器宏的方法,请查看Build Settings中的Apple LLVM - Preprocessing部分。在此部分下,您将看到一个名为Preprocessor Macros的部分。
这是Xcode默认插入DEBUG=1宏以进行调试构建配置的地方。
您可以在此处添加自己的宏,并为调试、发布和任何自定义构建配置提供不同的值。
要添加一个宏,请双击所需配置的当前值列表,它将显示一个漂亮的小编辑器,每行一个宏。只需添加自己的宏名称,并像DEBUG一样给它一个值即可。
可以使用#if、#ifdef等来检查这些内容,在预处理器构建阶段提供条件代码或值。
希望这能帮到您。
-D'LANGCODE=@"$(MY_LANG)"'
。请注意,该翻译保留了原文中的技术术语和代码,以便更准确地传达原意。 - Aleks N.LANGCODE=@\"$(MY_LANG)\"
。 - DanSkeelVERSION_REV=\"000000\"
感谢@DanSkeel的提示,这很有帮助。 - RobLabs