在APP端 IOS下 webview引入的H5地址连接 H5链接里面有iframe标签 uni-app evalJS方法不执行
在APP端 IOS下 webview引入的H5地址连接 H5链接里面有iframe标签 uni-app evalJS方法不执行
示例代码:
APP 端
<!-- 页面结构 -->
<view @click="handleDialog" style="font-size: 40px;">
传参给H5
</view>
<web-view
id="webViewId"
src="http://192.168.2.71:8080/index.html"
webview-styles="{ progress: false }"
class="webview">
</web-view>
// APP调用方法传参到webview引用的H5
// 方法实现
handleDialog() {
const webviewContext = uni.createWebviewContext('webViewId');
if (webviewContext != null) {
console.log("[METHOD1] 成功创建WebView上下文对象");
console.log("[METHOD1] 开始执行JavaScript代码...")
// 在WebView中执行我们构造的JavaScript代码
webviewContext.evalJS('alert(999)');
}
H5端
访问地址: http://192.168.2.71:8080/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<iframe
src="https://www.baidu.com/"
id="888"
sandbox="allow-scripts allow-same-origin"
style="width: 100%; height: 500px"
frameborder="0">
</iframe>
</body>
</html>
操作步骤:
使用官方提供的项目 Hello uvue 或者任意 Unaipp x 框架
在index.uvue页面写 web-view 标签 src引入一个Html地址 同时增加一个方法获取到该 web-view 并同时执行 webviewContext.evalJS('alert(999)')
web-view 引入了 http://192.168.2.71:8080/index.html
这个html里面 引入了一个 iframe标签引入了谷歌地图
然后在ios 系统下 webviewContext.evalJS('alert(999)') IOS没有执行 安卓是可以的
预期结果:
Ios系统下 evalJS 方法执行
实际结果:
Ios下 evalJS 方法不执行
bug描述:
使用官方提供的项目 Hello uvue 或者任意 Unaipp x 框架
在index.uvue页面写 web-view 标签 src引入一个Html地址 同时增加一个方法获取到该 web-view 并同时执行 webviewContext.evalJS('alert(999)')
web-view 引入了 http://192.168.2.71:8080/index.html
这个html里面 引入了一个 iframe标签引入了谷歌地图
然后在ios 系统下 webviewContext.evalJS('alert(999)') 没有执行 安卓是可以的
注意:
经过我的测试 iframe标签里面设置 baidu.com 等待大约30 - 60s 该方法是可执行的
如果引入谷歌地图 会一直不执行

更多关于在APP端 IOS下 webview引入的H5地址连接 H5链接里面有iframe标签 uni-app evalJS方法不执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于在APP端 IOS下 webview引入的H5地址连接 H5链接里面有iframe标签 uni-app evalJS方法不执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个典型的iOS WebView跨域安全限制问题。在iOS系统中,当WebView内嵌了跨域iframe时,evalJS方法的执行会受到严格限制。
问题核心在于:iOS的WKWebView对跨域iframe中的JavaScript执行有更强的安全策略。当iframe加载外部域名(如百度、谷歌地图)时,主页面与iframe属于不同源,iOS会阻止evalJS方法直接注入和执行脚本。
解决方案:
- 使用postMessage通信:在H5页面中添加消息监听,通过postMessage与iframe进行安全通信。
// 在H5页面中添加
window.addEventListener('message', function(event) {
if (event.data.type === 'evalJS') {
eval(event.data.code);
}
});
// uni-app端修改为
webviewContext.evalJS(`
window.postMessage({
type: 'evalJS',
code: 'alert(999)'
}, '*');
`);
- 延迟执行策略:在iframe加载完成后再执行evalJS
// 等待iframe加载
setTimeout(() => {
webviewContext.evalJS('alert(999)');
}, 1000);
- 检查WebView准备状态:确保WebView完全加载后再执行脚本
handleDialog() {
const webview = this.$scope.$getAppWebview();
const currentWebview = webview.children()[0];
currentWebview.addEventListener('loaded', () => {
const webviewContext = uni.createWebviewContext('webViewId');
webviewContext.evalJS('alert(999)');
});
}

