美文网首页
iOS制作Swift-framework,嵌入OC项目使用

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

作者: 晓晓德 | 来源:发表于2019-04-08 14:27 被阅读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文件就可以了

    相关文章

      网友评论

          本文标题:iOS制作Swift-framework,嵌入OC项目使用

          本文链接:https://www.haomeiwen.com/subject/kipuiqtx.html