如何根据我的Scheme更改.plist条目?

时间:2014-12-18 14:10:08

标签: ios xcode

我有一些App-Info.plist条目需要根据我的环境进行更改。当我从事发展工作时,他们需要成为一组价值观,而不是QA与生产。

如果我可以简单地使用基于用于编译的Scheme运行的脚本或其他内容,那将是多么好。

这可能吗?

2 个答案:

答案 0 :(得分:2)

您可以通过执行一些额外步骤来完成此操作:

  1. 以任何名称复制[AppName] -Info.plist文件。示例:[AppName] -Info-dev.plist或[AppName] -Info-staging.plist等
  2. 在App的目标设置中映射新创建的.plist文件。从以下截图中获取想法: enter image description here
  3. 最后,如果你想从.plist文件中获取一些条目,那么你需要得到它:[[[NSBundle mainBundle] infoDictionary] objectForKey:@“baseUrl”]
  4. 项目设置将自动选择正确的.plist文件并为您提供所需的值。

答案 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方式可能更清晰,更容易,特别是如果它们很长或很复杂(当然如果它们需要引用的话)。预处理器解决方案需要较少的代码来处理并且具有较少的故障模式(因为字符串在编译时嵌入在二进制文件中而不是在运行时读取)。但两者都是很好的解决方案。