Android 不行,iOS 可以。请 Android 同学修复一下。
问题概述
标题:开发者工具"不校验合法域名"设置对 Android WebSocket 连接不生效
严重程度:高(阻碍本地开发)
问题类型:功能缺陷
详细描述
在微信开发者工具中,即使勾选了"本地设置 → 不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书"选项,WebSocket 连接仍然被域名校验机制拦截,导致连接失败。
复现步骤
- 环境配置
- 打开微信开发者工具
- 进入"详情" → "本地设置"
- ✅ 勾选"不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书"
- 发起 WebSocket 连接
- const socket = io('ws://192.168.31.145:8000', {
- path: '/socket.io/',
- transports: ['websocket']
- });
- 观察结果
- 连接短暂成功(收到 connect 事件)
- 立即断开(收到 disconnect 事件)
- 错误信息:{errMsg: "fail:url not in domain list"}
预期行为
勾选"不校验合法域名"后:
- ✅ 允许连接到局域网 IP 地址(如 192.168.x.x)
- ✅ 允许使用 ws://(非加密)协议
- ✅ 连接应保持稳定,不因域名校验而断开
实际行为
勾选"不校验合法域名"后:
- ❌ WebSocket 连接仍被域名白名单机制拦截
- ❌ 连接在握手成功后立即断开
- ❌ 控制台报错:"fail:url not in domain list"
- ❌ 与"不校验合法域名"的预期行为不符
前端日志(关键证据)
[00:09:36 GMT+0800 (CST)] === 测试1: 使用新 SocketTask API ===
index.ts:219 [00:09:36 GMT+0800 (CST)] 开始连接...
index.ts:219 [00:09:36 GMT+0800 (CST)] ✅ wx.connectSocket 调用成功
index.ts:219 [00:09:36 GMT+0800 (CST)] ✅ SocketTask.onOpen 触发
index.ts:219 [00:09:36 GMT+0800 (CST)] - header: {"Connection":"Upgrade","Sec-WebSocket-Accept":"DKfV+Nr1FXd88mM8q7nKRzQYQZ4=","Upgrade":"websocket","date":"Wed, 07 Jan 2026 16:09:36 GMT","server":"uvicorn"}
index.ts:219 [00:09:36 GMT+0800 (CST)] 📤 发送消息: Hello from SocketTask!
index.ts:219 [00:09:36 GMT+0800 (CST)] ✅ 消息发送成功
index.ts:219 [00:09:36 GMT+0800 (CST)] 📨 SocketTask.onMessage 收到消息:
index.ts:219 [00:09:36 GMT+0800 (CST)] - data: 0{"sid":"A9lneJVLGxc_IPEwAAAO","upgrades":[],"pingTimeout":60000,"pingInterval":25000,"maxPayload":1000000}
index.ts:219 [00:09:36 GMT+0800 (CST)] ❌ SocketTask.onError: {"errMsg":"fail:url not in domain list"}
index.ts:219 [00:09:37 GMT+0800 (CST)] 🔌 SocketTask.onClose 触发
index.ts:219 [00:09:37 GMT+0800 (CST)] - code: 1006
index.ts:219 [00:09:37 GMT+0800 (CST)] - reason:
index.ts:219 [00:09:45 GMT+0800 (CST)] === 测试2: 使用老 wx.onSocket* API ===
index.ts:219 [00:09:45 GMT+0800 (CST)] ⚠️ 不推荐使用,仅用于对比测试
WAServiceMainContext.js:1 MiniProgramError
wx.offSocketOpen is not a function
TypeError: wx.offSocketOpen is not a function
at ComponentCaller.testOldAPI (https://usr/chunk_11.appservice.js:2:1473)
at ComponentCaller.<anonymous> (https://lib/WAServiceMainContext.js:1:610114)
at c.testOldAPI (https://lib/WAServiceMainContext.js:1:738985)
at f (https://lib/WAServiceMainContext.js:1:496230)
at p.call (https://lib/WAServiceMainContext.js:1:496124)
at e.callListener (https://lib/WAServiceMainContext.js:1:546732)
at https://lib/WAServiceMainContext.js:1:547924
at a (https://lib/WAServiceMainContext.js:1:547138)
at o (https://lib/WAServiceMainContext.js:1:547419)
at e.dispatch (https://lib/WAServiceMainContext.js:1:547772)
errorReport @ WAServiceMainContext.js:1
thirdErrorReport @ WAServiceMainContext.js:1
(anonymous) @ WAServiceMainContext.js:1
(anonymous) @ WAServiceMainContext.js:1
f @ WAServiceMainContext.js:1
call @ WAServiceMainContext.js:1
O @ WAServiceMainContext.js:1
f @ WAServiceMainContext.js:1
call @ WAServiceMainContext.js:1
callListener @ WAServiceMainContext.js:1
(anonymous) @ WAServiceMainContext.js:1
a @ WAServiceMainContext.js:1
o @ WAServiceMainContext.js:1
dispatch @ WAServiceMainContext.js:1
f @ WARenderContext.js:1
dispatchEvent @ WARenderContext.js:1
triggerTouchEvent @ WARenderContext.js:1
(anonymous) @ WARenderContext.js:1
Ut @ WAServiceMainContext.js:1
handleTap @ WARenderContext.js:1
handleTrackEnd @ WARenderContext.js:1
dispatchTouchEvent @ WARenderContext.js:1
(anonymous) @ WARenderContext.js:1
(anonymous) @ WARenderContext.js:1
index.ts:219 [00:09:51 GMT+0800 (CST)] === 测试3: 最简连接(无操作)===
index.ts:219 [00:09:51 GMT+0800 (CST)] ✅ 连接调用成功
index.ts:219 [00:09:51 GMT+0800 (CST)] ❌ 连接错误: {"errMsg":"fail:url not in domain list"}
index.ts:219 [00:11:16 GMT+0800 (CST)] 🔌 连接已关闭: code=1000, reason=
后端日志(证明连接确实成功)
# Engine.IO 握手成功
68r8MqovBwyVwgasAAAA: Sending packet OPEN data {'sid': '68r8MqovBwyVwgasAAAA', ...}
68r8MqovBwyVwgasAAAA: Upgrade to websocket successful
INFO: connection open
# Socket.IO 连接建立
🔌🔌🔌 [CONNECT EVENT] Socket.IO 连接建立: w-TaGkuOTSARZ4TmAAAB
[CONNECT EVENT] auth: None
结论:后端日志证明连接完全成功,问题出在前端小程序的域名校验机制。
环境信息
影响范围
受影响的开发场景
- 本地 WebSocket 调试:无法连接本地开发服务器
- 局域网联调:无法通过局域网 IP 进行真机测试
- Socket.IO 开发:所有使用 Socket.IO 的实时通信功能
影响的开发者
- 使用 WebSocket 进行实时通信的小程序开发者
- 需要在本地调试 Socket.IO 的开发团队
- 需要局域网联调的多端开发团队
已尝试的解决方案
方案结果说明勾选"不校验合法域名"❌ 无效问题依然存在
技术分析
问题根源
"不校验合法域名"选项的实现可能存在以下问题:
- HTTP/HTTPS 请求生效,WebSocket 不生效
- wx.request 正常使用局域网 IP ✅
- wx.connectSocket 仍被域名校验拦截 ❌
期望修复
短期修复
- 确保"不校验合法域名"对 WebSocket 连接生效
- 保持配置的一致性(HTTP 和 WebSocket 应使用相同的校验规则)
