最近刚完成了一个多Target的项目,做了许多思考与选择,现写下心得总结,权当抛砖引玉。
####项目背景
本项目是一个适用于正在学车人群的预约学车平台。分为学生端和教练端。学生端主功能为预约学车,教练端主功能为排课。
什么时候选用多Target
多target的选用,意在实现最大化重用代码。其经典情景是有多个类似的App,界面设计与业务逻辑有许多相似之处,仅仅有少数不同的业务逻辑,只需要在打包时将不同的配置文件打包好,就可以形成一个个不同的客户端。
我负责两个客户端有以下共同点:
- 近乎相同的登陆注册界面与逻辑
- 近乎相同的主页布局与逻辑
- 近乎相同的个人中心主界面
- 近乎相同的课表界面
- 近乎相同的选课/排课界面
不同点有:
- 不同的应用主题色
- 排课与选课的逻辑不同
- 一些图标资源和其他细节的不同
本项目选择多Target方案是十分合适的。
###为多Target打基础
- 编写共用的层(
WebService
,Common
等) - 抽取基类(
BaseViewController
,BaseModel
,BaseView
) - 编写子模块,利用MVC模式保持单个子模块的独立性,并预留相对应的差异化枚举和接口。
项目的结构是这样的
网络层不使用单例,而是采用了Category
的模式。只将最基本的RESTful
请求封装好放在WebService
中。而具体的实现采用Category
拓展方法。这样的好处是各自的WebService有各自的生命周期,每个Webservice可以只负责自己模块的网络层服务。比如说在这个项目中我分了Account,Teacher,Student等Category,分别负责登陆注册,教练端和学生端的网络请求服务。
View中是通用的View,比如全项目通用的定制AlertView
,一模一样的Login界面。
Category放通用的拓展类,比如说NSCalendar
在iOS8.0之后新增了很多日期计算和比较的Api,但是基于目前的项目大多数都需要最低支持iOS7.0,因此可以为NSCalaner
或者NSDate
写一些拓展方法,可以作为不同项目公用的工具。
其他例如UserInfo还有Validation则是项目业务需求抽取,在此就不赘述了。
###实战
做好以上准备后,就可以进行业务开发了。多Target项目的开发和普通项目的开发并没有什么不同,只是在新建文件时,注意选择Target即可。
另外,如果想调整文件的Target归属,只需要选择文件,在右边的工具窗口里的File Inspector选项下面,就可以找到与之前新建文件夹时相同的勾选项。勾选你想要的Target吧!
最后,在Debug和打包的时候,注意选择Target即可。
###一些应该避免的坑
- 除了公用的模块,其他各自不同的类都加上前缀
由于OC并没有像Java命名空间一样的东西,因此在引入头文件时,如果文件名相同,编译器有时候会错误地引入头文件,这一就会导致找不到对应的方法,进而导致编译不通过。解决这个问题最直接了当的方法就是在新建每一个类的时候加上前缀。
- 统一单独的常量或者宏定义文件
.h文件没有Target选项。因此,如果你有Define或者Constant一类的.h文件,要么为各自target用加前缀的方法创建不同的.h文件,要么将.h文件统一在Common中。不然会触发上面那个坑。