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

rxztt3cl  于 2022-12-24  发布在  iOS
关注(0)|答案(4)|浏览(125)

我的iPhone应用程序连接到三个不同的服务器,例如:生产暂存测试。应用程序根据连接的服务器使用一系列配置值,例如Facebook应用程序ID、TestFlight团队密钥等。
我希望所有设置都在GIT中,并且只选择应用在编译或发布时应该使用的配置。例如,当选择testing时,Xcode中的 Product -〉Run 将运行连接到testing的应用调试版本,而 Product -〉Archive 将创建包含发布版本的IPA文件,该发布版本也连接到testing
我不想创建比调试和发布更多的构建配置(因为这意味着构建配置/运行时配置有6种不同的组合)。在我看来,理想的解决方案是我有三种方案:生产测试暂存,每个方案选择三个Info.plist文件中的一个用于应用程序。这将允许我不仅定义不同的运行时设置,而且还可以根据后端服务器的不同,使用不同的应用程序版本或包标识符。除了选择一个不同的构建配置之外,我似乎不能用任何其他方式来配置存档操作。如果可以用任何方式来实现,你有什么想法吗?

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

wa7juj8i

wa7juj8i1#

一个很好的方法是使用构建配置和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文件或其他任何地方显式定义,这意味着您需要不同的目标来更改它们。

8yparm6h

8yparm6h2#

我建议为每个环境使用不同的构建目标。我以前成功地使用过这个模型。在你的项目设置中,你可以复制当前的目标,并根据需要更改构建设置。有一个Info.plist File属性可以让你更改那个目标的默认plist。
之后,您可以为每个将使用相应目标的环境创建一个方案。
您可以更进一步,为每个目标使用不同的bundle id和不同的名称,这将允许您在同一个设备上安装过渡构建版本和生产构建版本。
这样做的唯一缺点是,当您想要更新预配配置文件时,您需要做更多的工作。

mxg2im7a

mxg2im7a3#

如果相关的库允许在代码中设置键,这意味着您可以在plist文件中拥有生产值,但在AppDelegate(或首次使用它们的任何文件)中更改它们,那么这里有一个更容易的解决方案。
目前可与facebook、twitter和google 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,我不确定这是否适用于更高版本。
5uzkadbs

5uzkadbs4#

这可能是非常低的技术,但我只有一个名为apiURL()的方法,它返回我想要的API的URL。我有localhost,stage和production,我只是取消注解我想要的那个。到目前为止,它对我来说工作得很好。我只是忘记了切换回来几次。哎呀。

相关问题