一些初学者可能会好奇,为什么在开发应用的时候我们需要用两套隔离的数据库和环境。这是因为在你持续地开发应用或增加新特性的时候,可能希望将开发版本和已经存在的生产版本的应用进行区分。标准的开发实践是针对不同版本的软件使用不同的环境,而对我们来说,这个软件就是 iPhone 应用。一般来讲,开发版应用使用的数据库(或其它系统,比如说统计分析系统)应该与生产版应用进行区分。在测试或者开发环境中,我们经常使用到类似 “test comment”, “argharghargh” 和 “one more test comment” 这样的测试数据。很显然,我们并不想让真实的用户看到这样的信息。如果应用使用了统计分析系统,在测试阶段我们可能会发送成千上万次的统计事件。我们当然也不想让这样的数据跟真实的统计数据混在一起。这就是为什么我们应该区分开发环境和生产环境。
当使用不同的环境开发时,应用需要知道它当前使用的环境。一种通用的做法是在程序的 AppDelegate 中定义一个可以将应用初始化为开发或者生产模式的全局变量。
enum environmentType { case development, production } let environment:environmentType = .production switch environment { case .development: // set web service URL to development // set API keys to development print("It's for development") case .production: // set web service URL to production // set API keys to production print("It's for production") } |
这种方法要求我们在切换环境的时候改变全局变量的值。虽然这种方法很方便也很快捷,但是它存在很大的局限性。首先,因为在开发与生产环境中都使用了同一个 bundle ID,我们就不能在同一个设备上同时安装应用的不同版本。再者,这种方法有可能导致我们不小心把开发版本的应用提交到 App Store 上。如果忘记切换全局变量的值,我们就会提交错误版本的应用。我曾经就有一次在提交应用之前忘记改变全局变量的值,结果用户就使用到了我的开发版本。这实在是太糟糕了。
在本篇文章中我将会展示一种更好的方法来区分开发和生产的构建版本。更确切地来说,我们将会在 Xcode 中创建一个开发版的 target。这个方法同时适用于新建的或现存的大型项目,所以你可以使用一个现有的项目来跟着这个教程进行实践。
使用这种方法,生产版和开发版的应用都会使用同一套基础代码,但是可以有不同的图标、bundle ID 以及不同的数据库。分发和提交应用的过程也会十分简单。更重要地,应用的测试人员和管理人员可以在同一个设备上同时安装应用的两个版本,这样他们就可以更加清楚地了解他们现在试用的是哪一个版本。
如何创建新的 Target
那么我们如何在 Xcode 当中新建一个开发版的 target 呢?我会使用我提供的示例项目 “todo” 来一步一步地进行演示。你可以使用自己的项目,并跟随这些步骤进行操作:
-
在 Project Navigator 面板上选择项目,进入设置。在 Targets 小节下面,右击现有的 target 并且选择
Duplicate
来对一个现在的 target 进行复制。 -
Xcode 会询问你这个 target 是不是针对于 iPad 开发的。对于本教程来说,我们只需要选择 “Duplicate Only” 就可以了。
提示:如果你的项目支持通用设置,则 Xcode 不会提示上面的消息。
-
现在我们有了一个名为
todo copy
的新 target 和构建 scheme 。让我们来重命名一下以便于区分。 -
这一步是可选的,不过我强烈建议进行这一步。如果想让开发版跟生产版的应用更加容易区分,我们应该提供不同的应用图标和启动界面。这可以使测试更加清楚他们现在使用的版本,并且可以防止我们提交开发版本的应用到商店中。