iOS 15下WKWebView调用evaluateJavaScript执行WebCrypto解密报错如何解决?
核心原因
报错信息中的y.importKey是JS代码压缩混淆后的缩写,实际对应WebCrypto的crypto.subtle.importKey接口,该接口未定义是iOS 15系统对WKWebView做的权限调整导致的:
从iOS 15开始,苹果遵循W3C标准规范,将WebCrypto的
subtle系列加密接口限制为仅在安全上下文中可访问。不安全上下文(包括HTTP协议页面、本地file协议加载的静态资源、自定义scheme加载的页面)下crypto.subtle会默认被置为undefined,iOS 14及更早版本无该限制,因此升级系统后功能失效。
修复方案
- 优先将加载的页面切换到HTTPS协议,本地调试时使用localhost作为访问地址,安全上下文下WebCrypto接口会自动恢复可用。
- 如果业务必须使用非安全上下文(如加载本地离线包、自定义scheme路由场景),可以通过WKWebView配置项强制开启非安全上下文下的WebCrypto权限,Swift示例代码如下:
let webConfig = WKWebViewConfiguration() if #available(iOS 15.0, *) { // 强制开启非安全上下文WebCrypto支持 webConfig.preferences.setValue(true, forKey: "enableInsecureContextWebCrypto") } // 若使用file协议加载本地资源,还需额外开启文件访问权限 webConfig.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") let webView = WKWebView(frame: view.bounds, configuration: webConfig)
- JS侧可新增前置兼容判断,避免未定义报错阻断流程,示例代码如下:
// 调用解密逻辑前先校验WebCrypto可用性 if (!window.crypto?.subtle) { console.error("当前环境不支持WebCrypto API,请检查页面加载协议"); // 可在此处降级走其他加密方案 } else { // 原有importKey、解密逻辑 }
内容的提问来源于stack exchange,提问作者Kishore Suthar
相关产品推荐
相关产品推荐

