美文网首页
iOS新建target,使两个不同项目共用某一模块

iOS新建target,使两个不同项目共用某一模块

作者: YJPizazz | 来源:发表于2018-04-17 20:12 被阅读0次

    一、背景介绍,为什么要新建target?

    公司的一个新需求,需要在原有的企业版app基础上,新做一个用户版的app。由于两个app大部分内容很相似,而且有一个共用的业务模块。

    大概情况如上,而痛点如下:

    • 虽然大部分内容一开始相同,但后面分歧会越来越大,毕竟是两个app,各有各的业务,所以这大部分相同的代码,将会被拷贝成两份代码
    • 共用一个业务模块。在第1个痛点的时候,我们已经把不共用的代码拷贝成两份了,如果共用模块也拷贝两份代码的话,那以后共用模块出现修改的话,就需要在共用模块的两份代码都修改一遍,容易出错。
    • 共用模块也会出现小部分的两个app不同的业务处理

    针对以上三个痛点,新建一个target正好可以解决这几个问题。

    二、如何新建target?

    新建target有两个方法。

    方法一:复制target

    在已有的target上,已有target-->右键-->Duplicaate-->Duplicaate Only

    复制target方法

    复制成功后,工程目录下会出现copy-Info.plist文件。

    方法二:新建target

    通过菜单-->Editor-->Add Target--> Application --> Singe View Application --> Product Name

    新建target方法

    新建成功后,工程目录会出现新target目录,里面会包含以下文件

    新出现的文件

    方法一、二的不同点:

    方法一中,新target保留了被拷贝的target全部配置和文件引用,只需稍作修改就能生成一个新的app(比如修改包名、图标和启动图之类的)。

    方法二中,新target将不保留被拷贝的target全部配置和文件引用,相当于一个全新的app(Singe View Application)。

    三、不同的target作用

    每个Target都包含了Copy Bundle Resources, Compile Sources, Link Binary With Librariesinfo.plist等,对不同的app进行管理。

    不同target的资源文件

    其作用如下:

    • Copy Bundle Resources 是指生成app后里面所包含的资源文件,比如图片。
    • Compile Sources 是指哪些源代码会被该target引用编译。
    • Link Binary With Libraries 是指引用哪些库文件。
    • info.plist,这个应该都是知道是比较重要的,比如包名、版本号和权限之类的。

    四、选择方案

    为了解决上面的第1个痛点,我选择方法二来新建target。因为方法一会引用原有的大部分源代码,不符合我需要拷贝两份代码的需求。

    好了,方案确定了,就准备大干一场了,因为方法二会相对复杂很多,也会报很多的错误,接下来一一解决。

    五、开始新建target工作

    1、使用方法二新建target

    2、新建一个共用模块文件夹

    468468465.png

    3、把需要共用模块的代码(看你的需要),拷贝到CommonModule的finder目录下。

    498446486.png

    4、在工程中目录中,彻底删除原target中共用模块代码。(Move to Trash)

    5、再把这些共用模块代码拉到CommonModule工程目录下,Add to选中: 原target+新target

    BEE2D83C-4AA6-4EC8-88F6-19B40CFF8855.png

    PS:(2、3、4、5概括来说就是:共用模块独立出来,并被新旧两个target所引用)

    6、在工程中目录中,彻底删除新target里的所有东西

    首先,彻底删除掉这几个文件:

    删除的文件 彻底删除

    如果新target的finder目录下还有一些空文件夹,也全部删除。

    7、把原target的finder目录下所有文件,拷贝到新target的finder目录下。

    8、把新target的finder目录下所有文件,拉到新target的工程目录下。Add to选中:新target

    1449846515616.png

    9、至此,新建target的前期工作就完成了,剩下的改配置、修复报错和修复引用之类的了。

    六、CocoaPods在多target中安装相同pod的优雅解决方案

    如果工程中使用了CocoaPods,请参考这篇文章解决。

    七、修改新target的配置

    1、下图的配置修改我就不详细说了,作为iOS开发者应该都懂。

    1351151561.png

    2、然后就是设置编译宏来区别代码

    分别在新旧两个target的Build Settings中搜索Preprocessor Macros然后增加宏(这里用IsUserTarget=1)

    468486446136.png

    然后在代码中验证一下就知道了。

    884616846.png

    八、修复报错

    首先,切换target编译一下,看一下报什么错(每个人的报错可以不一样,这里只解决我遇到的)

    263161516.png

    报错1:

    The “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift. This setting can be set in the build settings editor.

    解决1:

    这里说swift版本的问题,在新target的Build Settings中搜索swift language,把版本改为你所需要的。

    1651646416.png

    报错2:

    No known class method for selector 'yy_modelWithJSON:

    解决2:

    没有方法yy_modelWithJSON。因为YYModel我是加到pch预编译头文件里面去了,所以这个报错就是pch没有正确引用。

    在新target的Build Settings中搜索prefix header,然后添加一下路径。

    48484156165.png

    报错3:

    NSTimer+Blocks.m:16:12: ARC forbids explicit message send of 'release'

    解决3:

    NSTimer+Blocks.m这个文件是使用MRC的,所以要改为ARC。

    在新target的Build Phases中搜索NSTimer+Blocks,然后改为ARC。

    1568161651.png

    原文链接:https://www.jianshu.com/p/365e211b6ed0

    相关文章

      网友评论

          本文标题:iOS新建target,使两个不同项目共用某一模块

          本文链接:https://www.haomeiwen.com/subject/kgmukftx.html