iOS中多Target的实现

3,256 阅读3分钟

一、多Target的应用场景

现在公司中可能会同时存在多个项目,而且因为业务关系,这些项目基本上大同小异,功能大体相同,差异较小,这个时候,如果我们每个项目都单独一份代码的话,那么其中有很大一部分重复工作,既费时又费力,那么有没有简单有效的解决方案呢,在iOS中我们可以通过多Target的方式实现。

二、主要两点操作

  • 当一个文件为多个Target公用时,可以用宏区分
  • 当一个文件为单独的Target专用时,可以设置选择属于自己的Target

三、实现

1、创建MutableTarget

我们在Xcode中创建一个新的项目,项目目录结构如下图:

MutableTarget结构图

因为我们实现多Target之后,多个项目可能有不同的设置项,所以此处我们将默认的plist文件名字换掉以作区分:

修改plist文件名字及引用

为了区分不同Target的不同界面,我们现将默认的Target名字修改为Target1

修改Target名字

然后我们创建一个类TargetOneViewController

TargetOneViewController

因为此时项目中只有一个Target,所以此时是默认选中了Target1的:

默认选中了Target1

其实现如下:

TargetOneViewController实现

修改入口类,此时我们运行项目效果如下:

Target1效果

2、创建Target2

接下来我们为MutableTarget项目创建一个新的Target,方法有两种:

  • 第一种:Xcode->File->New->Target (不推荐)
  • 第二种:(推荐)如下图:

创建新Target

然后新的Target就会创建好了,之所以推荐这种方式创建新的Target是因为,这方式创建的Target其实是复制了原来的Target,这点从名字就可以看出来,新的Target会拥有原来的Target的配置作为默认配置,我们将新的Target重命名为Target2

创建Target2的plist文件

因为我们不同Target对应的可能是不同的App,而且两个App可能会同时安装在一个设备上,所以我们需要两套plist文件来配置不同的Target,此处我们直接将Target1的plist文件复制一份,修改名字,然后添加到项目中:

添加plist文件

因为新的plist文件是配置Target2的,所以此处我们选中Target2,下一步,添加plist文件引用路径:

添加plist引用路径

此时我们尝试运行Target2,我们发现此处的名字并没有修改掉:

运行

为了方便理解,我们将此处的名字修改为相应的Target的名字,点击Manager Schemes修改为相应的名字(选中Target1 copy,回车即可编辑修改):

修改名字

之后我们运行Target1Target2,结果如下:

Target1运行效果

Target2运行效果

结果发现,尽管我们运行了不同的Target,但是效果却是一样的,这是因为此时我们的入口类代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

 UINavigationController *target1Nav = [[UINavigationController alloc] initWithRootViewController:[[NSClassFromString(@"TargetOneViewController") alloc] init]];
 self.window.rootViewController = target1Nav;
  return  YES;
}

我们一直加载的是TargetOneViewController,所以结果都是一样的,然后我们创建一个新的类TargetTwoViewController实现如下:

- (void)viewDidLoad {
 [super  viewDidLoad];
 self.view.backgroundColor = [UIColor  whiteColor];
 UILabel *label = [[UILabel  alloc] init];
 label.frame = self.view.bounds;
 label.backgroundColor = [UIColor  clearColor];
 label.textColor = [UIColor  blueColor];
 label.textAlignment = NSTextAlignmentCenter;
 label.text = @"这是第二个target";
 [self.view addSubview:label];
}

那么如何让Target2加载TargetTwoViewController类呢,此时我们就需要在入口类区分什么时候加载Target1,什么时候加载Target2

3、使用宏区分不同的Target

如何区分不同的Target呢,Xcode给我们提供了定义宏的地方:

定义宏

我们在此处添加宏定义Target,宏定义的名字可以任意写,但是两个Target中的宏定义名字要保持一致,只是直不同:

Target1添加宏定义

Target2添加宏定义

**注:**此处DebugRelease两种模式都要添加。 然后入口类中代码这么修改:

修改入口类

运行:

结果

两个App

至此,多Target的使用基本几经介绍完毕