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

iOS14.0-14.4下WKWebView注入含变量函数的JS类失效问题

问题根因

iOS 14.0~14.4 内置WebKit的JavaScriptCore引擎未实现ES2022标准的类静态公共字段语法支持,你注入的JS代码中static age;、static height;属于该语法范畴,会导致整个class代码块解析失败,注入的脚本完全不执行。其余代码逻辑(包括静态方法、模板字符串、消息发送逻辑)在iOS14全版本均兼容,无需调整。

适配方案

直接替换JS代码即可,Swift端的WKWebView注入逻辑无需任何修改。调整后的JS完全保留原有调用方式,前端侧调用JavascriptClass.openLogin()、读写JavascriptClass.age/JavascriptClass.height、调用JavascriptClass.getInfo()的写法没有任何变化,兼容iOS 11+所有WKWebView版本:

enum Constants {
   static let loginMessageHandler = "loginMessageHandler"

   static let js = """
   class JavascriptClass {

       static openLogin () {
           if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.loginMessageHandler) {
               window.webkit.messageHandlers.loginMessageHandler.postMessage({
                   "message": "Login"
               });
           }
       }

       static getInfo() {
           if (this.age && this.height) {
               return `{"age": "${this.age}", "height": "${this.height}"}`;
           }
           return null;
       }
   }
   // 类外挂载静态属性,替代类内静态字段声明,兼容低版本
   JavascriptClass.age = null;
   JavascriptClass.height = null;
   """
}
额外注意
  • 原代码模板字符串内的\"属于冗余转义,模板字符串中直接书写双引号不会有语法问题,上述代码已做清理,不影响原有逻辑。
  • 如果需要兼容iOS14及更低版本,注入的JS请避免使用ES2022及更新版本的语法,包括类私有字段#xxx、类实例公共字段、顶层await、Object.hasOwn()等,必要时可通过Babel将代码转译至ES2020标准后再注入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:36:15