引言
苹果商店里面有些app区分免费版和收费版,如凤凰视频(探索版、专业版),但是仔细看,里面大部分内容都是一样的,只有部分是不同的,如icon、启动页等,那么他是怎么做到的呢?一个版本一份代码么?很显然不是,这样会出现很多重复的工作。答案是:一份代码,生成多个target
Target
-
Copy Bundle Resources
指生成的product的.app内将包含的资源文件 -
Compile Sources
指有哪些源代码被编译 -
Link Binary With Libraries
指编译过程中会引用哪些库文件 -
info.plist文件
项目的一些核心的配置信息,包括:app名称、app唯一标示(Bundle identifier)、版本号等
利用target包含的内容的特性,即可达到一份代码产出多个target,从而生成多个app的目的。
新建target
选中项目左侧的project,点击XCode菜单栏 Editor->Add Target->Application->Singe View Application->Product Name

这样会产生新的AppDelegate和app新的入口,不能达到我们的目的
拷贝target
选中原来的target,右击选择 Duplicate

会产生新的target-copy和对应的info.plist,双击可修改拷贝的target名称和info.plist的文件名,但是拷贝的info.plist独立于项目工程目录外边,我们可以右击show in Finder拖到合适的目录下以方便管理,如Supporting Files。

这样就可以配置新拷贝的target的info.plist,如app名称改为“Target收费版”,原来的是“Target免费版”。
区分图片资源
由于我们的图片资源都放在.xcassets里面,因此要为每个target都创建一个.xcassets,分别为Assets-free.xcassets 和 Assets-charge.xcassets,然后为每个target的Copy Bundle Resources选择配置对应的.xcassets以达到加载不同的图片资源的目的。


至此,相同文件名的不同图片放在对应的.xcassets下,通过[UIImage imageNamed:@"图片名"];不同target就可以根据相同的图片名加载不同的图片资源。
icon和启动图要针对每个target单独设置


区分逻辑代码
我们针对每个target,都定义一个名称相同、值不同的宏,在代码里面通过这个宏的值来区分target,以达到区分逻辑的目的。
注意Debug和Release模式都要设置


至此,不同target的全局宏已设置好,代码这样判断:
//TARGET就是之前定义的宏的名称
if (TARGET == 0) {
//免费版
self.title = @"Target免费版";
} else if (TARGET == 1) {
//收费版
self.title = @"Target收费版";
} else {
//...
}



网友评论