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
相关产品推荐
相关产品推荐

