用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。不行
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文件,这样就只有一个了。
所以结论是,如果想让swift的sdk种内嵌oc的sdk,需要OC的sdk兼容swift才行。而APP类型的项目就不需要,只需要一个桥接文件。
原文地址:https://blog.csdn.net/qq_36924305/article/details/126768292
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_11709.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!