如何在XCode中配置独立的运行时设置集

Gre*_*reg 57 iphone configuration xcode runtime ios

我的iPhone应用程序连接到三个不同的服务器,例如:生产,登台测试.应用程序使用了一堆配置值,具体取决于它连接到哪个服务器,例如Facebook App ID,TestFlight团队密钥等.

我想在GIT中进行所有设置,并且只选择应用程序在编译或发布时应该使用的配置.例如,选择测试时,产品 - >在XCode中运行运行连接到测试的应用程序的调试版本,产品 - >存档创建具有也连接到测试的发布版本的IPA文件.

我不想创建比调试和发布更多的构建配置(因为这意味着构建配置/运行时配置的6种不同组合).我认为,理想的解决方案是我有三种方案:生产,测试登台,每个方案选择三个Info.plist文件中的一个用于应用程序.这将允许我不仅定义不同的运行时设置,还根据后端服务器定义不同的应用程序版本或包标识符.但是,除了选择不同的构建配置之外,我看起来不能以任何其他方式配置存档操作.任何想法,如果可以以任何方式实现?

编辑:为了使它更清晰,生产/暂存/测试是后端服务器,而不是iOS应用程序的版本.iOS应用程序有两个版本:debug/release.换句话说,我可能想运行连接到生产服务器的应用程序的调试版本,例如调试由该服务器返回的JSON引起的崩溃.为了清楚起见,我本可以将服务器命名为A,B和C.

Mik*_*ler 112

执行此操作的好方法是使用构建配置和C宏.这避免了必须为每个配置创建单独的目标,而这些目标并不是对目标的正确使用.

首先,您要在项目级别设置配置:

在此输入图像描述

您可以为调试,企业分发以及所需的任何其他类型的特殊构建创建不同的配置.

接下来,您可以为将传递给编译器的每个配置定义一些宏标志.然后,您可以在编译时检查这些标志.在目标级别找到"预处理程序标志"构建设置:

在此输入图像描述

如果展开三角形,则可以为每个配置定义不同的值.您可以在此处定义KEY=VALUE或仅定义KEY宏.

在此输入图像描述

在您的代码中,您可以检查这些宏的存在性或它们的值(如果有的话).例如:

#ifdef DISABLE_FEATURE_X
    featureXButton.hidden = YES;
#endif

// ...

#if FOOBAR_VISIBLE == 0
    foobarView.hidden = YES;
#elif FOOBAR_VISIBLE == 1
    foorbarView.hidden = NO;
#else
    #error Invalid value for FOOBAR_VISIBLE
#endif
Run Code Online (Sandbox Code Playgroud)

您也可以传入字符串值,这些值必须在构建设置中用单引号括起来,例如DEFAULT_LOCALIZATION_NAME='@"en"'.

您还可以使用Schemes编辑器配置在调试和存档时间内使用的配置.如果在"方案"编辑器中选择"运行"或"存档",则可以选择适当的配置.

在此输入图像描述

如果需要参数化Info.plist文件中的条目,可以使用自定义生成设置定义其值.为目标添加自定义构建设置:

在此输入图像描述

然后为您的不同配置赋予适当的值:

在此输入图像描述

然后在Info.plist文件中,您可以引用此设置:

在此输入图像描述

请注意,此方法的一个限制是您无法更改以下项目:

  • Settings.bundle

此外,在没有资产目录支持的旧版Xcode中,您无法更改以下项目:

  • 的icon.png
  • 为Default.png

这些不能在Info.plist文件或其他任何地方明确定义,这意味着您需要不同的目标来更改它们.

希望这可以帮助.

  • 构建配置的设计正是考虑到这个用例.您有不同的应用配置,您可以选择更改特定配置的特定设置.我不知道你想要实现这个目标.添加多个目标要复杂得多.您最终得到了重复的配置设置和Info.plist值.你给出的六个例子也很混乱."生产调试"有点矛盾. (6认同)
  • 你总是可以*使用这种方法改变每个配置的`CFBundleIdentifier`和`CFBundleDisplayName`.现在,使用资产目录,您也可以更改应用程序图标并按配置加载图像.没有理由再使用单独的目标了.OP对"调试"和"释放"的限制是任意的,并且排除了使用最佳解决方案来解决问题.避免其他配置只会将复杂性移到其他地方; 你必须复制设置并重复自己的地方,而不是@ mike-weller提出的建议. (4认同)
  • 这可以在Swift中完成吗?目标下只有Apple LLVM编译器>预处理器宏,而不是项目级别 (3认同)

adi*_*dig 10

我建议为每个环境使用不同的构建目标.我之前成功使用过这个模型.在项目的设置中,您可以复制当前目标并根据需要更改构建设置.有一个Info.plist File属性可以让你更改该目标的默认plist.

之后,您可以为将使用相应目标的每个环境创建一个方案.

您可以更进一步,为每个目标和不同的名称使用不同的包ID.这将允许您在同一设备上安装分段和生产版本.

唯一的缺点是,当您想要更新配置文件时,您还有更多工作要做.

  • 目标应该只用于不同的产品.如果您使用不同的配置或设置构建相同的概念产品,则使用目标并不是最佳解决方案. (20认同)
  • @MikeWeller我不同意.正如我所说,我之前使用过这种技术没有任何问题.你显然没有提到任何缺点或真正的替代方案.你评论的重点是什么? (3认同)
  • 目标是分离测试构建的更好主意,因为您可以拥有不同的 AppID,从而允许它们与生产构建一起运行。 (2认同)
  • 如果您参数化`CFBundleIdentifier`,您*可以*在设备上同时安装应用程序的每个不同配置。事实上,@mike-weller 在他的回答中恰恰表明了这一点。您可以有不同的显示名称。使用资产目录的较新 Xcode,您可以拥有不同的应用程序图标。你可以用多个目标完成的一切,现在你可以用一个目标完成,让事情更加干燥。 (2认同)