通常,我们在开发过程中,总是需要两套以上的环境进行测试、生产发布。如果只是简简单单的进行一个API的切换,那么只是进行不同的宏定义即可,但是要求应用的不同版本将使用相同的基础代码,但可以有不同的图标、切图等资源文件,bundle ID 和指向不同的数据库,这时就需要进行多版本构建管理。虽然这种方法也许快捷,方便,但是它有一些重要的限制。首先,因为我们在不同的环境中使用一个Bundle ID,你不能在一台设备上安装应用的多个版本(只要Bundle ID不一样,哪怕名字、icon一样都不是事)。下面通过详细的步骤进行讲解如何使用Xcode的target进行多版本构建:
1、选择项目工程,在Targets区域下,右键单击现有目标并选择 `Duplicate` 复制现有的目标,这时当前target下的bundle id可以命名为pro(简写)
2、复制之后会自动生成一个test copy的target和build scheme工程,这时我们按住“Enter”键,将其命名为“dev”,也要将其bundle id命名为dev(理由:在不同的环境中使用一个Bundle ID,你不能在一台设备上安装应用的多个版本),如下
3、点击build scheme工程,会有两个工程,这时点击----Manage Schemes,
出现一个弹出框,选择其中的一个,按住“Enter”键,输入dev,修改其build scheme名称
4、为了区分icon,右键”Assets.xcassets“----右击图标 ---- App Icons & Launch Images ---- New iOS App Icon. 新图标重命名为“AppIcon-Dev”同时添加自己的图片。这时就有两个Applcon图标了
要根据不同的版本使用不同的icon时,在工程中的App Icons处进行选择即可
5、复制时还会自动生成一个plist文件,在根文件目录下的最底部,这时我们可以将其命名为dev.plist,将其移动到指定位置;
这时再选择target时,会发现dev下的Identity是空的,这时点击“Choose Info.plist File”
选择工程路径下的plist文件
在target的“Build Settings”,滚动到“Packaging”,查看(也可直接在此修改)
6、最后,我们会为不同版本的target配置预处理宏/编译器标识,之后我们就可以使用该标识在我们的代码来检测应用程序正在运行的版本。
`Build Settings`下`Apple LLVM 7.0 - Preprocessing`。拓展`Preprocessor Macros`在Rebug和Release区域添加一个变量。对于开发target(即todo Dev),将该值设置为`DEVELOPMENT = 1`。另一个,将值设为`DEVELOPMENT=0`来表示生产版本。
7、使用Target进行宏定义,创建一个pch文件,进行宏定义(这时定义不同的API;颜色、字体等)
//开发
#if DEVELOPMENT
#define IMAGE_PATH [UIColor greenColor]
//生产
#else
#define IMAGE_PATH [UIColor grayColor]
#endif
8-1、(根目录下图片)如果要使用不同的图片、以及第三方库时(以图片为例):在根文件目录下创建实体文件夹,引入图片文件,不同的版本使用不同的实体文件夹路径,但是图片名字可以保持一致,使用时如上也使用相同的bundle路径;在不同target下的Build Phases下的Copy Bundle Resources 中选择不同路径的图片(名字保持一致),这里的图片是加在工程的根目录下的,是通过Add File To 添加进来的,且是一个实体文件夹;
使用时,如下
(通过imageWithContentsOfFile调用)
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 288, 180)];
imgView.backgroundColor = IMAGE_PATH;
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"picture" ofType:@"jpg"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
imgView.image = image;
[self.view addSubview:imgView];
}
8-2、(Assets.xcassets图片----推荐使用;拖入Assets.xcassets文件夹中的图片最后会被打包成一个Assets.car文件,我们不能根据路径读取图片。而拖入Supporting Files文件夹中的图片可以根据路径读取。另外,从某种程度上讲,拖入Assets.xcassets文件夹中的图片因为被打包成了Assets.car文件,可以得到一定程度上的保护,以防止盗图)
以下这是没办法之时:如果要通过Assets.xcassets导入的图片,博主尝试过了即使创建相同的图片名字后缀但是不同版本还是只会使用同一张图片的,方法就是宏定义:#define IMAGE_PATH(str) [UIImage imageNamed:[NSString stringWithFormat:@"%@-pro.jpg",str]],然后图片名字是一样样的,只是后缀也要提前设置好。
(1)、右击工程----Resource----AssetCatalog----Next
(2)、输入名称,选择Targets--dev,因为pro使用原本工程创建时生成的Assets.xcassets文件
(3)、重新在新生成的Media.xcassets文件下创建AppIcon-dev,导入相同图片名字的不同图片
(4)、在不同target下的Build Phases下的Copy Bundle Resources 中选择不同名字的.xcassets文件夹(图片名字保持一致;如果新建的.xcassets文件中没有任何文件,可以将原来的Assets.xcassets文件中的所有图片copy到新的.xcassets文件中)
使用
imgView.image = [UIImage imageNamed:@"img.jpg"];
Images.xcassets
中的图片资源只能通过imageNamed:
方法加载,通过NSBundle的pathForResource:ofType:
无法获得图片路径。因此,Images.xcassets
只适合存放系统常用的,占用内存小的图片资源。
9、给target添加新资源时(如是第三方库等需每个target都加入),如是图片,给需要的target加入勾选即可,如下:
最后给予总体效果,不同版本下的相同图片名字的不同图片,以及icon
代码下载地址