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
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依赖即可
- 超好用嗷,提交的时候每个模块可以单独管理 感觉自己萌萌哒