WebView中WebSocket连接失败,返回错误码1006求助
WebView中WebSocket连接失败返回错误码1006的问题
我在HTML页面中实现了一个简单的WebSocket,在所有浏览器中都能正常连接运行,但加载到Android App的WebView中时,连接失败并返回错误码1006。由于连接的是不同的URL/端点,我怀疑这是CORS问题。应用最低兼容API 23。
相关代码
HTML页面代码
<!DOCTYPE html> <html> <body> <h1>Socket Connect</h1> <div id="container"></div> </body> <script> const div = document.getElementById('container'); try { console.log('connect'); var ws = new WebSocket('wss://anotherserver.com:3000'); ws.binaryType = 'arraybuffer'; } catch (err) { } ws.onerror = function (error) { // 错误信息始终为空 console.log('error'); }; ws.onopen = function () { div.textContent = 'Opened'; console.log('opened'); }; ws.onclose = function (error) { // 始终返回1006 div.textContent = error.code; console.log(error.code); }; </script> </html>
已配置的WebView设置
我查阅相关内容后已配置以下代码:
myWebView.getSettings().setAppCacheEnabled(true); myWebView.getSettings().setDatabaseEnabled(true); myWebView.getSettings().setDomStorageEnabled(true); myWebView.getSettings().setCacheMode(currentCacheMode); /* 若缓存未过期则使用缓存 */ myWebView.getSettings().setJavaScriptEnabled(true);
同时也在Manifest中配置了cleartext支持。
解决方法
1. 配置WebView跨域与混合内容支持
API 23+的WebView对跨域和混合内容有严格限制,添加以下配置:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // 允许混合内容加载,适配WSS跨域场景 myWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } // 允许跨域资源访问 myWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); myWebView.getSettings().setAllowFileAccess(true);
2. 自定义WebViewClient避免拦截请求
确保WebViewClient不会拦截WebSocket连接请求:
myWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { // 不拦截任何URL加载,包括WebSocket连接 return false; } });
3. 排查SSL证书问题(针对WSS)
错误码1006常和SSL证书验证失败有关,测试环境下可临时忽略证书错误(上线前必须修复证书问题):
myWebView.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // 仅测试用,上线请删除此代码,改用信任的证书 handler.proceed(); } });
4. 开启WebView调试定位问题
开启WebView调试后,用Chrome工具查看详细错误日志:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); }
打开Chrome浏览器输入chrome://inspect,连接设备后查看WebView的Console日志,获取更具体的错误原因。
内容的提问来源于stack exchange,提问作者user1978109
相关产品推荐
相关产品推荐

