JSDebugger 入门教程:无需 JSExport 也能用 JS 调用任意 Objective-C 方法

发布时间:2026/8/18 17:03:01
JSDebugger 入门教程:无需 JSExport 也能用 JS 调用任意 Objective-C 方法 JSDebugger 入门教程无需 JSExport 也能用 JS 调用任意 Objective-C 方法【免费下载链接】JSDebuggerJavaScript-Based Debugger For Inspecting Running State Of Your Application项目地址: https://gitcode.com/gh_mirrors/js/JSDebuggerJSDebugger 是一款基于 JavaScript 的 iOS 运行时调试工具它的核心能力是让你在不编写任何 JSExport 的情况下直接用 JS 调用 App 内任意 Objective-C 方法实时查看并动态修改运行状态。这篇 JSDebugger 入门教程会带你从零开始集成、运行并掌握方法调用、属性读写、热重载调试等核心玩法帮助你快速上手这套免 JSExport 调用 Objective-C 方法的黑科技。什么是 JSDebuggerJSDebugger 是一套面向 iOS 开发者的运行时检查Runtime Inspection工具。它内置了 JavaScriptCore 引擎并把 Objective-C 的类、实例、方法、属性、结构体、指针等全部映射到 JavaScript 世界。你只需写一行UIView.alloc().init()就能在 JS 环境里创建一个真实的 UIView 对象——整个过程完全不需要额外声明 JSExport 协议。它的原理并不神秘引擎在JDEngine初始化时通过运行时Runtime动态获取方法签名借助 libffiSource/Core/FFI/完成 JS 与 OC 之间的类型转换与函数调用调用入口见 JDMethod4JS.m 与 JDMethodBridge.m。为什么需要它JSExport 的两大痛点传统 iOS 与 JS 交互方案如 JavaScriptCore 的 JSExport 协议要求你为每个暴露给 JS 的方法手动编写桥接代码既繁琐又难以覆盖全量方法。JSDebugger 直接绕开了这一限制对比维度传统 JSExport 方案JSDebugger桥接声明需手动实现协议完全免声明可调用范围仅限声明过的方法任意 Objective-C 方法属性访问需逐一暴露自动映射 Setter调试方式编译期固定运行时热更新快速开始集成 JSDebugger 的完整步骤JSDebugger 以 CocoaPods 组件形式提供见 JSDebugger.podspec集成只需三步第一步添加依赖并拉取代码在 Podfile 中加入pod JSDebugger随后执行pod install。若你想研究源码或跑通官方 Demo可以克隆仓库git clone https://gitcode.com/gh_mirrors/js/JSDebugger仓库内的JSDebuggerDemo/是一个可直接运行的完整示例工程。第二步启动引擎在AppDelegate或首个ViewController中启动全局引擎源码见 JDEngine.m#import JSDebugger/JSDebugger.h [[JDEngine engine] start];第三步执行 JS 脚本[[JDEngine engine] evaluateScriptAtPath:jsFilePath];也可以直接传入脚本字符串evaluateScript:引擎会先做语法检查再在 JS 全局上下文中执行。核心机制Objective-C 方法如何变成 JS 可调用JSDebugger 的调用规则非常直观底层只做了两件事规则实现在 JDMethod4JS.m所有冒号:替换为下划线_把 selector 的每一段拼接成一个字符串例如这个方法签名application:didFinishLaunchingWithOptions:在 JS 中调用时写作application_didFinishLaunchingWithOptions_(application, launchOptions)再比如系统方法setBackgroundColor:在 JS 中就是setBackgroundColor_(color)alloc与init则保持不变可链式调用var view UIView.alloc().init(); view.setBackgroundColor_(UIColor.redColor());实例调用从创建对象到调用方法以官方 demo.js 为例你可以像写普通 JS 一样操作 OC 对象var vc choose(ViewController)[0]; // 找到界面上的控制器 vc.printName_(Hello JSDebugger); // 调用实例方法 vc.view().setBackgroundColor_(UIColor.orangeColor()); // 链式调用类方法、实例方法、链式调用都无需任何桥接声明开箱即用。Getter 与 Setter容易踩坑的细节Setter 可以直接用属性语法JSDebugger 会自动路由到对应的 setter 方法view.backgroundColor UIColor.redColor();但 Getter 必须使用方法形式属性直接取值是行不通的view.backgroundColor; // ❌ 错误不支持属性取值 view.backgroundColor(); // ✅ 正确请使用方法记住这个规则可以避免调试时踩坑。进阶技巧变长参数、Choose、Struct 与指针变长参数以 nil 结尾系统与自定义方法都支持例如NSArray.arrayWithObjects_(1, 2, 3)自定义方法ViewController.test_(1, 2, 3, 5, 7, 9, 8)同样有效。Choose 插件堆上对象搜索choose(ClassName)会扫描堆内存返回所有匹配该类的实例数组实现见 JDChoose.mmvar vc choose(XXXViewController); vc.isViewLoaded();结构体Struct可以当作普通 JS 对象读写甚至支持嵌套修改var frame vc.view().frame(); frame.origin.x 100; vc.view().frame frame;指针Pointer支持 int / double / char 指针传递配合allocAddressWithInt这类 OC 方法即可完成跨语言指针操作。关联对象Associate Object通过objc_setAssociatedObject设置的关联属性也能直接读写示例见 TestAssociateObject.m。Playground保存即生效的热重载调试JSDebugger 内置了Playground 热重载机制让你像调试网页一样调试 iOS写一个test.js文件通过JDLocalFileObserver接口见 JDLocalFileObserver.h监听它每次按Command S保存脚本都会自动重新执行self.fileWatcher [[JDLocalFileObserver alloc] initWithFilePath:jsFilePath changeBlock:^{ dispatch_async(dispatch_get_main_queue(), ^{ [[JDEngine engine] evaluateScriptAtPath:jsFilePath]; }); }]; [self.fileWatcher start];改代码、保存、看效果整个调试循环几乎零成本不需要时记得调用stop释放监听。小结JSDebugger 把 Objective-C 运行时能力完整地开放给了 JavaScript免 JSExport 调用任意 OC 方法、支持属性 Setter、变长参数、Choose 堆搜索、Struct、指针与关联对象再配合 Playground 热重载堪称 iOS 动态调试的一把利器。打开JSDebuggerDemo/demo.js跟着敲一遍你就能体会到用 JS 操控整个 App的爽快感。还等什么赶快克隆仓库动手试试吧【免费下载链接】JSDebuggerJavaScript-Based Debugger For Inspecting Running State Of Your Application项目地址: https://gitcode.com/gh_mirrors/js/JSDebugger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考