2013-10-31 213 views
4

我正在开发一个iOS应用程序,该应用程序应该被标记为不同的客户。目前的问题是我需要两个版本的应用程序(一个用橙色主题,另一个用红色主题)同时安装。完成此操作的最佳方法是什么?安装两个版本的相同iOS应用程序

回答

8

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

+0

简单而有效,谢谢! – user1354603

0

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

if (FREE_VERSION == true) { 
    ... 
} 
else { 
    ... 
} 
+1

这将不允许您在设备上并行安装应用程序。 – FelixLam

+0

是的,你可以在你的设备上有不同的版本。我可以告诉你,因为这是我处理同一应用的免费和高级版本的方式。 –

+0

你可能也会在info.plists中使用不同的'CFBundleIdentifier'值。也许这取决于变量'FREE_VERSION'。 – FelixLam

0

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

+1

你不需要有单独的目标。这可能会帮助您进行开发,但对于此设置不是必需的。 – FelixLam

4

我更喜欢在没有维护两个单独的plist文件的情况下通过在“存档”操作的自定义“Pre-actions”构建脚本中对plist文件进行后处理。

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

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

(注:虽然这个剧本要“预动作”一节中,这是一个真正的后处理步骤,因为它发生的XCode已经做了所有的变量替换后进入plist文件)

设置(这些说明适用于XCode 5.0.1),重复您现有的方案并将其称为适当的。

选择“编辑方案”,并展开左侧选项卡中的“存档”项目。这应该给你“预先行动”,“存档”和“后行动”子项目。点击“预先操作”之一,然后在右侧的选项卡中,点击底部的“+”以添加新的“运行脚本操作”。

我在我的构建脚本中使用Ruby,所以我在顶部的“Shell”框中输入“/ usr/bin/ruby​​”,但显然你可以在bash或类似的地方做同样的事情。

在“Provide build settings from ...”下拉列表中选择您的项目。

然后你就可以在底部的框下面的代码的一些变种粘贴(或把它放在一个文件,并将该文件拖动到箱):

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']}") 
+1

我知道这个评论是在一年前,但如果你碰巧看到我的评论,你能否详细说明一下使用这种方法的细节?我假设你必须为你的_test包ID创建一个新的App ID和关联的配置文件?另外,我希望了解有关更新版本号的构建脚本的更多信息。在构建阶段的什么时候你运行这些? – mbeaty

+0

我使用这种方法为本地开发创建了一个-Dev版本,这样我就可以测试我的应用程序的空状态而不删除我在生产版本中使用的所有个人数据。 – astromme

相关问题