swift oc混编 打包framwork

最近由于项目需求需要使用Swift做开发,但之前的好多有用的东西都是使用OC写的,鉴于这种情况最好的方式当然是使用swift重写,但这样的工作量太大,而且不能保证功能的稳定性,所以自己就尝试的使用Framework来嵌入Swift项目中去。

至于涉及到OC和Swift汇编的过程可以看我上一篇文章

首先我们需要了解framework是什么:

  • Framework 就是一个Bundle,将所有的资源(nib, Images, Fonts…)和代码都打包在一起,方便发布。理论上动态库可以单独更新,只是在iOS 上Apple未开放这样的权限。
  • 首先我们创建一个Cocoa Touch Framework工程命名为SwiftOCFramework,默认会生成这么几个文件:
  •  swift oc混编 打包framwork插图
  • 然后把自己需要打包成framework的文件拖入该工程中,这个时候就不需要使用xxx-swift.h文件了,不要把这个文件加入进来:swift oc混编 打包framwork插图1
  • 编译一下发现会报错,这就正常了:
  • swift oc混编 打包framwork插图2
  • 这是因为我们没有使用桥接文件来引入OC的头文件导致的,接下来默认生成的SwiftOCFramework.h就有作用了,因为我们这个是Framework所以在SwiftOCFramework.h中引入头文件时要这样写:#import <SwiftOCFramework/TestOCFile.h>,同时既然TestOCFile.h是给Swift文件用的那么我们就需要在Build Phases-Headers中把它指定为public,直接从Project中拖上去即可:
  • swift oc混编 打包framwork插图3
  • SwiftOCFramework.h文件现在是这样的:
  • swift oc混编 打包framwork插图4
  • 这样我们就引入了OC文件,再次编译运行发现还是有错,奔溃了,仔细看一下,不难发现是在OC调用Swift时出错,引入的桥接头文件出错:
  • swift oc混编 打包framwork插图5
  • 仔细观察大家应该能看出问题来,我们在创建OC和Swift汇编工程时名字为SwiftOCCallBack,那么对应生成的桥接文件就是#import “SwiftOCCallBack-Swift.h”,但是现在我们打包的工程名字已经更改了,这就是导致找不到文件的原因。
  • 在创建Swift工程时,系统会自动根据工程名称生成对应的桥接文件,这时我们是不是可以改一下这个桥接文件试一下,发现还是一样的错误,什么原因:
  • swift oc混编 打包framwork插图6
  • 什么鬼,长长的舒了一口气,仔细认真一想,现在我们是在创建Framework,一般我们引用Framework中的文件是怎么使用的framework/xxx.h是吧,这样修改一下:
  • swift oc混编 打包framwork插图7
  • 终于出现BUlid Succeeded了,感谢国家,感谢党啊,接着就是我们需要合并Framework了
  • 修改BUlid Configuration:
  • swift oc混编 打包framwork插图8swift oc混编 打包framwork插图9
  • 这个时候我们在Run一下真机以及模拟器,这两个文件就是我们想要的:
  • swift oc混编 打包framwork插图10
  • 合并一下,打开终端执行下面命令,一般我是使用Release-iphoneos复制一份,然后在把Release-iphoneos和Release-iphonesimulator中的SwiftOCFramework文件合并,一般是直接找到文件拖入终端就可;
  • lipo -create /Users/FLY/Desktop/PROJECT/untitledfolder/SwiftOCFramework/Release-iphoneos/SwiftOCFramework.framework/SwiftOCFramework /Users/FLY/Desktop/PROJECT/untitledfolder/SwiftOCFramework/Release-iphonesimulator/SwiftOCFramework.framework/SwiftOCFramework -output /Users/FLY/Desktop/PROJECT/untitledfolder/SwiftOCFramework/SDK/Release-iphoneos/SwiftOCFramework.framework/SwiftOCFramework 


    点击回车搞定,但这时由于我们没有合并SwiftOCFramework.swiftmodule文件,所以还是智能在真机上运行,OK我们直接把elease-iphonesimulator中的SwiftOCFramework.swiftmodule文件文件复制到Release-iphoneos中,然后倒入工程运行,OK。

  • 刚开始我们会遇到一下错误:
  • swift oc混编 打包framwork插图11
  • 这是因为我们没有告诉工程我们新嵌入了Framework,工程运行时找不到,我们需要手动嵌入二进制framework:
  • swift oc混编 打包framwork插图12swift oc混编 打包framwork插图13
  • 再次运行,OK了:swift oc混编 打包framwork插图14

标签