5

我正在开发一个 iOS 应用程序,该应用程序应该被标记给不同的客户。手头的问题是我需要同时安装两个版本的应用程序(一个带有橙色主题,一个带有红色主题)。实现这一目标的最佳方法是什么?

4

4 回答 4

9

您只需要使用两个不同的包标识符。这可以在 info.plist: 中设置CFBundleIdentifier。您可能想要设置使用不同版本的 info.plist 的不同目标或方案。

于 2013-10-31T15:56:18.117 回答
4

我更喜欢在不维护两个单独的 plist 文件的情况下执行此操作,方法是在“存档”操作的自定义“预操作”构建脚本中对 plist 文件进行后处理。

这有助于避免有人在更改某些内容时忘记更新两个 plist 文件的问题。

我使用这种机制来构建可以上传到 TestFlight 的应用程序的测试版本,以便我的测试人员可以同时安装实时版本和当前测试版本。

(注意:虽然这个脚本在“Pre-actions”部分,但它实际上是一个后处理步骤,因为它发生在 XCode 完成所有变量替换到 plist 文件之后)

要进行设置(这些说明适用于 XCode 5.0.1),请复制您现有的方案并将其命名为适当的名称。

选择“编辑方案”,然后展开左侧选项卡中的“存档”项。这应该为您提供“Pre-actions”、“Archive”和“Post-actions”子项。单击“Pre-actions”之一,然后在右侧选项卡中,单击底部的“+”以添加新的“Run Script Action”。

我将 Ruby 用于构建脚本,因此我在顶部的“Shell”框中输入“/usr/bin/ruby”,但显然您可以在 bash 或类似的程序中执行相同的操作。

在“从...提供构建设置”下拉菜单中选择您的项目。

然后您可以将以下代码的一些变体粘贴到底部的框中​​(或将其放入文件中,然后将文件拖到框中):

def changeBundle(file)
    oldId = `/usr/libexec/Plistbuddy -c "print :CFBundleIdentifier" #{file}`.strip
    system("/usr/libexec/PlistBuddy -c \"Set :CFBundleIdentifier #{oldId}_test\" #{file}")

    oldName = `/usr/libexec/Plistbuddy -c "print :CFBundleDisplayName" #{file}`.strip
    system("/usr/libexec/PlistBuddy -c \"Set :CFBundleDisplayName #{oldName}-Test\" #{file}")
end

changeBundle("#{ENV['CODESIGNING_FOLDER_PATH']}/Info.plist")

这会更新 CFBundleIdentifier(添加“_test”)和 CFBundleDisplayName(添加“-Test”),以便应用程序明显不同。自定义以进行您需要的任何更改。

更改文件的代码在函数中的原因是,如果需要,可以很容易地对多个 plist 文件进行相同的更改。

在这种情况下您不需要这样做(因为您可能只想更改输出存档文件中的内容),但是我的其他一些构建脚本会自动更新版本号,我希望将这些更改签入 git . 如果你需要做那种事情,你也可以通过在底部添加这个来修改源 plist 文件:

changeBundle("#{ENV['PROJECT_DIR']}/#{ENV['INFOPLIST_FILE']}")
于 2014-03-05T13:06:13.593 回答
0

为同一个项目设置两个不同的目标。然后,在每个目标中定义您在代码中使用的预处理器宏,以区分您的应用程序的版本。例如,您可以拥有:

if (FREE_VERSION == true) {
    ...
}
else {
    ...
}
于 2013-10-31T15:56:26.180 回答
0

您必须为每个目标创建两个具有不同捆绑标识符的目标。

于 2013-10-31T16:03:01.503 回答