最近由于项目需求需要使用Swift做开发,但之前的好多有用的东西都是使用OC写的,鉴于这种情况最好的方式当然是使用swift重写,但这样的工作量太大,而且不能保证功能的稳定性,所以自己就尝试的使用Framework来嵌入Swift项目中去。
至于涉及到OC和Swift汇编的过程可以看我上一篇文章
@H_403_7@首先我们需要了解framework是什么:
- Framework 就是一个Bundle,将所有的资源(nib,Images,Fonts…)和代码都打包在一起,方便发布。理论上动态库可以单独更新,只是在iOS 上Apple未开放这样的权限。
- 首先我们创建一个Cocoa Touch Framework工程命名为SwiftOCFramework,默认会生成这么几个文件:
- 然后把自己需要打包成framework的文件拖入该工程中,这个时候就不需要使用xxx-swift.h文件了,不要把这个文件加入进来:
- 编译一下发现会报错,这就正常了:
-
- 这是因为我们没有使用桥接文件来引入OC的头文件导致的,接下来默认生成的SwiftOCFramework.h就有作用了,因为我们这个是Framework所以在SwiftOCFramework.h中引入头文件时要这样写:#import @H_403_7@<SwiftOCFramework/TestOCFile.h>,同时既然TestOCFile.h是给Swift文件用的那么我们就需要在Build Phases-Headers中把它指定为public,直接从Project中拖上去即可:@H_403_7@@H_403_7@
-
@H_403_7@@H_403_7@ - SwiftOCFramework.h文件现在是这样的:@H_403_7@
@H_403_7@@H_403_7@
@H_403_7@@H_403_7@@H_403_7@- 这样我们就引入了OC文件,再次编译运行发现还是有错,奔溃了,仔细看一下,不难发现是在OC调用Swift时出错,引入的桥接头文件出错:
- 仔细观察大家应该能看出问题来,我们在创建OC和Swift汇编工程时名字为SwiftOCCallBack,那么对应生成的桥接文件就是@H_403_7@"SwiftOCCallBack-Swift.h",但是现在我们打包的工程名字已经更改了,这就是导致找不到文件的原因。@H_403_7@
- 在创建Swift工程时,系统会自动根据工程名称生成对应的桥接文件,这时我们是不是可以改一下这个桥接文件试一下,发现还是一样的错误,什么原因:@H_403_7@@H_403_7@
@H_403_7@@H_403_7@- 什么鬼,长长的舒了一口气,仔细认真一想,现在我们是在创建Framework,一般我们引用Framework中的文件是怎么使用的framework/xxx.h是吧,这样修改一下:@H_403_7@@H_403_7@
@H_403_7@@H_403_7@- 终于出现BUlid Succeeded了,感谢国家,感谢党啊,接着就是我们需要合并Framework了@H_403_7@@H_403_7@
- 修改BUlid Configuration:@H_403_7@@H_403_7@
@H_403_7@@H_403_7@- 这个时候我们在Run一下真机以及模拟器,这两个文件就是我们想要的:@H_403_7@@H_403_7@
@H_403_7@@H_403_7@- 合并一下,打开终端执行下面命令,一般我是使用Release-iphoneos复制一份,然后在把Release-iphoneos和Release-iphonesimulator中的SwiftOCFramework文件合并,一般是直接找到文件拖入终端就可;@H_403_7@@H_403_7@
- @H_403_7@@H_403_7@
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@H_403_7@
@H_403_7@ - 刚开始我们会遇到一下错误:@H_403_7@@H_403_7@
@H_403_7@@H_403_7@- 这是因为我们没有告诉工程我们新嵌入了Framework,工程运行时找不到,我们需要手动嵌入二进制framework:@H_403_7@@H_403_7@
@H_403_7@@H_403_7@- 再次运行,OK了:@H_403_7@@H_403_7@