swift sdk 项目内嵌OC sdk项目时 swift无法调用oc sdk

4 篇文章 0 订阅
3 篇文章 0 订阅

        用OC写了个SDK,并发布了,这时来了个新需求,要开发一个关于ext的sdk,其中涉及到了泛型,但是OC的泛型无法满足要求(实践操作感觉OC的泛型是假泛型,本质上是多态的操作,也也可能是我技术不够想错了)。于是看了一下swift语言,swift似乎是真泛型。于是准备使用swift来开发这个ext框架,那么我就要面临一个问题,就是swift的sdk要调用oc的sdk。我的这个情况在网上属实是没啥资料,纯自己研究出来的。

        期初我以为和app一样,使用bridgingHeader就行了,实际操作上发现,SDK不允许使用bridgingHeader。查阅网上资料,说swift sdk创建的时候生成的.h文件就是这个功能,实操上发现,并不是,使用#import后发生报错。

报错信息如下:

using bridging headers with framework targets is unsupported

        于是我搜到了使用module.modulemap来管理,此时的操作都是在swift上的。

        我试了各种方法

        1.新建swift 的target,在新建的target中导入oc sdk ,然后在主项目中加入新的target。不行

        2.在.h中使用#import 。不行

        3.在swift的module.modulemap,添加代码。不行

下面是我遇到过的报错信息(我也忘了是具体怎么操作出现的这个报错了,就随便放这里吧):

Command CompileSwiftSources failed with a nonzero exit code

但在我搜索资料的过程中,他们的OC sdk都有个文件(下图),而我自己的项目是没有这个文件的。于是我就从这个文件入手。

首先搜索后发现,这个文件就是用来兼容swift的调用的,缺少了这个文件swift就无法调用

那么突破口有了,为什么我的oc sdk不生成这个文件,我查看了文件代码,发现他的代码就是和我之前看到的.modulemap代码文件一致。于是我就在我的OC sdk项目中新建了该文件。直接输入文件名加后缀就行,然后在 setting中设置好路径(如下图),qplayer2_core.modulemap.然后打包生成framework,发现生成的modulemap的文件名仍然是:module.modulemap。可能这里就是固定的,我没细研究。实际内容和我的那个文件一样

 

 

 

文件内容如下:qplayer2_core是包名,用于swif 导入的 header是我的OCsdk暴露的对外接口

 然后再swift sdk中导入该包,并在.h中#import 需要的文件,当然,报错。(后来的研究发现,不需要写这个#import)

 Include of non-modular header inside framework module

 删除#import 后,仍然报错,并且swift的文件中也没有找到oc的接口内容。

于是我在swift需要的oc sdk位置 import 包名,发现oc的接口和类找到了,但是import报错,报错如下:

        Could not build Objective-C module '包名'

曙光来了,能找到oc的类,就说明这个操作可行,但是还是有问题,为什么import报错了?于是我又开始搜索,发现其他的oc sdk只有一个 umbrella header ,我的是三个。于是我觉得,这东西可能是唯一的,于是我在oc的sdk中新建了个header,把需要导入的.h都写进去,然后再到umbrella header后面写上我的那个header文件,这样就只有一个了。

打包,导入,然后再需要的位置import,发现成了。

所以结论是,如果想让swift的sdk种内嵌oc的sdk,需要OC的sdk兼容swift才行。而APP类型的项目就不需要,只需要一个桥接文件。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值