记一次在Tweak中引入Swift framework的过程

2023-10-27

最近想在一个插件里打通App和web端,实现通过web控制App,方案是选用socket.io作为服务端和web前端。iOS端socket.io是一个纯swift实现的库。目前Theos对swift的支持还不是很完善,但是可以完成一般的工作了。Theos现在是支持swift文件编译的。

首先我们要来看一下theos仓库中对swift支持的一些介绍。其中Swift Runtime这部分比较关键的,需要按照这里的说明修改control文件。接下去是OC和Swift交互,这部分跟我们平常开发是相同的,你可以在Makefile里指定桥接文件等,最后说现在还不能用swift写tweak,嗯,你只能写非hock的代码。很久前就有人在问【已解决】如何使用 Theos 编译 Swift 源文件

我的需求是引入一个swift framework,我的工程本身不依赖libswift*.dylb,但是我依赖的库依赖它们,因此我也需要引入swift runtime。

在tweak里引入framework的话,可以参考这些资料Tweak如何导入第三方framework怎么在Tweak加入第三方framework如何在Theos工程里嵌入第三方SDK或者静态库。相对而言,我个人比较喜欢Tweak 工程创建、配置教程 & 实现logos语法自动补全里的说明。简而言之,就是我们需要把framework通过layout来放到越狱的系统里。因为framework不在宿主bundle里,也没有被写入宿主macho文件的load command里。因此如果framework的install name base是@rpath,那么即使dylib通过insert libraries被加载了,dylib依赖的framework也无法被找到。

可以通过otool工具查看macho文件依赖的库及其加载路径。

otool -L .../dylib
otool -L .../xx.framework/xxx

要修改具体的路径的话,要使用install_name_tool。install_name_tool的主要用法有两种:
install_name_tool -id [path] [target]是用来修改该库被引用的路径,相当于是一个自己的属性。如果某个库可能会被多个目标引用,那么修改该库的id比较方便。如果只是修改某个库里的某个依赖库的路径,可以用install_name_tool -change [oldpath] [newpath] [target]

我们先要修改从其他工程编译产生的framework的id,然后由于这两个库存在引用关系,因此也要修正被引用的库的路径。这样,我们的库就处理妥当了,把它放到layout下你想要放置framework的地方。修改Makefile,引入这两个库。如果我们的项目里没有swift文件,我们现在编译是可以通过的。但是这里有个问题,我们的tweak动态库不会被加载。这个问题目前还没想通,需要继续研究下。如果你引入一个swift文件,再编译的话,你会发现dylib里多了一条libswiftCore.dylib的依赖,那么这个时候,这个动态库会被加载。

对于Xcode高版本,swift 5.0的路径和theos当前版本不一致,导致一些库不会被链接。相关提及该问题的话题:unable to compile swift tool using XCode 11 #476This copy of libswiftCore.dylib requires an OS version prior to 12.2.0 [create_patched_sdk] Update bash script, create new python script #31

如果你使用的是DH开发的老版本theos的话,dpkg-deb存在问题,在解压拷贝framework到指定路径时会出现错误,路径会发生错乱,导致提示路径不存在。在尝试若干次make package之后会成功,但是有时候在Cydia里查看包内容,发现无法查看,打开文件列表的plist文件时,发现有些路径出错了。迁移到新版theos,升级dpkg-deb之后,这个问题就没出现了。可能跟改成了lzma归档方式有关,具体暂不细究,可以查看issue追踪问题的发现和解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次在Tweak中引入Swift framework的过程 的相关文章

