ios开发整理进击的小学生iOS开发高级

iOS开发多个Target的使用

2016-09-20  本文已影响6967人  ShanJiJi

背景介绍

开发过程中,我们会在内网搭建一个测试服务器,开发、测试都是在内网进行的。这样产生脏数据不会影响外网的服务器。外网服务器只有最后发布时才会进行一些必要的测试。
还有就是要对同一份代码生成不同的product,比如一个游戏有100关,要生成一个免费版(只有20关),可以新建一个Target,设置参数就可以实现,如果通过代码来控制就太麻烦了。

怎么办

针对第一个问题,在代码级别,对这个URL的选择,可以使用简单一点的宏来判断。这样所有的请求只要都调用这个宏,就可以做到控制。但是这样写不少限制,那就是很多工程属性不能设置,比如不能改变Bundle ID,不能改启动图片,不能改应用名称等。这样的测试版和正式版不能同时安装到同一部手机上,这样测试起来很麻烦,很多情况下我们需要对比正式版和测试版。

#ifndef DEBUG 
#define BaseURL @"192.168.1.23" // 内网服务器
#else
#define BaseURL @"112.23.12.34" // 外网服务器(瞎写的)
#endif

如果对于上一种方式不满,接下来可以使用更加强大的Targets
Targets 可以使用更多高级功能,比如一个Target对应一个Info.plist
而Info.plist中可以修改的属性太多了,什么启动图片,Bundle Id、MainInterface等小改动
大的改动,可以修改Bulid Phases,设置文件的编译,静态库的链接
还可以修改Bulid Settings 设置工程的编译、链接属性
选择不同的证书,开发环境就开发证书,发布时就选发布证书
第二个问题也可以用Targets来实现,当然通过代码也可以控制,但是代码的话扩展性太差。

Targets操作

复制Targets

新建Xcode时会自动创建一个默认的Target,我们如果要自己新增的话,可以通过复制的方式快捷创建第二个。
复制会将已有的资源以及工程属性copy一份,在这个基础上进行更改即可。


可以看到工程目录中多了一个文件Xcode的开发版 copy-Info.plist,就是这个新文件,所有的配置都可以在这里进行配置

创建全新Targets

可用通过菜单Editor->Add Target->Application->Singe View Application->Product Name
来新增


Targets之间异同

一个Target包含了Copy Bundle Resources, Compile Sources, Link Binary With Libraries、info.plist等
Copy Bundle Resources 是指生成的product的.app内将包含哪些资源文件
Compile Sources 是指将有哪些源代码被编译
Link Binary With Libraries 是指编译过程中会引用哪些库文件
最关键的就是info.plist文件,iPhone项目的很多关键性内容, 比如程序名称, 最终生成product的全局唯一id等都可用info.plist来设置。
不同的target还可以定义完整的差异化的编译设置, 从简单的调整优化选项, 到增加条件编译所使用的编译条件, 以至于所使用的base SDK都可以差异化指定

注意事项

新增文件、资源等,如果有多个Target,添加新文件时要注意勾选多个Target

修改新文件Xcode的开发版 copy-Info.plist

首先,修改Target名称
然后,修改plist名称
最后,修改schemes


设置预编译宏

Target 开发版->Build Settings然后搜索Preprocessor Macros然后增加宏


测试一下,可用通过预编译宏来区别代码

if (DevelopMent == 1) { // 测试一下,选择不同的Schemes就可以看到输出不同
   NSLog(@"DevelopMent=1");
}else {
   NSLog(@"DevelopMent=0");
}

修改Bundle Identifier

和选择不同的证书,让app区分开来点击target: Xcode的测试版->Summary:提示你需要选择plist文件,选择1)中添加的Xcode的测试版.plist;
点击target: Xcode的开发版->Summary:设置Bundle Idenfitier;
点击target: Xcode的测试版->Build Settings->Code Signing:选择另外的证书;

结语

现在就可以针对不同的product设置不同的参数了,生成不同的app那都不是事儿。
在代码中通过预编译宏做出区分,然后安心开发app吧

#if DevelopMent == 1
#define BaseURL @"192.168.1.23" // 内网服务器
#else
#define BaseURL @"112.23.12.34" // 外网服务器(瞎写的)
#endif

文/MrSong(简书作者)原文链接:http://www.jianshu.com/p/633ae2f80a44

上一篇下一篇

猜你喜欢

热点阅读