Demo:http://download.csdn.net/detail/u012881779/9166527

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

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

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

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

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

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

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

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

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

具体操作可以参考:http://blog.csdn.net/wsyx768/article/details/42386919另一笔记

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

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";      }  
}

选择不同应用运行结果:


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

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

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

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

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

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

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

APPIcon:

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

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

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

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

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


文/作者:枫志应明

c博客地址:http://blog.csdn.net/wsyx768/article/details/49001507

在一个工程管理多个应用-b的更多相关文章

  1. Linux工程管理器——make

    一.定义 工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Make ...

  2. go语言入门(5)工程管理

    在工程中不会简单到只有一个源代码文件,且源文件之间会有相互的依赖关系,早期Go语言使用makefile作为工程管理的临时方案,后来的Go命令行工具的革命性之处在于彻底消除了工程文件的概念,完全用目录结 ...

  3. go语言20小时从入门到精通(六、工程管理)

    在实际的开发工作中,直接调用编译器进行编译和链接的场景是少而又少,因为在工程中不会简单到只有一个源代码文件,且源文件之间会有相互的依赖关系.如果这样一个文件一个文件逐步编译,那不亚于一场灾难. Go语 ...

  4. ARM裸机开发之交叉工具链和MakeFile工程管理

    一.交叉工具链 嵌入式Linux开发采用交叉开发,简单来说就是在宿主机(PC机)上面编译出能够在其他硬件平台上面运行的程序.在这个过程中,需要用到许多的交叉工具,这些交叉工具的集合就叫做交叉工具链.下 ...

  5. 使用BLADE构建c++工程管理

    使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项 ...

  6. emacs工程管理,cedet ede插件自动构建Make,Automake

    鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...

  7. Makefile 工程管理

    Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...

  8. make工程管理器

    1.概述 大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生. make可以自动识别文件时间戳,只处理修改的文件: make ...

  9. 学习总结:工程管理与makefile

    工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...

随机推荐

  1. Guava: 事件总线EventBus

    EventBus 直译过来就是事件总线,它使用发布订阅模式支持组件之间的通信,不需要显式地注册回调,比观察者模式更灵活,可用于替换Java中传统的事件监听模式,EventBus的作用就是解耦,它不是通 ...

  2. 嵌入式开发笔记 - U-Boot相关

    1.U-boot使用准备 1.1 U-boot下载 通过德国的denx软件中心提供的FTP下载合集,下载网址: ftp://ftp.denx.de/pub/u-boot/

  3. Linux 命令 - passwd: 更改用户密码

    命令格式 passwd  [-k]  [-l]  [-u  [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactiveda ...

  4. Redis 命令 - Server

    BGREWRITEAOF Asynchronously rewrite the append-only file BGSAVE Asynchronously save the dataset to d ...

  5. MVC Model Binder

    这篇博客是借助一个自己写的工程来理解model binder的过程. MVC通过路由系统,根据url找到对应的Action,然后再执行action,在执行action的时候,根据action的参数和数 ...

  6. 优化Android应用内存的若干方法

    原帖地址:http://www.open-open.com/lib/view/open1392013992317.html 在app开发的各个阶段中要考虑RAM的限制问题, 包括在设计阶段(正式开发之 ...

  7. C# 线程--第三线程池

    概述 线程池有那些优点: 1.在多线程中线程池可以减少我们创建线程,并合理的复用线程池中的线程.因为在线程池中有线程的线程处于等待分配任务状态. 2.不必管理和维护生存周期短暂的线程,不用在创建时为其 ...

  8. PHP的语言规范

    PHP的语言规范: 1.php中的变量名区分大小写,但是函数名,类名,方法名,不区分大小写,但建议区分大小写 2.php代码必须书写在<?php?>(php标签),开启标记(<?ph ...

  9. DataX的简单编译安装测试

    搭建环境:     Java > =1.6     Python>=2.6 <3     Ant     Rpmbuild     G++     编译DataX: 进入rpm文件夹 ...

  10. 一个简单的CS系统打包过程图文版

    一个简单的CS系统打包过程图文版 1.     打包内容 1.1.  此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...