需求:
有一个完整Swift项目,需要嵌入到一个OC项目中,然而Swift项目中使用了一个封装好的用OC写的网络请求SDK(因为公司原因,没有使用AFN等网络框架),Swift项目还使用了pod引用其他第三方库😢,现在准备把这个完整的Swift项目制作成SDK,嵌入到OC项目中。
实现思路:
用一个workspace同时管理OCDemo工程(为了测试SDK)和SwiftSDK工程,把OC的网络请求SDK手动拖入SwiftSDK工程中,使用cocoapod管理整个workspace
说明:
例子截图的时候我是用的swif工程做测试(之前经历无数的坑,我以为Demo工程只能是swift,OC不可以,后来发现是我自己的问题),如果是OC工程做测试的话,其他没有区别,就多一步添加桥接文件(注:附录2)。完整的项目搭建需要9步,请参考步骤来看,中间有我遇见的坑及解决方法。
开始搭建:

2.设置MySDK和MyApp的最低支持版本(我是9.0)

创建一个测试文件“TestClass”写几行测试代码,最简单的SDK就完成了。
坑
当你最简单的SDK完成后,想用demo工程测试的时候,问题出现了,你会发现SDK中的方法你没有提示,编译还报错。
解决
这是因为Demo工程是OC项目使用Swift的SDK需要桥接文件(详见目录2)

坑
如果第一次你就这么做了,你会发现有这样的错误,xcode无法找到KwsNetworkSDK模块,无论怎么clean、编译,都不行。

解决
首先你把“KwsNetworkSDK”的SDK拖入工程时,勾上“Add to targets”,然后再把他删掉。
然后再拖一次,这时不要选择“Add to targets”,就OK了。

主意
1.“public”
如果你在SDK以外想调用该类和该类中的方法,就必须在该类和方法前加上关键字“public”或者“open”,具体区别和原因自行百度。
2.“@objc”
因为最后生成的SDK是给OC项目用的,所以暴露给外面的方法一定要加上“@objc”,不加的话是调不到该方法的。

主意
6.需要把OC的网络请求库“KwsNetworkSDK”一并拖入到MyApp工程中,这次要选择勾上“Add to targets”。


longin()方法正常,post()方法崩掉
因为post()方法调用了网络请求SDK中的方法,是OC写的,里面用到了分类,所以你需要配以一下:


现在我的基本需求已经完成了,不过我之前写好的swift项目里面还用cocoapod引用了第三方库比如snpkit、Kingfish
所以,我们现在也用pod来管理



解决:
9.在SDK — target — Build Settings — Other Linker Flags — 添加“$(inherited)”
添加完之后重新pod install就OK了

测试pod管理的三方库是否能用




OC工程主意一下几点:
1.KwsNetwork.framework和MySDK.framework拖入到OC工程中,选择勾上“Add to targets”;
2.pod添加MySDK需要的第三方库;
3.OC工程 — Build Settings — “other Linker Flags” — “-ObjC”
4.桥接文件(附录2)
5.引用方式“ #import <MySDK/MySDK-Swift.h>”
附录1
创建工程
1)先创建一个空文件夹
2)在文件夹下创建workspace
File—>New—>workspace




附录2
桥接文件



Test.swift这个文件一定不能删,删了会出现如下错误

网友评论