随机推荐

  • vue3 ts页面赋值发现不生效

    在 onMounted 周期中 dataForm value route params data 赋值不生效
  • MOOC浙大数据结构课后题记录——PTA数据结构题目集(全)

    目录 第一周 最大子列和算法 二分查找 01 复杂度1 最大子列和问题 20分 01 复杂度2 Maximum Subsequence Sum 25分 01 复杂度3 二分查找 20分 第二周 线性结构 02 线性结构1 两个有序链表序列的
  • element 中 表格设置滚动条

    element 中 表格设置滚动条 表格设置滚动条 1 使用header 直接设个表格的高度 就会为表填加上表格 2 表格自定义使用css样式添加滚动条 样式一 deep el table body wrapper height 200px
  • 进行页面跳转时,不将请求参数显示在url的方法

    在SSM项目中 ajax不能实现跳转 反正我是不知道 href会将传参显示在url上 但有些人不想在页面跳转时 将传参显示在url中 反正我不想 就比如这种 有以下两种方法 将传参数放在session中 用js创建动态form表单 页面跳转
  • html2canvas给指定区域添加满屏水印

    效果图如下 直接贴上代码 下载插件 npm i html2canvas
  • 劲爆!java架构师百度网盘

    第一份资料 Kafka实战笔记 Kafka入门 为什么选择Kafka Karka的安装 管理和配置 Kafka的集群 第一个Kafka程序 afka的生产者 Kafka的消费者 深入理解Kafka 可靠的数据传递 Spring和Kalka的
  • 2021-06-20

    conda换源后安装包报错 只搜索第一个源 为了安装qiskit包 首先给conda增加了多个源 如下图 而后在安装qiskit包时 conda报错 但是提示只有第一个404 其他源没有提示 所以问题是 conda安装时是否遍历了所有已添加
  • 英文数字汇总,KMGT,毫微纳

    以5MB为例 现在的习惯是读作 五兆 可是 兆的本意是万亿 在这里却成了百万 5MB的标准读法应该是 五百万字节 网络的带宽 100M 常读作 一百兆 若读作 一百百万 会有人反对 可1000 不是也读作 一千千米 吗 还有气象预报的 五百
  • 讯飞星火大模型申请及测试:诚意满满

    大家好 我是可夫小子 关注AIGC 读书和自媒体 解锁更多ChatGPT AI绘画玩法 加 keeepdance 备注 chatgpt 拉你进群 最近国产大模型跟下饺子似 隔几天就发布一个 厂家发布得起劲 大家看多了也麻木了 而且无一例外都
  • 计算图像帧的平均灰度值

    2016 7 15 在处理视频中 需要对视频流中的图像帧进行区分 分离出其中的亮暗帧图像 区分亮暗图像 是依据图像的平均灰度值来实现的 我们知道 对于一幅灰度图像 每个像素点的灰度值可以通过指针来访问 i j 处的灰度值 img gt im
  • 运行项目出现java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

    java lang ClassNotFoundException org springframework web util IntrospectorCleanupListener at org apache catalina loader
  • spyder 出现ValueError: PyCapsule_GetPointer called with incorrect name

    我太难了 经过一堆试验 终于出了坑 总的来说 1 卸载pyqt5 命令 pip uninstall pyqt5 2 重新安装低版本的pyqt5 命令 pip install PyQt5 5 10 1 如果出现pip vendor urlli
  • meta-compilation

    RPython GraalVM 转载于 https my oschina net crcc blog 2239743
  • k8s的pv和pvc创建

    NFS使用PV和PVC 1 配置nfs存储 2 定义PV 实现 下图的pv和pvc测试 pv的定义 这里定义5个PV 并且定义挂载的路径以及访问模式 还有PV划分的大小 vim pv yaml apiVersion v1 kind Pers
  • Pytorch实战笔记(1)——BiLSTM 实现情感分析

    本文展示的是使用 Pytorch 构建一个 BiLSTM 来实现情感分析 本文的架构是第一章详细介绍 BiLSTM 第二章粗略介绍 BiLSTM 就是说如果你想快速上手可以跳过第一章 第三章是核心代码部分 目录 1 BiLSTM的详细介绍
  • JDK11.0.7下载及安装详细教程,步骤解释(win10)

    0 背景知识 JRE Java Runtime Environment JDK Java Development Kit JRE顾名思义是java运行时环境 包含了java虚拟机 java基础类库 是使用java语言编写的程序运行所需要的软
  • HW娱乐板块-你们都是天才~

    接下几天会是各类系统升级改造的时机了 大家都很有想法 就你tm叫韩毅啊 今年你是HW最出名的人物 虽然我不知道他在干什么 但是闸机已经被打穿了 从小我就想当一个百万富翁 我每天加班 可我的梦想却离我越来越遥远 我来到了护网为了实现我的梦想
  • 家里的wifi服务器无响应,宽带wifi服务器无响应

    宽带wifi服务器无响应 内容精选 换一换 当您调用API时 如果遇到 APIGW 开头的错误码 请参见API网关错误码进行处理 正常返回值说明200 OKGET和PUT操作正常返回 201 CreatedPOST操作正常返回 202 Ac
  • 如何用IDaaS云身份认证落地“零信任”安全架构

    题记 2020的RSAC Zero trust 零信任 去年有39家公司打 Zero trust 标签 今年数量激增到91家 可以说零信任理念已被国外同行广泛接受 零信任不仅仅是技术 更是理念的转变 会成为未来十年主流的网络安全架构 为什么
  • 记一次在Tweak中引入Swift framework的过程

    最近想在一个插件里打通App和web端 实现通过web控制App 方案是选用socket io作为服务端和web前端 iOS端socket io是一个纯swift实现的库 目前Theos对swift的支持还不是很完善 但是可以完成一般的工作