1

我有一个项目,我正在使用 fastlane 工具链来构建。

我有多个部署目标(曲棍球应用、试飞、应用商店)——对于每个部署,我都对禁用和启用某些功能感兴趣。

例如 - 当我使用 hockeyapp 的企业证书进行 alpha 构建时,我想禁用 Flurry 分析。

当我进行 beta 构建时,我想更改 app-id 和/或更改 flurry 键

我目前在 fastlane 中使用各种sed命令来搜索和替换文件等。

话虽如此,我相信还有更好的方法。

我知道在 Obj-c 中我可以#ifdef针对某些构建环境标志来启用/禁用部分代码。快速解决此问题的最佳方法是什么。

我是否使用某种自定义.plist文件或.xcconfig设置来告诉应用程序要做什么/使用什么,还是有不同的方式?

我感兴趣的事情是

  • 禁用部分代码(忽略特定配置中的某个功能)
  • 更改代码中使用的值API_KEY或类似的东西
4

3 回答 3

2

您仍然可以在 swift 中使用类似于#ifdef预处理器的东西,并且可以将其与.xcconfig可用于指定各种变量的组合。您的脚本可以生成将进入.xcconfigvars 的值。

基本设置是:

  1. 创建一个.xcconfig文件并将其与所需的构建配置相关联(在项目设置-> 信息中)。
  2. 将变量添加到.xcconfig. 例如,如果您想激活 ALPHA 构建,您可以执行以下操作IS_ALPHA_BUILD=-D ALPHA:注意-D这里是必要的。如果您希望关闭该标志,您的脚本可以将变量留空。
  3. 在目标的构建设置中,在“Swift Complier - Custom Flags”->“Other Swift Flags”下添加基于.xcconfig文件变量的标志:${IS_ALPHA_BUILD}. 如果.xcconfig设置正确,则在完成变量编辑后,您应该会看到变量的内容。
  4. 使用代码中的标志:

    #if ALPHA
        print("alpha")
    #else
        print("not alpha")
    #endif
    

我希望这会有所帮助,或者它至少会给您一个适合您的最佳方法的想法。

于 2016-01-17T00:24:59.517 回答
0

我有一个类似的概念问题。我想使用 FDD,而不是根据需要使用一种机制来禁用功能。我将尝试使用 pList。我最初的想法是在 plist 中声明所有功能并赋予它们布尔值。因此,如果需要启用某个功能,我只会在 plist 中启用它。

在编程方面,我计划将所有功能编写为带有封闭条件语句的父数据类型的扩展。因此,从控制器的角度来看,我的代码工作将减少为仅调用行为/函数。

我希望它有道理,我可能迟早会重写答案

于 2018-05-07T20:26:51.017 回答
0

我建议将可选代码放在使用扩展实现它的单独文件中。然后,您可以使用项目导航器中的文件属性启用/禁用文件。

我什至针对我在项目中有 3 个目标的单个应用程序都这样做:完整的 IOS 版本(付费)、有限的 IOS 版本(免费)和 Apple TV 版本。

我还使用相同的技术来启用/禁用在多个地方使用但仅在其中一个目标中实际工作的整个类的存根。

于 2016-01-17T04:32:35.987 回答