Meteor 1.8.2 Android端热代码推送(HCP)异常问题求助
结合你描述的环境差异(Android版本、网络类型)以及日志里的WebSocket连接失败问题,我整理了几个针对性的排查方向,你可以逐一尝试:
排查Wi-Fi网络的WebSocket拦截/限制
很多路由器或企业级Wi-Fi会对WebSocket连接做拦截、端口过滤,或者启用了HTTP/2等协议导致SockJS(Meteor依赖的WebSocket兼容层)的 fallback机制失效。你可以先尝试强制Meteor客户端禁用WebSocket,改用轮询方式:
在客户端初始化代码中添加:if (Meteor.isCordova) { Meteor.connection._stream.socketConstructor = false; // 禁用WebSocket,强制使用XHR轮询 }如果这样HCP恢复正常,说明Wi-Fi环境确实拦截了WebSocket连接,后续可以针对性调整路由器规则,或者让Meteor优先使用其他SockJS传输方式。
检查Android 9的网络安全配置
Android 9开始默认收紧了网络安全策略,虽然你的日志里是wss(加密连接),但如果Wi-Fi环境存在代理、或者服务器证书在Android 9上不被信任,会导致TLS握手失败,进而触发WebSocket连接提前关闭。
你可以在Cordova项目的res/xml/network_security_config.xml中添加信任配置:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">xxx.xxx.com</domain> <!-- 如果是自签名证书,还需要添加信任的证书 --> <trust-anchors> <certificates src="@raw/your_certificate"/> </trust-anchors> </domain-config> </network-security-config>同时确保AndroidManifest.xml中引用了这个配置:
android:networkSecurityConfig="@xml/network_security_config"。验证Meteor SockJS与Android 9 WebView的兼容性
Meteor 1.8.2对应的SockJS版本可能和Android 9内置的WebView(Chrome 73左右)存在兼容性问题,而Android 5.1.1的旧WebView没有这个问题。你可以尝试升级项目中的SockJS依赖,或者替换为最新的SockJS客户端包,重新打包测试。检查服务器端反向代理的WebSocket配置
如果你的Meteor服务器前端有Nginx等反向代理,需要确保代理正确处理WebSocket的升级请求。比如Nginx需要添加以下配置:location /sockjs { proxy_pass http://your_meteor_server; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 3600s; // 延长超时时间,避免连接提前关闭 }尤其是Wi-Fi环境下(比如局域网访问),代理的路由或超时设置可能导致WebSocket连接无法建立。
直接测试Wi-Fi下的WebSocket连通性
用adb shell在Android 9设备上执行curl命令,直接测试WebSocket连接:curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: test-key" wss://xxx.xxx.com/sockjs/133/x01eemtg/websocket如果命令返回错误,说明是网络或服务器端问题;如果能正常建立连接,那问题可能出在Cordova/WebView的配置上。
内容的提问来源于stack exchange,提问作者sim0ne

