本文的产生是因产品经理提出的特殊需求:

一个针对多所学校的应用,对不同学校需要分别使用一套不同的“icon”和“启动图” 打包并上传到App Store,同时因为接口需要对不同学校区别处理,故在这个应用部分代码中需要分别处理。本文便是为了在同一个工程中,不使用copy整个项目之类的方 法,仅使用这一套代码管理多个不同的应用,便于后期代码管理。

 

1.新建一个项目并对info.plist进行设置

添加一个字段JudgeMark并设置为“1”(代码中对不同应用分别处理时需要), 设置Bundle identifier为“com.gamin.DMManageMultipleApp”(在同一个设备上运行多个应用时避免覆盖安装),设置 Bundle name为“第一个应用”。

在一个工程管理多个应用-b_bundle

 

2.进入TARGETS选择DMManageMultipleApp点击右键,选择Duplicate,进入下一级后选择Duplicate Only(ipad版工程这里选择Duplicate and Transition to iPad)。

在一个工程管理多个应用-b_bundle_02

 

在一个工程管理多个应用-b_ico_03

 

3.对新copy出来的TARGETS和info.plist进行重命名。

在一个工程管理多个应用-b_iOS app_04

 

4.进入Manage Schemes对项目的Scheme进行重命名,保持和上一步修改的TARGETS名相同。

在一个工程管理多个应用-b_重命名_05

 

在一个工程管理多个应用-b_ico_06

 

在一个工程管理多个应用-b_plist文件_07

 

5.选择新copy的TARGETS进入General选择Choose Info.plist File,并对选择这个info.plist进行部分设置(Bundle identifier,Bundle name,JudgeMark)。

在一个工程管理多个应用-b_iOS app_08

 

 

在一个工程管理多个应用-b_iOS app_09

 

在一个工程管理多个应用-b_重命名_10

 

6.进入Assets.xcassets,点击右键选择App Icons & Launch Images,进入下一级后选择New iOS App Icon或New iOS Launch Image,新建icon和launch,并重命名和切片设置。


 

在一个工程管理多个应用-b_iOS app_11

在一个工程管理多个应用-b_重命名_12

 

在一个工程管理多个应用-b_ico_13

 

7.选择TARGETS进入General,进入App Icons and Launch Images选择上一步创建的关联不同应用的icon和launch。

在一个工程管理多个应用-b_plist文件_14

 

8.在代码中对不同应用分别完成部分不同功能。

 

#import "ViewController.h"  

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameLab;
@property (weak, nonatomic) IBOutlet UILabel *markLab;
@property (weak, nonatomic) IBOutlet UILabel *differenceLab;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

//不同应用 可以这里完成不同功能的操作
NSString *judgeMark = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"JudgeMark"];
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];

if ([judgeMark isEqualToString:@"1"]) {
//第一个应用
_nameLab.text = appName;
_markLab.text = judgeMark;
_differenceLab.text = @"DMManageMultipleApp";

}else if([judgeMark isEqualToString:@"2"]){
//第二个应用
_nameLab.text = appName;
_markLab.text = judgeMark;
_differenceLab.text = @"DMManageMultipleApp-two";

}else if([judgeMark isEqualToString:@"3"]){
//第三个应用
_nameLab.text = appName;
_markLab.text = judgeMark;
_differenceLab.text = @"DMManageMultipleApp-three";

}
}


 

选择不同应用运行结果:

在一个工程管理多个应用-b_iOS app_15

 

在一个工程管理多个应用-b_bundle_16

 

在一个工程管理多个应用-b_重命名_17

 



还有一个需求是同一个app但是名字和logo不同时期不一样

 

我把它删掉,新创建一个,改个名顺便浪一下。。。

在一个工程管理多个应用-b_bundle_18

在一个工程管理多个应用-b_plist文件_19

在一个工程管理多个应用-b_重命名_20

 

4、创建新的target的info.plist文件,复制原来的info.plist文件以保持配置一致。我把随之生成的那个plist文件删掉了,可能是路径不对,提交代码时提交不上。

在一个工程管理多个应用-b_plist文件_21

在一个工程管理多个应用-b_plist文件_22

 5、对新创建的target进行修改配置,比如dispaly Name,bundle id,LaunchScreen,APPIcon等等

dispaly Name:在新创建的info.plist文件中添加Bundle display name

bundleID就不用说了,直接在复制的target里修改就好了

LaunchScreen:需要创建一个新的LaunchScreen,然后在复制的target里选择

在一个工程管理多个应用-b_ico_23

在一个工程管理多个应用-b_重命名_24

APPIcon:

在一个工程管理多个应用-b_iOS app_25

 6、如果工程使用了cocoapods,记得也要给新创建的Target安装一份,很简单,打开podfile,然后复制一份,改下target的名字在pod install就好了

在一个工程管理多个应用-b_plist文件_26

7、如果需要修改一些代码里的配置,就用预处理吧

在一个工程管理多个应用-b_ico_27

在你的全局配置类里进行判断,这里面写一些宏定义,比如百度推送的Key之类的

在一个工程管理多个应用-b_plist文件_28

8、记得配置推送证书和开发发布的配置文件,毕竟这些都是以bundleID标记的,不配置的话无法真机测试,发布以及收不到推送哦

至此,我的多环境配置就搞好了,当然我的两个app的区别比较少,其他的一些配置同学自己去探索吧

 

 



文/作者:枫志应明