【问题标题】:Three slightly different Apps from one code base来自一个代码库的三个略有不同的应用程序
【发布时间】:2012-02-15 21:29:09
【问题描述】:

我想拥有三个基于相同代码的应用程序:

  1. MyAppDevelopment(从部署到设备的 Xcode 构建)

  2. MyAppPreview(Beta 测试)

  3. MyApp(发布)

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

现在我知道我可以拥有三个不同的目标及其各自的Info.plist 文件,但我宁愿使用 Xcode 的配置,这样我就不必维护三个不同的目标。这是否可以使用配置,问题是App标识符存储在Info.plist文件中,可以按目标定义...

【问题讨论】:

    标签: iphone ios xcode info-plist


    【解决方案1】:

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

    我基于this Tutorial 创建了一个要点,并对其进行了一些扩展。我在各种项目中使用它并且对它非常满意。

    我所做的一个主要补充是定义主环境的能力,如果没有找到值,它将用作其他环境的后备。

    请查看 Readme.md 了解如何设置整个内容的详细说明。

    https://gist.github.com/2782045

    【讨论】:

      【解决方案2】:

      为不同版本的应用程序使用不同的目标提供了更大的灵活性,并且一旦您为每个目标指定不同的 plist 文件,您就可以轻松更改捆绑标识符和图标等。不过,这些配置与 Xcode 的集成度更高,您可以根据配置调整任何 build setting

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

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

        • 要实现这一点,请转到MyProject > MyApp (Target) > Build settings 并单击按钮(+) Add Build Setting
        • 添加新键${APP_ID} 并设置如下值,注意release 配置不应有后缀:

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

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

      优势

      • 由于这三个应用程序都有自己的标识符,因此在 Xcode 中测试当前应用程序时,您不会覆盖最新的预览版本。
      • 很好地集成到 Xcode 中并提供高度灵活性
        现在可以根据配置单独更改所有构建设置
      • 可以通过克隆 Xcode 中的现有配置轻松添加新配置
      • 无需其他目标
        恕我直言,目标更适合完全不同的工件,例如具有不同代码库的库或测试目标。
      • 如果需要,可以在代码中使用这些配置。
      • 不同的服务 URL 等可以用于不同的环境。请参阅此 great post(感谢 Jonah!),它展示了如何使用特殊的 plist 文件执行此操作。
      • 不使用任何难以维护的 hacky 脚本

      缺点

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

      • 更新:您不能对用户定义的构建设置使用 com.company.${PRODUCT_NAME:rfc1034identifier} 之类的替换。因此,在这种情况下,您必须写出整个捆绑包标识符。

      • 更新:一些应该“配置感知”的设置移动到构建设置的用户定义部分,这可能会让一些开发人员觉得不寻常。

      结果

      Result http://i.minus.com/jbwPgEiBra39dL.png

      【讨论】:

      • 干得好!但是您是否检查了您的发布包标识符。是“com.company.MyApp”还是“com.company.MyApp-”?
      • 请注意,除了使用值com.company.MyApp-debug,您还可以像这样替换配置名称:com.company.MyApp-${CONFIGURATION}
      • 任何帮助确定我的构建在哪里中断,因为只有发布版本(没有更改捆绑标识符)在工作......
      • @ganders 你可以检查我的要点(见my answer below)。如果您按照以下步骤操作,这可能会对您有所帮助...
      【解决方案3】:

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

      我的一些同事采用了另一种方法,它允许您使用 Xcode 配置来确定应用程序的环境,但我认为这不允许您更改应用程序标识符:http://blog.carbonfive.com/2011/06/20/managing-ios-configurations-per-environment-in-xcode-4/

      【讨论】:

      • 这是一篇很棒的博文。我目前将所有服务器 URL 放在一个文件中,我真的很喜欢将它们放在 plist 文件中的想法,并且能够为每个配置提供一个字典。我现在还设法根据配置更改应用标识符和图标。详情见我的回答。
      【解决方案4】:

      如果您希望同时在设备上安装所有三个应用程序,那么您只需必须使用三个单独的标识符 = 三个目标及其 info.plist。

      我真的不认为在一个项目中“维护”三个单独的目标存在问题。 我一直这样做(尽管有两个目标)。它实际上是一个非常 优雅的解决方案。

      【讨论】:

      • 我喜欢使用配置的想法,因为所有构建设置都可以根据这些配置进行更改,所以如果我有配置和目标,我会突然有一个配置与目标的大矩阵。所以我宁愿只使用配置并使用“更多不同”的人工制品(如单元测试或库等)的目标。
      • 我明白你的意思。但我不认为 - 希望有人会证明我错了 - 你将能够避免使用目标。例如,3 个不同的图标也意味着 3 对图标文件——每对都有自己的“目标会员”Jonahs 链接也很有趣。最后,您可能必须决定一种方法并坚持下去。我一定会关注你的问题的讨论。
      • 我只用配置就做到了。 Check it out
      • 问题是:配置是正确的方式,但 Apple 不喜欢它们,并且拒绝让 Xcode 正确支持它们(正如您已经注意到的,您必须解决 Xcode 错误)。从长远来看,Apple 几乎肯定会再次更改/破坏/删除配置(他们在从 Xcode 3 到 Xcode 4 时这样做:立即破坏了数千个完全合法但“Apple 不喜欢它”的代码库)。我们中的很多人之前都被烧死了,并且学会了走阻力最小的路线:接受苹果的解决方案(即使它是一个糟糕的解决方案)
      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 2013-06-18
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多