在Swift中使用JavaScriptCore时出现jQuery未定义的ReferenceError问题
解决JavaScriptCore中找不到jQuery的问题
别着急,这个报错ReferenceError: Can't find variable: jQuery的原因很明确:JavaScriptCore的运行环境是完全独立的,不像浏览器会自动加载你引入的外部脚本,你的业务JS代码里用到了jQuery,但当前JSContext里根本没有加载过jQuery的定义,所以才会找不到变量。
下面是具体的解决步骤:
1. 准备jQuery库文件
先把jQuery的源码文件(比如jquery.min.js)添加到你的Swift项目中,确保它被包含在项目的bundle里(在Xcode的File Inspector里勾选你的target)。
2. 在Swift中先加载jQuery,再加载你的业务JS
JavaScriptCore的执行顺序很重要,必须先让jQuery的代码在JSContext中运行,把jQuery和$变量注入到环境里,之后再加载你的业务JS文件。示例代码如下:
import JavaScriptCore // 初始化JSContext let jsContext = JSContext() // 加载并执行jQuery源码 guard let jqueryFilePath = Bundle.main.path(forResource: "jquery.min", ofType: "js"), let jquerySource = try? String(contentsOfFile: jqueryFilePath) else { print("无法加载jQuery文件") return } jsContext?.evaluateScript(jquerySource) // 加载并执行你的业务JS文件 guard let yourScriptPath = Bundle.main.path(forResource: "你的业务脚本文件名", ofType: "js"), let yourScriptSource = try? String(contentsOfFile: yourScriptPath) else { print("无法加载业务JS文件") return } jsContext?.evaluateScript(yourScriptSource) // 调用你的setOldCities函数(示例) if let setOldCitiesFunc = jsContext?.objectForKeyedSubscript("setOldCities") { setOldCitiesFunc.call(withArguments: ["Beijing, Shanghai, Guangzhou"]) }
额外注意事项
- 确认你的业务JS里的
$或jQuery调用是在jQuery加载之后执行的,顺序错了还是会报错。 - 你提供的JS代码里
webkit.mes...看起来是未完成的代码,如果是要和Swift通信,记得补全为webkit.messageHandlers相关的调用,这部分需要和Swift端的消息处理逻辑对应。
内容的提问来源于stack exchange,提问作者TechChain
相关产品推荐
相关产品推荐

