上一节我们讲了项目结构优化中的《项目嵌套子工程》,接下来我们继续学习项目结构优化系列之项目依赖子模块工程。
在开发中,我们会遇到这样一种情况:公司有很多app,而这些app中会用到一些公用的功能模块,比如说登录。这时,我们可以单独创建这些子模块然后关联进项目中。
1、创建workspace、项目工程、模块动态库
我们首先创建workspace来进行项目和模块的管理。命名为Projects。
接着我们分别创建两个项目工程,学生端和教师端。命名为StudentProject和TeacherProject。
然后创建这两个项目工程都需要用到的子功能模块——登录模块动态库。命名为LoginLib。
项目工程和动态库的建立都需要关联进Projects里面。如下图所示:
2、在子功能模块中添加功能文件、资源文件等
在LoginLib动态库中添加功能代码,以供项目工程调用。
这里为了方便,我们直接把上一节的登录代码拷贝一份。
动态库功能文件结构
如图所示:登录模块LoginLib中我们添加了登录、注册、忘记密码等类,并且添加了Image.bundle以及LoginPrefixHeader.pch文件。
其中:
image.bundle用于存放图片等资源。具体image.bundle怎么创建,可以查看我的上篇文章《项目嵌套子工程》。
PCH文件用于宏定义一些常量方法等。因为我们使用的是动态库,要想要找到动态库中的文件,必须要先找到动态库所在的bundle才可以。
具体PCH文件如何创建使用,参考我的另一篇文章《iOS PCH文件的添加和使用》。
因此,我们可以在pch文件中定义该动态库所在的bundle以及资源文件所在的相对路径。
#ifndef LoginPrefixHeader_pch
#define LoginPrefixHeader_pch
// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
// 该动态库的bundle
#define loginBundle [NSBundle bundleWithIdentifier:@"com.fifedu.LoginLib"]
// 该动态库里面图片的路径
#define imagePath(imgName) [[loginBundle resourcePath] stringByAppendingPathComponent:[@"image.bundle" stringByAppendingPathComponent:imgName]]
#endif /* LoginPrefixHeader_pch */
当加载动态库中的xib文件的时候,需要在init方法中生命xib文件所在的bundle,否则会找不到。
- (instancetype)init {
self = [super initWithNibName:@"FiFLoginController" bundle:loginBundle];
if (self) {
return self;
}
return self;
}
图片等资源文件同理:
// 可以查看PCH文件中的宏定义
self.imgView.image = [UIImage imageWithContentsOfFile:imagePath(@"否认三连.jpg")];
3、动态库的相关设置
TARGETS -Build Settings - Build Active Architchture Only 设置为No
TARGETS->Build Settings->Other Linker Flags,添加 -ObjC
TARGETS->Build Settings->Enable Bitcode 设置为No
Edit scheme-Run-Build Configuration设置为Release
设置公开头文件和资源文件:
设置公开头文件和资源文件
并且在LoginLib.h文件中加入需要公开的头文件
在LoginLib.h文件中加入需要公开的头文件
4、项目工程集成并调用动态库
targets——General——embedded Binaries,添加动态库。
添加动态库
enable Bitcode设为no。(如果动态库没有设置为No的话,这儿也可以不设置,具体情况具体分析)
完成!!!
网友评论