Swift使用JavaScriptCore加载JS库报Can't find variable: window错误如何解决
解决JavaScriptCore加载含window引用的JS库报错问题
报错原因
JavaScriptCore 是纯 JavaScript 运行时环境,默认没有内置浏览器宿主环境才提供的 window、document 等全局对象,依赖浏览器环境的 JS 库直接加载就会抛出 ReferenceError: Can't find variable: window 错误。
可行解决方案
方案1:在加载JS库前,提前向JS上下文注入Mock的window对象
这是兼容性最好、改动最小的方案,Swift 侧代码示例如下:import JavaScriptCore guard let context = JSContext() else { return } // 注入空window对象,可根据JS库的实际需求扩展属性 context.evaluateScript("var window = {};") // 可选:如果JS库用到console、localStorage等常见浏览器API,可一并Mock context.evaluateScript(""" var console = { log: function(msg) { // 可绑定Swift侧的日志打印逻辑 print(msg) } }; """) // 注入完成后再加载你的自定义JS库 if let jsPath = Bundle.main.path(forResource: "你的JS库文件名", ofType: "js"), let jsContent = try? String(contentsOfFile: URL(fileURLWithPath: jsPath)) { context.evaluateScript(jsContent) }方案2:批量替换JS内容中的window引用为全局通用对象
无需修改原始JS文件,在加载JS字符串时全局替换window.为JavaScriptCore支持的全局对象globalThis.即可:let modifiedJS = originalJSContent.replacingOccurrences(of: "window.", with: "globalThis.") context.evaluateScript(modifiedJS)方案3:修改原始JS库做环境兼容
如果你有权限修改自定义JS库的源码,可以在JS文件开头添加兼容逻辑,适配多运行环境:// 兼容浏览器和JavaScriptCore环境 const globalRoot = typeof window !== 'undefined' ? window : globalThis; // 后续所有原本调用window的位置都替换为globalRoot即可 globalRoot.customFunc = function() { /* 你的逻辑 */ }
注意事项
如果你的JS库依赖window.setTimeout、window.fetch等浏览器原生API,需要单独为这些API在Mock的window对象上绑定对应的Swift侧实现,否则仍然会报错。
内容的提问来源于stack exchange,提问作者Sherin
相关产品推荐
相关产品推荐

