| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> swift sdk 项目内嵌OC sdk项目时 swift无法调用oc sdk -> 正文阅读 |
|
[移动开发]swift sdk 项目内嵌OC sdk项目时 swift无法调用oc sdk |
? ? ? ? 用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类型的项目就不需要,只需要一个桥接文件。 ? |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 4:34:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |