如何使用 Xcode Targets 管理开发和生产版本?

时间:2021-11-17 08:55:40

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

如何使用 Xcode Targets 管理开发和生产版本?

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

    如何使用 Xcode Targets 管理开发和生产版本?

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选择的名称。)

如何使用 Xcode Targets 管理开发和生产版本?

  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. Spark读取HBase

      背景:公司有些业务需求是存储在HBase上的,总是有业务人员找我要各种数据,所以想直接用Spark( shell) 加载到RDD进行计算 摘要: 1.相关环境 2.代码例子 内容 1.相关环境 Spa ...

    2. [TimusOJ1057]Amount of Degrees

      [TimusOJ1057]Amount of Degrees 试题描述 Create a code to determine the amount of integers, lying in the ...

    3. LightOJ1298 One Theorem, One Year(DP + 欧拉函数性质)

      题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1298 Description A number is Almost- ...

    4. Java线程如何返回数据

      前言 当开发者从单线程开发模式过渡到多线程环境,一个比较棘手的问题就是如何在一个线程中返回数据,众所周知,run()方法和start()方法不会返回任何值. 笔者在学习<Java Network ...

    5. H3C SecPath 防火墙端口回流

      外网IP地址可以通过域名访问内外800端口网站,内网地址不可以,需要做回流 <<内网口.外网口都需要做nat映射>>定义ACL3001acl number 3001rule 0 ...

    6. NodeJs之定时器与队列

      NodeJs之定时器与队列 一,介绍与需求 1.1,介绍 定时任务(node-schedule),是针对Node.js的一种灵活的cron-like和not-cron-like作业调度程序.它允许您使 ...

    7. vim-go 安装

      vim-go 安装 https://studygolang.com/articles/3229

    8. vmware自定义网段

      vmware会自动随机给分配192.168下的一个C段作为虚拟网卡(如VMnet8)的网段. 有时我们可能不想使用随机分配的网段而想使用指定网段 注意:配置成新网段后VMware会认为所有IP都没分配 ...

    9. tensorflow serving 中 No module named tensorflow&lowbar;serving&period;apis,找不到predict&lowbar;pb2问题

      最近在学习tensorflow serving,但是运行官网例子,不使用bazel时,发现运行mnist_client.py的时候出错, 在api文件中也没找到predict_pb2,因此,后面在网上 ...

    10. map reduce 用法 str处理lower&lpar;&rpar; capitalize&lpar;&rpar;

      -- s=' l={':9}[s[0]] print(l) 取出dic里面key的元素 def normalize(name): tempn=name.lower().capitalize() ret ...