iOS 项目依赖子模块工程

上一节我们讲了项目结构优化中的《项目嵌套子工程》,接下来我们继续学习项目结构优化系列之项目依赖子模块工程。
在开发中,我们会遇到这样一种情况:公司有很多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

设置 Build Configuration

设置公开头文件和资源文件:
设置公开头文件和资源文件

并且在LoginLib.h文件中加入需要公开的头文件
在LoginLib.h文件中加入需要公开的头文件

4、项目工程集成并调用动态库
targets——General——embedded Binaries,添加动态库。
添加动态库

enable Bitcode设为no。(如果动态库没有设置为No的话,这儿也可以不设置,具体情况具体分析)

完成!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 主要内容翻译自:《How to Create a Framework》 在iOS中如何创建framework呢? ...
    改个名字真麻烦阅读 3,709评论 4 7
  • 前言 1.静态库和动态库有什么异同? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。利用静态...
    Ly梦k阅读 8,764评论 3 18
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,815评论 1 32
  • 在iOS项目开发中,随着项目的越来越大,工程的结构化会变差,编译的速度也会越来越慢。使用静态库或动态库的方式来构建...
    半岛夏天阅读 1,982评论 1 6
  • 仅以方便自己查阅记录前言1.静态库和动态库有什么异同?静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗...
    190CM阅读 4,578评论 0 4

友情链接更多精彩内容