iphone - 来自一个代码库的三个略有不同的应用程序

标签 iphone ios xcode info-plist

在那里,我想要依赖三个应用程序,它们基于相同的代码:

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

  2. MyAppPreview(Beta 测试)

  3. MyApp(发布)

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

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

最佳答案

为不同版本的应用程序使用不同的目标提供了更大的灵 active ,并且一旦您为每个目标指定了不同的 plist 文件,您就可以轻松地更改包标识符和图标等。但是,这些配置与 Xcode 集成得更深入,您可以根据配置调整任何build设置

经过更多研究后,我想出了如何通过一个目标获得两全其美的方法:

  • 在 Xcode 中创建所需的配置:ProjectName > ProjectName > Info。例如:
    • 调试
    • 预览
    • 发布
  • 现在这三种配置可用于所有build设置。
  • 这三个应用程序应该在一台设备上共存。 我希望能够在一台设备上安装所有三个版本的应用程序,为此,所有三种类型都需要不同的包标识符。原始标识符可以是 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 属性执行相同的操作,以便一眼就能轻松区分该应用。

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

优势

  • 由于这三个 App 有自己的标识符,因此在 Xcode 中测试当前 App 时,您不会覆盖最新的预览版本。
  • 很好地集成到 Xcode 中并提供了高度的灵 active
    现在可以根据配置单独更改所有build设置
  • 可以通过在 Xcode 中克隆现有配置轻松添加新配置
  • 不需要额外的目标
    恕我直言,目标更适合完全不同的工件,例如具有不同代码库的库或测试目标。
  • 如果需要,可以在代码中使用这些配置。
  • 不同的服务 URLS 等可用于不同的环境。看这个great post (感谢 Jonah!)展示了如何使用一个特殊的 plist 文件来做到这一点。
  • 不使用任何难以维护的骇人听闻的脚本

缺点

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

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

  • 更新:一些应该“配置感知”的设置移动到build设置的用户定义部分,这对一些开发者来说可能感觉不寻常。

结果

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

关于iphone - 来自一个代码库的三个略有不同的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8956263/

相关文章:

ios - 图像目录中矢量 pdf 的渲染模式设置为模板,但 UIImageView 不会在自定义单元格中为图像着色

ios - (iOS,XCode 4.2)使用 Git post-commit hook 设置 bundle version 导致我的项目变成 Mac 项目

xcode - Swift 3 中的隐藏按钮

php - 从 iPhone 应用程序 -> PHP -> MySQL 保护用户密码的最佳方法是什么?

iphone - IOS 中的警报通知

javascript - 取消事务时在后续 storekit.init 上出现多个 "Cannot connect to iTunes store"消息 -Cordova/Phonegap

ios - 快速将任何对象转换为 bool 值?

ios - 我想使用框架 UIViewController 作为项目类的父类(super class)协议(protocol)

ios - 如何获取用户 didSelectRowAtIndexPath 的次数?

xcode - 如何在 Interface Builder 中向 NSTextField 的基线添加约束?