IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:27:25  更:2022-09-13 11:28:17 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码