如何配置的XCode组独立的运行时设置(How to configure independent s

2019-06-24 06:10发布

我的iPhone应用程序连接到三个不同的服务器上,说: 生产分期测试 。 有该应用程序依赖于哪个服务器它连接到,例如Facebook的应用程序ID,团队TestFlight键等使用配置值的一堆

我想在GIT的所有设置,并只选择其中的配置应该编译或释放时使用的应用程序。 例如,在选择测试时, 产品展示- > XCode中运行运行的应用程序连接到测试产品的调试版本- >创建归档与也连接到测试发行版本的IPA文件。

我不想创造更多的生成配置比调试和释放(因为这将意味着6个不同的生成配置/运行时配置的组合)。 理想的解决方案,在我看来,将是我有三个方案: 生产测试应用 ,以及每个方案选择三个文件的Info.plist与应用程序使用一个。 这将使我不仅定义不同的运行时设置,而且不同版本的应用程序或包标识符取决于后端服务器上。 不过,这并不像我除了选择不同的构建配置配置以任何其他方式存档动作。 如果任何想法可以以任何方式来实现?

编辑:要使它有点更清晰, 生产/分期/测试是后端服务器,而不是iOS的应用程序的版本。 在iOS应用有两个版本: 调试/释放 。 换句话说,我可能要运行连接到生产服务器例如调试所造成的JSON崩溃从服务器返回的应用程序的调试版本。 我可能把服务器为A,B和C为清楚起见。

Answer 1:

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

在此之后,你可以为每个将使用根据目标环境的方案。

你可以得到进一步的一步,使用不同的捆绑ID为每个目标和不同的名称。 这将允许您同时安装分期和生产建立例如在同一设备上。

在这唯一的缺点是,你有更多的工作,当你想更新配置文件。



Answer 2:

要做到这一点的一个好方法是与构建配置和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

您可以在字符串值传递为好,这必须在构建设置,如单引号包裹DEFAULT_LOCALIZATION_NAME='@"en"'

您还可以配置哪些配置过程中使用方案编辑器,调试和存档时使用。 如果您在方案编辑器中选择“运行”或“归档”,您可以选择适当的配置。

如果你需要在参数的Info.plist文件条目,则可以使用自定义生成设置定义自己的价值。 添加自定义生成设置你的目标:

然后给它为不同的配置适当的值:

然后在Info.plist文件,你可以参考此设置:

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

  • Settings.bundle

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

  • 的icon.png
  • 为Default.png

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

希望这可以帮助。



Answer 3:

这里有一个更容易的解决方案,如果有关库允许设置的按键代码,这意味着你可以在你的plist文件产值,但改变它们在你的AppDelegate(或任何他们第一次使用文件)。

工程与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

在斯威夫特一样,只是使用#如果不是#ifdef来的。

注意关于Facebook这个工作与他们的SDK第3版,我不知道这是可能的更高版本。



Answer 4:

这可能是非常低技术含量,但我只是有一个名为方法apiURL()返回我想要的API的URL。 我有本地主机,分期和生产,我简单地取消对一个我想要的。 到目前为止,它的工作很适合我。 我只是忘了几次切换回来。 哎呀。



文章来源: How to configure independent sets of runtime settings in XCode