iOS制作Swift-framework,嵌入OC项目使用

2019-04-08  本文已影响0人  晓晓德

需求:
有一个完整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步,请参考步骤来看,中间有我遇见的坑及解决方法。

开始搭建:


1.创建一个workspace(MyApp.xcworkspace)、一个测试工程(MyApp)、一个SDK工程(MySDK),然后workspace添加这两个工程(注:附录1)

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

3.设置MySDK—Build Settings—Mach-O Type— Static Library(静态库)
创建一个测试文件“TestClass”写几行测试代码,最简单的SDK就完成了。

当你最简单的SDK完成后,想用demo工程测试的时候,问题出现了,你会发现SDK中的方法你没有提示,编译还报错。
解决
这是因为Demo工程是OC项目使用Swift的SDK需要桥接文件(详见目录2) 4.将OC的网络请求库“KwsNetworkSDK”拖进MySDK工程了,切记不要选择“Add to targets”。

如果第一次你就这么做了,你会发现有这样的错误,xcode无法找到KwsNetworkSDK模块,无论怎么clean、编译,都不行。
B237E539-8E7C-4C3E-B3C9-C360060D97C5.png
解决
首先你把“KwsNetworkSDK”的SDK拖入工程时,勾上“Add to targets”,然后再把他删掉。
然后再拖一次,这时不要选择“Add to targets”,就OK了。
WeChatcaeebe1dccb3aa8e061f86360056e732.png
主意
1.“public”
如果你在SDK以外想调用该类和该类中的方法,就必须在该类和方法前加上关键字“public”或者“open”,具体区别和原因自行百度。
2.“@objc”
因为最后生成的SDK是给OC项目用的,所以暴露给外面的方法一定要加上“@objc”,不加的话是调不到该方法的。 5.编译MySDK,你就会发现Products有一个MySDK.framework。这就是我们的成果,现在用MyApp工程来测试下我们写的SDK是否好用。把咱们的MySDK.framework引入到MyApp工程里,因为是静态库,所以选择“Linked Frameworks and Libraries”
主意
6.需要把OC的网络请求库“KwsNetworkSDK”一并拖入到MyApp工程中,这次要选择勾上“Add to targets”。 然后你就可以测试你写的MySDK了
运行,恭喜,崩掉了~~~

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


7.MyApp— Build Settings — other linker Flags — “-ObjC” 主意大小写
再次运行,成功

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

所以,我们现在也用pod来管理

8.用终端cd到根目录,创建Podfile文件,编辑podfile文件,pod install
podfile文件
pod install之后会有一个警告
解决
9.在SDK — target — Build Settings — Other Linker Flags — 添加“$(inherited)”
添加完之后重新pod install就OK了
完成之后的项目目录
测试pod管理的三方库是否能用
在SDK里创建一个测试文件“MyLoginVC”
在MyApp工程里测试
记得每次MySDK中有改变都要切换到MyApp下编译再切换回MyApp
编译运行MyApp,点击按钮,测试成功

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


创建workspace
创建workspace
同样创建一个Demo和SDK工程
打开workspace然后添加两个工程

附录2
桥接文件


在oc项目中创建一个swift文件(⌘+N)
点击Create Bridging Header,工程就会多出两个文件
yeeLifeDemo-Bridging-Header.h这个文件中不用写任何东西

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


解决方法就是在重新创建一个swift文件就可以了
上一篇下一篇

猜你喜欢

热点阅读