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

Aar*_*her 6 xcode ios

我有一些 App-Info.plist 条目需要根据我的环境进行更改。当我进行开发工作时,它们需要是一组价值观,相对于质量检查和生产。

如果我可以简单地拥有一个脚本或基于用于进行编译的方案运行的东西,那就太好了。

这可能吗?

msm*_*smq 6

您可以通过执行一些额外的步骤来做到这一点:

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


Rob*_*ier 5

我认为 msmq 的答案是有效的,但是以这种方式使用 main 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
Run Code Online (Sandbox Code Playgroud)

然后您可以使用类似以下内容读取文件(基于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
}
Run Code Online (Sandbox Code Playgroud)

当然还有其他解决方案。我个人一般使用预处理器来解决这类问题。在我的构建配置中,我将设置GCC_PREPROCESSOR_DEFINITIONS为包含BaseURL=...每个构建配置,然后在某些标头中我将拥有:

#ifndef BaseURL
#define BaseURL @"http://default.example.com"
#endif
Run Code Online (Sandbox Code Playgroud)

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