You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在iOS的JSContext或WKWebView中运行TypeScript代码?

在iOS的JSContext/WKWebView里跑TypeScript代码的解决办法

为啥直接用TS文件会返回undefined?

JSContext(JavaScriptCore框架)和WKWebView里的JS引擎只认原生JavaScript,TypeScript是JS的超集,带了类型注解、接口这些引擎看不懂的语法,直接加载TS文件会解析出错,最后就返回undefined了。

解决思路:先把TS编译成JS再用

1. 手动编译(用TypeScript官方编译器tsc)

  • 先装TypeScript:全局装的话用 npm install -g typescript,项目里装就用 npm install typescript --save-dev
  • 写你的TS代码(比如shared-lib.ts):
function calculate(param1: number, param2: number): number {
  return param1 + param2;
}
// 必须把函数挂到全局作用域,不然JSContext/WKWebView找不到
(window as any).calculate = calculate;
  • 编译TS到JS:
    • 先生成配置文件:tsc --init,然后改几个关键配置:
      • "target": "ES5"(兼容iOS老版本)
      • "outFile": "./shared-lib.js"(输出合并后的JS文件)
      • "module": "none"(避免模块系统导致全局访问不到函数)
    • 执行编译命令:tsc shared-lib.ts,就能得到shared-lib.js
  • 把编译好的shared-lib.js加到iOS项目里,和你之前用JS文件的方式一样

2. 复杂场景用构建工具(Webpack/Vite)

如果你的共享库依赖多、代码拆分复杂,用Webpack或Vite打包更省心:

  • 配置打包工具把TS打包成IIFE(立即执行函数)或UMD格式,确保函数暴露到全局
  • 打包后的JS文件直接丢iOS项目里用就行

集成到iOS项目后的代码示例

按你之前的Swift逻辑,换成编译后的JS文件就行:

let jsContext = JSContext()
// 加载编译好的shared-lib.js
guard let jsURL = Bundle.main.url(forResource: "shared-lib", withExtension: "js"),
      let jsScript = try? String(contentsOf: jsURL, encoding: .utf8) else {
    return
}
jsContext.evaluateScript(jsScript)

jsContext.setObject(10, forKeyedSubscript: NSString(string: "param1"))
jsContext.setObject(20, forKeyedSubscript: NSString(string: "param2"))

if let resultJSValue = jsContext.evaluateScript("calculate(param1, param2);"),
   let result = resultJSValue.toInt32() {
    print("计算结果:\(result)") // 会输出30
}

WKWebView里的用法注意

在WKWebView里用的话,要么在加载的HTML里引入编译后的JS,要么直接用evaluateJavaScript执行:

let webView = WKWebView(frame: .zero)
guard let jsURL = Bundle.main.url(forResource: "shared-lib", withExtension: "js"),
      let jsScript = try? String(contentsOf: jsURL, encoding: .utf8) else {
    return
}

// 先加载JS代码
webView.evaluateJavaScript(jsScript) { _, error in
    if let error = error {
        print("加载JS失败:\(error)")
        return
    }
    // 调用calculate函数
    webView.evaluateJavaScript("calculate(10,20)") { result, error in
        if let result = result as? Int {
            print("WKWebView计算结果:\(result)")
        }
    }
}

内容的提问来源于stack exchange,提问作者balazs630

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:05:23