项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编

1. 创建主项目 AppDemo

1.1 选择项目类型


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第1张图片
项目类型

1.2 设置相关属性


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第2张图片
相关

2. 创建framework

2.1 创建framework类型


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第3张图片
创建framework

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


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第4张图片
Paste_Image.png

3. 添加依赖

3.1 在主项目根目录创建PodFile


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第5张图片
Paste_Image.png

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


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第6张图片
Podfile内容

3.3. 保存后在Podfile的目录下执行 pod install (没有cocoapods 需要安装),结果中有警告,大概是说找不到宿主target,暂时没找到解决办法,可能我的podfile写的有问题
项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第7张图片
pod install执行结果

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


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第8张图片
最终目录结构

4. 还需要做两件事情

4.1 在xcode中AppDemo的设置中添加embeded Binaries


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第9张图片
添加embeded binaries

项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第10张图片
选中自己的FrameworkDemo

4.2 在build phase中添加link


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第11张图片
链接framework

如果讲道理的话 这时候工程已经可以跑起来了

5. 在framework中加入oc代码 和swift代码

项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第12张图片
Paste_Image.png

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的时候还会有一个问题如下图:


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第13张图片
non-modular header问题

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


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第14张图片
设置允许导入non-modular header

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


项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第15张图片
Paste_Image.png

至此,重新编译后,可以在AppDemo中只需要 import FrameworkDemo 就可以调用的framework中所有(oc+swift)的public类和方法了

更新:

今天搞清楚了用ModuleMap集成三方库的方法
以集成Bugly为例子,使用Pods添加依赖后,如果是OC可以直接#import "Bugly/Bugly.h",但是swift不行,本来需要写在bridgingheader里面的,之前提到不可以这么做,因此需要用一个module来包裹(wrap)他才能正常的调用

  1. 在项目的根目录创建一个文件夹名为Bugly,在里面新建一个文件module.modulemap,文件内加入内容
module Bugly {
    header "../../Pods/Bugly/Bugly.framework/Headers/Bugly.h"
    export *
}

其中header的路径为相对于module.modulemap的路径

  1. 打开项目设置,搜索Import Paths,修改,添加一行 $(SRCROOT)/Bugly


    项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编_第16张图片
    添加import Paths
  2. clean & build 发现可以使用平时使用的import Bugly了

另外 如果想用git来管理的话 也很方便嗷,在完成上述步骤后

  1. 在git中创建AppDemo(暂时将FrameworkDemo文件夹移出到和AppDemo根目录平级),然后根据指示将AppDemo放git上
  2. 在git中创建FrameworkDemo,也将项目代码全部存到git上 假设git链接为 [email protected]/dev/framework
  3. 在AppDemo根目录上使用命令 git submodule add [email protected]/dev/framework
  4. 在AppDemo根目录上执行git submodule update --init --recursive
  5. 在xcode中打开AppDemo,进入AppDemo根目录里面新clone下来的FrameworkDemo,将FrameworkDemo.xcodeproj拖拽到xcode中
  6. 参照前面的文档为AppDemo添加FrameworkDemo依赖即可
  7. 超好用嗷,提交的时候每个模块可以单独管理 感觉自己萌萌哒

你可能感兴趣的:(项目拆分 Cocoapods 多模块构建 framework构建 OC swift混编)