尧图精选

JSPatch扩展机制详解:1行代码动态加载扩展,3行代码支持自定义Struct类型

🕒 发布时间:2026/9/19 13:47:06 📁 来源:尧图网络
JSPatch扩展机制详解1行代码动态加载扩展3行代码支持自定义Struct类型【免费下载链接】JSPatchJSPatch bridge Objective-C and Javascript using the Objective-C runtime. You can call any Objective-C class and method in JavaScript by just including a small engine. JSPatch is generally used to hotfix iOS App.项目地址: https://gitcode.com/gh_mirrors/js/JSPatchJSPatch 扩展机制是 JSPatch 动态化引擎最实用的进阶能力JSPatch 通过 Objective-C 运行时桥接 JavaScript 与 iOS 原生代码常用于 iOS App 热修复hotfix。而它的**扩展机制JPExtension**让你只需1 行代码动态加载扩展就能解锁 Block 回调、C 函数调用、协议实现等高级能力再配合defineStruct接口3 行代码即可支持自定义 Struct 类型在 JS 与 OC 之间自由转换。本文将用最短路径带你吃透这套机制。什么是 JSPatch 扩展机制JSPatch 的核心是一个极小的引擎源码仅 3 个文件JPEngine.hJPEngine.mJSPatch.js引擎本身只负责JS 调 OC 方法这件事而 Block 回调、C 函数调用、协议定义等高级功能全部以**扩展Extension**的形式独立放在Extensions/目录中。每个扩展都继承自JPExtension基类定义见 JPEngine.h它要求实现一个类方法 (void)main:(JSContext *)context;这个方法的职责是往 JS 引擎的JSContext里注入若干全局函数如block()、defineCFunction()。注入后你的 JS 脚本就能直接调用这些函数——这就是 JSPatch 扩展机制的完整原理。1行代码动态加载扩展addExtensions 完整指南 加载扩展只需要一行代码调用JPEngine的类方法[JPEngine addExtensions:[JPBlock, JPCFunction, JPProtocol]];addExtensions:的实现在 JPEngine.m它会遍历传入的类名数组通过NSClassFromString找到对应的扩展类并逐个调用其main:方法完成注入。⚠️ 新手常见误区顺序要求必须先把扩展的源码加入工程编译再调用addExtensions:类名即字符串数组元素是类名字符串写错会静默失败注意检查加载时机建议放在startEngine之后、执行任何 JS 脚本之前。内置扩展清单按需加载即可扩展源码位置提供的 JS 能力JPBlockExtensions/JPBlock/block()从 JS 向 OC 传递 Block 回调JPCFunctionExtensions/JPCFunction/JPCFunction.hdefineCFunction()调用系统 C 函数JPStructPointerExtensions/JPCFunction/JPStructPointer.mnewStruct()/pvalStruct()操作 Struct 指针JPProtocolExtensions/JPProtocol.hdefineProtocol()用 JS 定义并实现协议JPNumberExtensions/JPNumber.h修复 iOS 7 下NSNumber的精度问题JPLockerExtensions/JPLocker.h跨 JS/OC 互斥锁解决多线程调用冲突JPDispatchExtensions/JPDispatch.h补充 GCD 调度函数JPCleanerExtensions/JPCleaner.hcleaner帮助 JS 持有对象正确释放所有扩展源码集中在 Extensions/ 目录可按需挑选保持包体积最小。3行代码支持自定义Struct类型defineStruct 使用教程CGRect、CGPoint、CGSize、NSRange 这 4 个 Struct 是 JSPatch 内置支持的在 JPEngine.m 的JPForwardInvocation中硬编码处理。但业务里经常遇到自定义 Struct怎么办✨ 调用JPEngine的defineStruct:接口声明见 JPEngine.h3 行代码搞定[JPEngine defineStruct:{ name: MyPoint, types: ff, keys: [x, y] }];三个键的含义键含义示例nameOC 中的 Struct 类型名MyPointtypes各成员的类型编码串ffloatddoubleiint……ff表示两个 floatkeysJS 侧对应的属性名[x, y]注册之后效果立竿见影OC 方法返回该 Struct 时JS 里自动得到一个普通对象{x: 10, y: 20}JS 向 OC 方法传入该 Struct 时直接传 JS 对象即可引擎自动还原为 C 内存布局。注册逻辑见 JPEngine.m定义被存入_registeredStruct字典JPForwardInvocation转发调用时会按类型编码自动完成双向转换。Struct 指针也能操作newStruct 与 pvalStruct如果 OC 方法接收的是Struct 指针如CGPoint *则需要额外一步先newStruct分配内存再传指针用完用pvalStruct读取——实现在 JPStructPointer.mvar p newStruct(CGPoint, {x: 1, y: 2}); // 分配并填充 var v pvalStruct(CGPoint, p); // 读回 {x:1, y:2}进阶3行JS调用系统C函数JSPatch 扩展机制不止于 Struct。加载JPCFunction扩展后可在 JS 里声明并调用任意系统 C 函数如 CoreFoundation 的CFStringCreateWithCString核心源码见 JPCFunction.m。它借助 JPLibffi/libffi完成函数签名解析因此自定义 Struct 也能作为 C 函数的参数与返回值传递。新手避坑清单 忘记加扩展源码addExtensions:只是加载前提是扩展的 .m 文件已加入编译否则NSClassFromString返回空types 写错defineStruct的类型编码串必须与 C 内存布局严格一致float是f、double是d差一个字符都会导致数据错乱多线程冲突JS 与 OC 并发访问时建议同时加载JPLocker扩展对象释放JS 侧创建的 OC 对象若需提前释放配合JPCleaner使用。小结1 行代码addExtensions:→ 动态加载 JSPatch 扩展按需解锁 Block、C 函数、协议等能力3 行代码defineStruct:→ 让自定义 Struct 类型在 JS 与 OC 之间无缝互转所有扩展源码位于 Extensions/核心调度逻辑在 JPEngine.m建议对照源码阅读本文理解会更深。掌握 JSPatch 扩展机制你的 iOS 热修复与动态化玩法将再上一个台阶 【免费下载链接】JSPatchJSPatch bridge Objective-C and Javascript using the Objective-C runtime. You can call any Objective-C class and method in JavaScript by just including a small engine. JSPatch is generally used to hotfix iOS App.项目地址: https://gitcode.com/gh_mirrors/js/JSPatch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →