我正在开发一个 iOS 应用程序,该应用程序应该被标记给不同的客户。手头的问题是我需要同时安装两个版本的应用程序(一个带有橙色主题,一个带有红色主题)。实现这一目标的最佳方法是什么?
4 回答
您只需要使用两个不同的包标识符。这可以在 info.plist: 中设置CFBundleIdentifier
。您可能想要设置使用不同版本的 info.plist 的不同目标或方案。
我更喜欢在不维护两个单独的 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']}")
为同一个项目设置两个不同的目标。然后,在每个目标中定义您在代码中使用的预处理器宏,以区分您的应用程序的版本。例如,您可以拥有:
if (FREE_VERSION == true) {
...
}
else {
...
}
您必须为每个目标创建两个具有不同捆绑标识符的目标。