本文介绍: swift 的SDK内嵌一个OC的SDK时无法使用bridgingHeader时的解决办法

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

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

报错信息如下:

using bridging headers with framework targets is unsupported

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

        我试了各种方法

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

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

        3.在swiftmodule.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类型的项目就不需要,只需要一个桥接文件。

 

原文地址:https://blog.csdn.net/qq_36924305/article/details/126768292

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_11709.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注