在开始此教程之前,我们假设你已经完成了应用程序的开发和测试,现在准备提交生产发布。问题是,某些 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. 理解JavaScript闭包

      什么是闭包 闭包是指有权访问另一个函数作用域中的变量的函数(有点拗口吧),简单点就是在一个函数的内部创建另外一个函数,并返回这个函数的引用.(这也是创建闭包的常用方式) function outerF ...

    2. 第一个Servlet

      一,第一个Servlet的编写过程 1,建立JavaWeb应用目录 HelloServlet--web应用名称 classes:Servlet就放在此处 lib web.xml 2,classes目录 ...

    3. date 命令

      在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便.1.命令格式: date [参数] ...

    4. SQL Server调优系列进阶篇 - 深入剖析统计信息

      前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...

    5. JAVA远程执行Shell脚本类

      1.java远程执行shell脚本类 package com.test.common.utility; import java.io.IOException; import java.io.Input ...

    6. 多个UITableView横向切换的简单实现(有点类似网易新闻)

      实现多列表切换,位置监控,置顶等功能. 方法一: 创建一个TableView,在切换的时候请求各类目需要的数据,然后刷新列表,通过动画模拟出滑动效果. #import <UIKit/UIKit. ...

    7. Easyui tabs的herf和content属性

      在backstage.jsp页面中我写了一个方法,用于在指定位置添加面板(id为msg的地方)function addTab(t,h){ if($('#msg').tabs('exists',t)){ ...

    8. 包含为 HTTP 定义的状态代码的值(枚举)

      using System; namespace System.Net { // 摘要: // 包含为 HTTP 定义的状态代码的值. public enum HttpStatusCode { // 摘 ...

    9. 02_HttpClient_Get请求

      [实例1. GET请求百度(乱码)] /** * Http GET请求百度,但是返回乱码 */ public static void main(String[] args) throws Except ...

    10. Wix: Using Patch Creation Properties - Small Update

      Source Reference: wix help document  -- WiX Toolset License Using Patch Creation Properties  A patch ...