在开始此教程之前,我们假设你已经完成了应用程序的开发和测试,现在准备提交生产发布。问题是,某些 Web 服务 URLs 指向测试服务器,而 API keys 则为测试环境而配置。在提交应用程序给苹果审核之前,你需要修改所有这些 API keys 和 URLs以适应生产环境。这很正常,对吧?但是,除了将这些值在开发和生产环境之间来回更改,是否存在更好的方法来管理开发和生产版本呢?这正是笔者将与你讨论的。

下面开始我们的教程!

首先,你们中的一些人可能想知道为什么在开发应用时,要使用两个单独的数据库和环境。原因是,随着你持续不断的构建新的功能或开发应用,你想确保开发版本和现有的生产版本相互区分。标准软件开发过程旨在针对软件(在我们的案例中,即为iPhone应用)的不同版本,使用不同的环境。开发版本的应用通常使用一个不同于生产版本的数据库(或其他系统,比如分析)。这就是为什么我们应该在不同的环境中使用不同的服务器和数据库。开发人员通常在测试期间使用虚拟图像或数据。在测试或开发环境中,通常会使用一些测试数据,比如“test comment”,“argharghargh”和“one more test comment”。很明显,你可不希望真实用户看到这样的消息。如果你的应用使用了分析系统,你可能在测试阶段发送成千上万的事件。同样,你不想在同一个数据库中混合测试数据和生产数据。这就是为什么总是推荐使用相互独立的开发和生产环境。

在使用两个独立的环境时,你的应用需要一种方法来找出它应该连接的环境。一个常用的方法是在主app delegate中定义一个全局变量,将应用初始化为开发或生产模式。

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,你不能在同一个设备上安装两个应用版本。当你想在同一台设备上测试应用的开发版本,但目前仍在使用应用的生产版本时,这就非常不方便。此外,这种方法可能会意外地将应用的开发版本发布到应用商店。如果你忘了改变单一的全局变量,你就会发布错误的应用程序。笔者记得有一次在应用提交之前,忘记改变全局变量,用户获得的就是应用的开发版本。那简直是一场灾难。

在本文中,笔者将向你展示一个更好的方法,来区分开发和生产版本。具体来说,我们将在XCode中创建一个开发Target。此方法同时适用于新的,和现有的大型项目,所以你可以使用一个现有的应用程序,来学习本教程。

通过使用这种方法,应用的生产和开发版本将具有相同的基础代码,但可以有不同的图标,bundle ID,并指向不同的数据库。发布和提交过程非常简单。最重要的是,测试人员和经理可以在同一设备上,安装应用程序的两个版本,所以他们完全清楚正在测试的是哪个版本。

如何创建一个新的Target

如何在Xcode中创建一个开发Target?笔者将使用自己的模板项目“todo”,逐步演示整个过程。你可以使用自己的项目,按部就班即可:

  1. 在Project Navigator面板中找到项目设置。在Targets区域,右键单击现有target,并选择Duplicate复制现有的target。

  1. Xcode会问你,新target是否为iPad而开发。对于本教程,我们选择 “Duplicate Only”。

Note: If your project supports universal devices, Xcode will not prompt the above message.

