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

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

如果我可以简单地拥有一个脚本或基于用于编译的Scheme运行的东西,那将是多么好的。

这可能吗?

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

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

我认为msmq的答案是有效的,但你应该小心一点,以这种方式使用主要的info.plist。 这样做表明你的所有info.plist版本几乎完全相同,除了几个不同之处。 当您想要添加新的URI处理程序或后台模式或可能修改info.plist的任何其他内容时,这是一个分歧的配方,然后是难以调试的问题。

相反,我建议你从主要的info.plist中取出不同的密钥。 创建另一个plist(比如说“Config.plist”)来存储它们。 添加运行脚本构建阶段以复制正确的一个。 有关可替换的变量列表,请参阅“ 构建设置参考 ”。 示例脚本可能是:

cp ${SOURCE_ROOT}/Resources/Config-${CONFIGURATION}.plist ${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Config.plist 

然后你可以使用类似的东西读取文件(基于属性列表中的读取 ):

 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=...然后在一些头文件中我会:

 #ifndef BaseURL #define BaseURL @"http://default.example.com" #endif 

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