夏树正茂

花有重开日,人无再少年.

iOS中如何在一个工程创建多个App

| Comments

一般情况下,我们是一个App应用对应一个Xcode Project,但是如果你需要同时开发多个产品,而这些产品90%的数据结构以及交互方式都一样,呈现在用户面前的这两个产品,最大的不一样就是UI元素以及某些配色时,如果这个时候还是一个App一个Xcode Project,普遍的做法是:

你会先开发完成一个产品,然后在复制到其他的产品中,非常的麻烦而且效率很低,你需要一个一个文件去比对。如果你使用模块的方式,开发完一个模块,然后再利用Pod的方式导入到其他产品中,虽然这样可行,但是涉及到产品的迭代开发以及产品的随时会变的交互,模块的细化分很难实现。

如果你也面临这样的问题,不放考虑一下下面讲的一个工程来开发多个App

1、创建新的Target

如果现在你已经有个一个产品叫MultipleTargetA,如下图所示:

image

这时你想添加一个叫MultipleTargetB的产品,你需要做的是按如下的步奏进行创建: 选择Project -> Targets -> 右击MultipleTargetsA -> 选择Duplicate,这时我们就按照MultipleTargetsA复制了一个产品MultipleTargetsA copy,并且你会看到多出了一个文件MultipleTargetsA copy-Info.plist,如下图所示:

image

TARGETS里面的MultipleTargetsA copy改名为MultipleTargetsB(选中回车进入编辑)。

2、编辑plist文件

上面讲到了当我们创建新的Target后会多出一个MultipleTargetsA copy-Info.plist文件,这个plist文件就是控制MultipleTargetsB的名称,版本等信息的文件,我们为了统一将他改为MultipleTargetsB-Info.plist,在修改名字之前你需要在MultipleTargetsBBuild Settings中找到MultipleTargetsA copy-Info.plist一项,待会儿我们修改完这个plist文件以后,还需要在这里填入它正切的位置信息。这样程序执行时才能找到它,不然程序是不能通过编译的:

image

处理完上面的操作后,程序能正常通过编译后我们还需要修改plist文件里面的一下符合我们预期的信息:

image

3、定义Preprocessor Macros

现在我们的工程里面同时包含了两个Target,现在工程里面的类是这两个Target公用的,如果你想在一个类里面区分是MultipleTargetsA还是MultipleTargetsB,这时你就需要用到Preprocessor Macros了,它的定义很简单,选中一个Target,然后在Build Settings里面搜索Preprocessor Macros一项,然后在里面添加表明是MultipleTargetsA的宏:

image

假如我们为MultipleTargetsAMultipleTargetsB分别按如上步奏添加了标识:MultipleTargetsAMultipleTargetsB,那在某个类里面判断现在编译的目标是哪个Target就变得简单了

1
2
3
4
5
6
7
8
- (void)someFunction
{
#ifdef MultipleTargetsA
    NSLog(@"Build For Target MultipleTargetsA!");
#else
    NSLog(@"Build For Target MultipleTargetsB!");
#endif
}

4、修改Scheme

现在MultipleTargetsBScheme还是MultipleTargetsA copy:

image

我们可以通过Manage Schemes,选择MultipleTargetsA copy,然后按回车键进行编辑,将它改为MultipleTargetsB

image

5、资源文件和类文件

上面说了几个APP%90是相同的,不同的地方的资源文件和类文件如果要加以区分,比如A.m类属于MultipleTargetsA而不属于MultipleTargetsB,这时我们可以利用XcodeTarget Membership功能,来选择该类属于哪个Target

image

对于Assets文件来说,它只能整体的选择某个Target,所以不同的Target你可能需要建立不同的Assets文件。

Comments