注意:如果你的项目支持通用设备,Xcode则不会提示上述消息。

  1. 现在,我们有了一个新的target,和一个新的构建scheme,名为todo copy。让我们对它重命名,使其更容易理解。
  • Select the new target in the TARGETS list. Press Enter to edit the text and put a more appropriate name. I prefer “todo Dev”. You’re free to choose whatever name you like.
  • 在TARGETS列表中,选择新的target。按Enter键来编辑文本,选择一个更合适的名字。笔者更喜欢“todo Dev”。你可以自由选择任何你喜欢的名字。
  • Next, go to “Manage Schemes…”, select the new scheme you created in step 1 and press “Enter”. Make the scheme name the same as the new target name (which is the one you choose for the new target.)
  • 接下来,选择“Manage Schemes…”,选择你在步骤1中创建的新scheme,按下“Enter”。使scheme名称和新的target名称一样(也就是你为新target选择的名称。)

  1. 步骤4是可选的,但强烈推荐。如果你想简单的区分开发和生产版本,你应该为每个版本使用单独的图标和启动屏幕。这将使你的测试人员很清楚地知道他们正在使用哪个应用,防止你发布开发版本的应用。

    如何使用 Xcode Targets 管理开发和生产版本?的更多相关文章

    1. [HMLY]3.如何使用Xcode Targets管理开发和生产版本?

      本文原地址:http://www.appcoda.com/using-xcode-targets/ 在开始此教程之前,我们假设你已经完成了应用程序的开发和测试,现在准备提交生产发布.问题是,某些web ...

    2. 如何使用Xcode的Targets来管理开发和生产版本的构建

      如何使用Xcode的Targets来管理开发和生产版本的构建 想象一下,你已经完成了应用程序的开发和测试,现在准备提交正式版本.问题是,一些web服务的url指向了测试服务器,同时API密钥被配置用于 ...

    3. 使用Xcode的Targets来管理开发和生产版本的构建

      如何创建一个新的Target 如何在Xcode中创建一个开发的target?我使用示例项目“todo”引导您一步一步完成整个过程..您也可以使用自己的项目并按照步骤: 1. 在项目的导航面板进入项目设 ...

    4. Xcode模拟器不显示SDK版本,反而显示设备ID的解决办法

      今天在应用程序中修改了Xcode app 的名称,结果导致Xcode模拟器不显示SDK版本,反而显示设备ID了,感觉特别的忧伤......如图: 进到Xcode->window->Devi ...

    5. xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题)

      xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题) 前两天为了适配 iOS10 的系统 我将xcode 7.3 升级到了 xcode 8.0 但是 ...

    6. 设置 debug 版本签名与生产版本一致

      debug 版本使用生产版本的签名 在开发过程中,app 直接跑到手机上,用的签名文件是 Android Studio 默认的自动生成的一个签名,与生产版本的 app 签名是不一样的.当接入华为推送的 ...

    7. 前端项目中使用git来做分支和合并分支,管理生产版本

      最近由于公司前端团队扩招,虽然小小的三四团队开发,但是也出现了好多问题.最让人揪心的是代码的管理问题:公司最近把版本控制工具从svn升级为git.前端H5组目前对git的使用还不是很熟悉,出现额多次覆 ...

    8. xcode 怎么样在发布release版本的时候 不输出log

      我们平时在开发应用的时候,经常会用到 NSLog 来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理. 发布正式版的时候一定要屏蔽掉所有后台输出,因为这些输出还是比较消耗系统 ...

    9. Xcode 向6.0以后版本添加iOS开发空白模板

      打开finder,找到应用程序,找到xcode 右键显示包内容.按照如下目录进行查找:Contents ▸ Developer ▸ Platforms ▸ iPhoneOS.platform ▸ De ...

    随机推荐

    1. LeetCode里有特色的问题存档

      002* Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. F ...

    2. JavaScript 零散知识点1 (正则表达式+定时器+hover)

      1.clear:both清楚浮动影响//css中 2.正则表达式 search方法 :指明是否存在相应的匹配,如找到一个返回一个整数值,表明这个匹配距离字符串开始的偏移位置,如果没有找到匹配返回-1f ...

    3. (转)css3前缀

      CSS3的前缀是一个浏览器生产商经常使用的一种方式.它暗示该CSS属性或规则尚未成为W3C标准的一部分.看看都有哪些前缀: -webkit(chrome) -moz(firefox) -ms(ie) ...

    4. css3边框、阴影

      一.图像边框border-image 语法:border-image:border-image-source(图片)  ||  border-image-slice(裁剪位置)  ||  border ...

    5. 第五章 jQuery中的动画

      通过jQuery中的动画方法,能轻松地为网页添加精彩的视觉效果,给用户一种全新体验. 1.show()方法和hide()方法 该方法的功能与css()方法设置display属性效果相同. 给show( ...

    6. Android IntentService使用

      因为多数启动服务不必同时处理多个请求(在多线程情景下会很危险),所以使用IntentService类实现服务是很好的选择.本经验将通过继承IntentService输出当前时间教大家如何使用Inten ...

    7. linux下设置mysql数据库字符集utf8

      mysql中文乱码解决方法:将mysql数据库编码统一utf8 查看数据库编码: show variables like 'character%'; 编辑/etc/my.cnf [mysql] def ...

    8. ASP.NET在IIS7中如何更改网站的.net framework框架版本

      IIS7安装好以后使用了.net 2.0 framework框架,经过折腾发现如下方法可以更改框架版本,从而可以部署使用其他版本框架开发的网站 方法一:建立网站时设置.net框架版本 方法二:对于已经 ...

    9. VS2013开发Windows服务项目

      这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...

    10. WCF编程系列(七)信道及信道工厂

      WCF编程系列(七)信道及信道工厂   信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...