最近在做react-native项目,起初用到了socket.js做长连接,可能是因为socket.js设计之初是适应web环境的,所以在打包ios和安卓的时候,遇到了一些连接丢包的bug,后来领导决定用原生OC做socket连接,用的tomp协议封装的socket库,因此有了下文的坑:
接到这个任务后,着手在giehub找了个开源的stomp socket开源库,叫做StompClientLib的库,是一个swift封装的库,(尴尬,最近github一些比较流行的ios库都用swift封装的,看来OC风华已逝,所以我决定开始转战swfit了),但是它的依赖库是facebook的OC库,于是第一个坑来了:
我们用cocapods导入StompClientLib库,报错,大致说是项目是OC,导入的库是swift的,而且其所依赖库是OC,所以需要根据pod提示在podFile加入一行命令use_modular_headers!(不是use framework!网络上搜索OC混编swift库,一大堆说要用到这个命令,其实错误的,文章绝对抄袭的,如果是swfit项目用cocapods导入库,才需要用到use framework!命令,原因自行百度~),pods会自动讲swift库和OC库进行桥接操作~
解决了这条坑,以为万事OK了,然而,用网络上搜索“OC项目使用swfit库“按照教程所说:
第一步:在build settings,设置product module name,一般用app名称(比如我的项目为StompDemo)即可
第二步:defines modules设置为YES
第三步:在需要用到swfit的地方导入“StompDemo-Swfit.h”(这个文件是设置前两步后,编译项目,苹果自动会创建,不信?请看下图(1)文件描述)
第四步:在项目使用第三方库的类,然而错误!!说是找不到这个库??why?
那是什么原因?百度google:
网上资源很多,但是大多雷同,都是抄来抄去,没有验证就发布的文章,后来自己看资源解决,理解这个product module name到底是什么意思?
终于看网络资源大致明白了,其实这里涉及到target了,其实当我们在项目的target中设置前面的会创建StompDemo-Swfit.h文件,但是这个文件是自动设置在这个target下的swift文件的桥接,然而我们的第三方库,并不是在这个target下,而是自己的StompClientLib的target(如下图),所以按照这个思路,我们应该是设置这个target的build setting。
没错,设置好,重新编译,然后在进入~/Library/Developer/Xcode/DerivedData目录,搜索相应的StompClientLib-Swift.h,可以找到该文件,哈哈哈,以为这个坑终于解决了!
然而,导入这个文件,WTF,提示无法找到该文件?又是一个坑!!!
第一时间想到导入第三方库常遇到的头文件无法搜索到的场景,在build setting 设置header search paths增加该文件路径?突然想到不对!这个文件你根本无法设置路径,因为它是在沙盒里,而不是在bundle中,如何设置?所以方案不对,那是什么原因呢?如何让编译器可以找到这个文件呢?啊啊啊啊啊啊,如何办?怎么办?该当何办?没思路啊!!!
俗话说:“天才是靠99%的不断尝试和1%的天赋”,所以只能不断尝试,各种尝试,终于终于:
当我输入import <StompClientLib>,根据xcode的代码提示功能,导入一个又一个文件,终于输入
import<StompClientLib/Swift Compatibility Header时,xcode自动提示目录下有StompClientLib-Swift.h文件,啊哈哈哈哈哈哈,导入这个文件,使用这个库,哇靠终于编译不报错,可以使用该库下的swift文件了~~终于解决问题啦~~飞起来了!!!这里正常应该可以了,这就是OC项目混编Swift的坑,但是其实后面还遇到问题,下一章讲吧,还是关于OC使用Swfit的问题,关于有一些swift的类型、方法、代理等无法转换的问题。