项目拆分 Cocoapods 多模块构建 framework构建
1. 创建主项目 AppDemo
1.1 选择项目类型

1.2 设置相关属性

2. 创建framework
2.1 创建framework类型

2.2. 设置相关属性类似步骤2
2.3. 保存位置选择主项目,并添加到主项目中

3. 添加依赖
3.1 在主项目根目录创建PodFile

3.2. Podfile内容大致如图,蓝色部分需要修改,另外需要引入的pod也需要修改

3.3. 保存后在Podfile的目录下执行 pod install (没有cocoapods 需要安装),结果中有警告,大概是说找不到宿主target,暂时没找到解决办法,可能我的podfile写的有问题

3.4. 执行完pod install后进入AppDemo的根目录,双击AppDemo.xworkspace打开即可看到这时候的目录结构如下图

4. 还需要做两件事情
4.1 在xcode中AppDemo的设置中添加embeded Binaries


4.2 在build phase中添加link

如果讲道理的话 这时候工程已经可以跑起来了
5. 在framework中加入oc代码 和swift代码

swift想要调用oc的代码 按照往常非framework的套路是添加一个bridging header
但是目前framework中是不支持bridging header,如果强行这么做虽然framework可以构建成功,但是依赖他的AppDemo将会失败,报出bridging header中引用的其他oc header找不到。
Apple说应该使用Umbrella header,个人感觉名字很酷,像一个伞,把framework内部细节都屏蔽在下面,只暴露出一部分接口。
一个不优雅的方式,是直接在Unbrella header中直接引入其他oc header,这时候 framework外部可以看到framework内部的这些被unbrella header引用的oc header,framework内部的swift也能够看到,暂时是满足了要求,不过破坏了unbrella header作为一把伞的作用,把内部的细节都暴露了。
具体可以参考这个链接:https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
在引入其他oc header的时候还会有一个问题如下图:

正如前面所说的,这么做将会暴露所有的oc细节,也就是编译器默认是不允许的,为了允许这种不优雅的行为发生,必须要设置一下,让编译器不再抱怨。
两个方式暂时解决:
方法1(我尝试的时候没生效):
设置framework project的属性 allow non-modular includes in framework modules 为YES,也就是允许这种不优雅的导入,对了,下图的FrameworkDemo.h就是所谓的Umbrella header

方法2 设置其他oc header的可见范围:
选中要设置的oc header,在xcode的右边又一个选项 把它设为public

至此,重新编译后,可以在AppDemo中只需要 import FrameworkDemo 就可以调用的framework中所有(oc+swift)的public类和方法了
更新:
今天搞清楚了用ModuleMap集成三方库的方法
以集成Bugly为例子,使用Pods添加依赖后,如果是OC可以直接#import "Bugly/Bugly.h",但是swift不行,本来需要写在bridgingheader里面的,之前提到不可以这么做,因此需要用一个module来包裹(wrap)他才能正常的调用
- 在项目的根目录创建一个文件夹名为Bugly,在里面新建一个文件module.modulemap,文件内加入内容
module Bugly {
header "../../Pods/Bugly/Bugly.framework/Headers/Bugly.h"
export *
}
其中header的路径为相对于module.modulemap的路径
-
打开项目设置,搜索Import Paths,修改,添加一行 $(SRCROOT)/Bugly
添加import Paths
-
clean & build 发现可以使用平时使用的import Bugly了
另外 如果想用git来管理的话 也很方便嗷,在完成上述步骤后
- 在git中创建AppDemo(暂时将FrameworkDemo文件夹移出到和AppDemo根目录平级),然后根据指示将AppDemo放git上
- 在git中创建FrameworkDemo,也将项目代码全部存到git上 假设git链接为 git@git.xxx.com/dev/framework
- 在AppDemo根目录上使用命令 git submodule add git@git.xxx.com/dev/framework
- 在AppDemo根目录上执行git submodule update --init --recursive
- 在xcode中打开AppDemo,进入AppDemo根目录里面新clone下来的FrameworkDemo,将FrameworkDemo.xcodeproj拖拽到xcode中
- 参照前面的文档为AppDemo添加FrameworkDemo依赖即可
- 超好用嗷,提交的时候每个模块可以单独管理 感觉自己萌萌哒