使用多个Target去管理项目版本环境
在实际开发中,为了保证所开发的产品能够尽量完美上线,在上线前会特意测试几轮,保证所开发的应用没有问题。据此,在实际的开发过程中,往往需要区分测试环境和线上环境,在Android开发中,可以通过gradle脚本来识别,并在代码中体现出来。 在ios开发中,如果一个包需要同时包含debug和线上的relase环境,则需要打两个.a文件,然后合并在一起。
除了上述情况之外,有一些App还分为专业版与普通版,而专业版与普通版的区别在于一些功能的有无,对于这样的需求,难道要专门去独立出来两个项目吗?如果要是专门去独立出来两个项目,那以后迭代的话,两个项目都得同时去迭代,工作量是如此浩大,而单一的去copy也不是设计中的一个好的方法。这个时候就用到了Target。
定义
首先,看一下苹果官方文档是对于Target的定义。
A target specifies a product to build and contains the instructions for
building the product from a set of files in a project or workspace. A
target defines a single product; it organizes the inputs into the build
system—the source files and instructions for processing those source
files—required to build that product. Projects can contain one or more
targets, each of which produces one product.
含义也很简单,它是一个项目环境的设置文件,一个Target定义了一个单一项目环境,在一个项目工程中可以包含一个或者多个Target。也就是说一个项目中可以设置多种环境。
使用
创建Target的方式有两种:
- 直接copy之前项目中的Target配置;
- 创建新的Target配置;
步骤一:创建Target
在工程中对已存在的target进行复制,点击Duplicate即可。
创建一个新的Target,可以使用下面的方法。
创建新的target
选择Single APP
步骤二:更改Target的名称
创建完Target以后你会发现名字后面有个copy的字样,顿时觉得业余的不行有没有?此时我们可以通过下面的方法进行名字的修改。
步骤三:添加不同Target下的应用图标
为了满足不同环境图标的需求,可以提高两套图片,然后按照如下的方式配置。
然后,根据不同的环境配置不同的图标地址。
步骤四:配置全局宏
配置全局宏,目的是在代码中进行环境的区分。
而在代码中也需要区分开来,不同的环境加载不同的页面,例如:
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];
UIView *view2 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];
view1.backgroundColor = [UIColor blackColor];
view2.backgroundColor = [UIColor yellowColor];
#if TARGET_VERSION == 1
[self.view addSubview:view1];
#else
[self.view addSubview:view2];
#endif
}
如果你使用的是Swift代码,其语法格式如下:
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];
UIView *view2 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];
view1.backgroundColor = [UIColor blackColor];
view2.backgroundColor = [UIColor yellowColor];
#if TARGET_VERSION == 1
[self.view addSubview:view1];
#else
[self.view addSubview:view2];
#endif
}
到此,我们在运行下项目,不同的环境运行出来的效果就不一样的了。
Pod管理
相信很多时候,ios的项目离不开pods的框架管理,在使用cocopods管理的时候,我们不要忘了将这些框架添加到对应的Target中,否则,可能使用的时候找不到对应的框架,对于pod的使用,可以参考以下代码进行构建:
platform :ios, '9.0'
workspace 'TestTargetDemo'
link_with 'TestTargetDemo', 'TestTargetDemoDev'
pod 'SDWebImage'
pod 'AFNetworking'
- HLS Lesson15-for循环优化:其他方法
- 对自己的上网搜索记录进行爬虫是怎样一种体验
- HLS Lesson13-for循环优化:合并
- HLS Lesson12-for循环优化:基本性能指标
- HLS Lesson11-c/c++ testbench书写续2
- 【机器学习】实例详解机器学习如何解决问题
- 企业网站架构之Nginx+tomcat+memcached集群
- 企业级Docker Registry开源工具Harbor的介绍以及使用指南
- HLS Lesson8-基本操作
- Windows渗透测试工具:RedSnarf
- HLS Lesson7-复合数据类型
- matlab GUI基础3
- 【Python环境】《Python数据科学入门》试译 第一章 简介
- HLS Lesson20-实例分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文学会哈希法解题
- 一小时彻底掌握stm32中断。
- Python 爬虫进阶必备 | 关于某虚拟币网站加密签名的分析(难度0.1)
- PHP中的数据库连接持久化
- ClickHouse王炸功能即将来袭?
- 搭建Amoeba实现MySQL主从数据库读写分离
- 如何在centos7上看墙外的世界
- 远程仓库的使用
- 破解某交(y)友(p)app的VIP&&半自动im机器人
- 关于compareTo使用的几种情况
- 高通量数据中批次效应的鉴定和处理(二)
- 通过ansible管理docker容器
- HBASE 技术细节 读取与写入 Region Split与合并介绍
- django2.2+Daphne+nginx+supervisor 生产环境部署
- Python 爬虫进阶必备 | 趣解某不可逆加密(短文警告)