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

我的iPhone应用程序连接到三个不同的服务器,说: 生产分期testing 。 应用程序使用的一些configuration值取决于连接到的服务器,例如Facebook应用程序ID,TestFlight团队密钥等。

我想要GIT中的所有设置,并且只编译应用程序在编译或释放时应该使用的configuration。 例如,selecttesting时, 产品 – >在XCode中运行运行连接到testing的应用程序的debugging版本,而产品 – >归档创buildIPA文件,其发行版本也连接到testing

我不想创build比debugging和发布更多的构buildconfiguration(因为这意味着6种不同的构buildconfiguration/运行时configuration组合)。 正如我所看到的,理想的解决scheme将是我有三种scheme: 生产testing分期 ,每个schemeselect三个Info.plist文件中的一个用于应用程序。 这将使我不仅可以定义不同的运行时设置,还可以根据后端服务器定义不同的应用程序版本或捆绑标识符。 但是除了select不同的版本configuration之外,它看起来并不像我能以任何其他方式configuration存档操作。 任何想法,如果可以以任何方式实现?

编辑:为了更清楚一点, 生产/登台/testing是后端服务器,而不是iOS应用程序的版本。 iOS应用程序有两个版本: debugging/发布 。 换句话说,我可能想运行连接到生产服务器的应用程序的debugging版本,例如debugging由该服务器返回的JSON导致的崩溃。 为了清楚起见,我可以将服务器命名为A,B和C.

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

之后,您可以为每个使用相应目标的环境创build一个scheme。

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

唯一的缺点是当你想更新configuration文件时,你有更多的工作。

一个好的方法是使用构buildconfiguration和Cmacros。 这避免了必须为每个configuration创build一个单独的目标,而这个目标并不是真正正确的使用目标。

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

在这里输入图像说明

您可以创build不同的configuration,以进行debugging,企业分发以及任何其他types的特殊构build。

接下来,您可以为将要传递给编译器的每个configuration定义一些macros标志。 然后你可以在编译时检查这些标志。 在目标级别find“预处理器标志”编译设置:

在这里输入图像说明

如果展开三angular形,则可以为每个configuration定义不同的值。 您可以在这里定义KEY=VALUE或者只是KEYmacros。

在这里输入图像说明

在你的代码中,你可以检查这些macros的存在,或者它们的值(如果有的话)。 例如:

 #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 

您还可以传递string值,这些string值必须在构build设置中用单引号括起来,例如DEFAULT_LOCALIZATION_NAME='@"en"'

您也可以使用scheme编辑器configuration在debugging和存档期间使用的configuration。 如果在scheme编辑器中select“运行”或“存档”,则可以select适当的configuration。

在这里输入图像说明

如果您需要参数化Info.plist文件中的条目,则可以使用自定义构build设置来定义它们的值。 为您的目标添加自定义构build设置:

在这里输入图像说明

然后为您的不同configuration给它一个适当的值:

在这里输入图像说明

然后在Info.plist文件中可以引用这个设置:

在这里输入图像说明

请注意,这种方法的一个限制是您不能更改以下项目:

  • Settings.bundle

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

  • 的icon.png
  • 为Default.png

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

希望这可以帮助。

如果相关库允许在代码中设置键,这意味着你可以在你的plist文件中有产值,但是在你的AppDelegate(或者它们被首次使用的那个文件)中改变它们,这是一个更容易的解决scheme。

目前与Facebook,Twitter和谷歌SDK的工作。

例如:

 #ifdef DEBUG // Facebook [FBSettings setDefaultAppID:@"SandboxID"]; // Fabric / TwitterKit - must be called above [Fabric with:@[TwitterKit]]; [[Twitter sharedInstance] startWithConsumerKey:@"SandboxKey" consumerSecret:@"SandboxIDSecret"]; #endif 

同样在Swift中,只需使用#if而不是#ifdef。

关于Facebook的注意事项这与SDK的第3版一起工作,我不确定这是可能的更高版本。