我有一些App-Info.plist条目需要根据我的环境进行更改。当我从事发展工作时,他们需要成为一组价值观,而不是QA与生产。
如果我可以简单地使用基于用于编译的Scheme运行的脚本或其他内容,那将是多么好。
这可能吗?
答案 0 :(得分:2)
您可以通过执行一些额外步骤来完成此操作:
答案 1 :(得分:2)
我认为msmq的答案是有效的,但是你应该小心一点,以这种方式使用主要的info.plist。这样做表明你的所有info.plist版本几乎完全相同,除了一些差异。当您想要添加新的URI处理程序或后台模式或可能修改info.plist的任何其他内容时,这是一个分歧的配方,然后是难以调试的问题。
相反,我建议你从主要的info.plist中取出不同的密钥。创建另一个plist(说" Config.plist")来存储它们。添加运行脚本构建阶段以复制正确的一个。请参阅Build Settings Reference以获取可替换的变量列表。示例脚本可能是:
cp ${SOURCE_ROOT}/Resources/Config-${CONFIGURATION}.plist ${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Config.plist
然后你可以使用类似的东西(基于Read in the Property List)读取文件:
NSString *baseURL;
NSString *path = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
NSString *errorDesc = nil;
NSDictionary *dict = (NSDictionary *)[NSPropertyListSerialization
propertyListFromData:plistXML
mutabilityOption:NSPropertyListImmutable
format:NULL
errorDescription:&errorDesc];
if (dict != nil) {
baseUrl = dict[@"baseURL"];
} else {
NSAssert(@"Could not read plist: %@", errorDesc); // FIXME: Return error
}
当然还有其他解决方案。我个人通常使用预处理器来解决这类问题。在我的构建配置中,我会为每个构建配置设置GCC_PREPROCESSOR_DEFINITIONS
以包含BaseURL=...
,然后在某些标题中我会:{/ p>
#ifndef BaseURL
#define BaseURL @"http://default.example.com"
#endif
如果你有几件事需要设置,那么plist方式可能更清晰,更容易,特别是如果它们很长或很复杂(当然如果它们需要引用的话)。预处理器解决方案需要较少的代码来处理并且具有较少的故障模式(因为字符串在编译时嵌入在二进制文件中而不是在运行时读取)。但两者都是很好的解决方案。