React项目中Android WebView调用JavaScript方法在部分机型失效?
在开发H5页面时遇到个奇怪问题,通过React组件调用Android WebView的JavaScript接口,在Android 10以下机型能正常触发,但到了Android 11及以上就直接失效了。
我尝试过在WebView设置里开了setJavaScriptEnabled和setWebViewClient,代码示例:
function handleClick() {
try {
window.android_bridge?.callNative('test')
} catch(e) {
console.error('调用失败:', e)
}
}
return (
)
但点击按钮时控制台报”Not allowed to load local resource”,检查了Android端代码,addJavascriptInterface已经正确绑定。难道是Android版本升级后对跨域有新限制?求大佬指点排查方向…
setJavaScriptEnabled(true)和setWebViewClient,还需要在WebView配置里加上:如果你的H5页面是通过本地assets加载的(比如file://),并且JavaScript里调用了绑定的android_bridge,那必须要开启
setAllowUniversalAccessFromFileURLs和allowFileAccessFromFileURLs。否则WebView会拦截这类调用并报"Not allowed to load local resource"。另外确认一下你的addJavascriptInterface是不是这样写的:
还有别忘了在AndroidManifest.xml里加上:
如果页面有加载远程资源,建议把CSP(Content Security Policy)也加上:
先说解决方法吧,你需要确保以下几点:
1. **设置正确的安全选项**:在Android端初始化WebView时,除了
setJavaScriptEnabled,还需要加上setAllowFileAccess(false)和setAllowContentAccess(false),这样可以避免"local resource"相关的错误。2. **使用HTTPS加载页面**:如果你的H5页面是通过HTTP协议加载的,可能会被新的安全策略拦截。尽量改为HTTPS。
3. **检查CORS问题**:虽然你说addJavascriptInterface已经绑定了,但Android 11增加了跨域限制,可以尝试在WebView中添加以下配置:
4. **调整React代码**:把你的JS调用稍微改一下,增加一个判断确保window.android_bridge存在后再调用:
最后提醒一下,Android WebView的安全策略改来改去,有时候真让人头疼。如果还是不行,建议让安卓同事抓个日志看看具体报错信息。前端这边能做的也就这么多了。