我的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。
4条答案
按热度按时间wa7juj8i1#
一个很好的方法是使用构建配置和C宏,这样可以避免为每个配置创建一个单独的目标,而这并不是目标的正确用法。
首先,您需要在项目级别设置配置:
可以为调试、企业分发和所需的任何其他类型的特殊生成创建不同的配置。
接下来,您可以为每个配置定义一些宏标志,这些宏标志将被传递给编译器。然后,您可以在编译时检查这些标志。在目标级别查找"预处理器标志"构建设置:
如果你展开三角形,你可以为你的每个配置定义不同的值,你可以在这里定义
KEY=VALUE
或者只定义KEY
宏。在代码中,可以检查这些宏是否存在或其值(如果存在)。例如:
您也可以传入字符串值,但在构建设置中必须用单引号括起来,例如
DEFAULT_LOCALIZATION_NAME='@"en"'
。您还可以使用方案编辑器配置在调试和存档期间使用的配置。如果在方案编辑器中选择"运行"或"存档",则可以选择适当的配置。
如果需要参数化Info.plist文件中的条目,可以使用自定义生成设置定义它们的值。为目标添加自定义生成设置:
然后为您的不同配置赋予适当的值:
然后,在Info. plist文件中,您可以引用此设置:
请注意,此方法的一个限制是您不能更改以下项目:
此外,在不支持资源目录的旧版本Xcode中,您无法更改以下项目:
这些不能在Info.plist文件或其他任何地方显式定义,这意味着您需要不同的目标来更改它们。
8yparm6h2#
我建议为每个环境使用不同的构建目标。我以前成功地使用过这个模型。在你的项目设置中,你可以复制当前的目标,并根据需要更改构建设置。有一个
Info.plist File
属性可以让你更改那个目标的默认plist。之后,您可以为每个将使用相应目标的环境创建一个方案。
您可以更进一步,为每个目标使用不同的bundle id和不同的名称,这将允许您在同一个设备上安装过渡构建版本和生产构建版本。
这样做的唯一缺点是,当您想要更新预配配置文件时,您需要做更多的工作。
mxg2im7a3#
如果相关的库允许在代码中设置键,这意味着您可以在plist文件中拥有生产值,但在AppDelegate(或首次使用它们的任何文件)中更改它们,那么这里有一个更容易的解决方案。
目前可与facebook、twitter和google sdk协同工作。
例如:
在Swift中也一样,只是使用#if代替#ifdef。
5uzkadbs4#
这可能是非常低的技术,但我只有一个名为
apiURL()
的方法,它返回我想要的API的URL。我有localhost,stage和production,我只是取消注解我想要的那个。到目前为止,它对我来说工作得很好。我只是忘记了切换回来几次。哎呀。