更新记录
1.0.3(2026-09-09)
- 更新readme
1.0.2(2026-09-09)
- 更新插件名称
1.0.1(2026-09-09)
- 完善readme文档
平台兼容性
uni-app(4.75)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | × | × | √ | 1.0.0 | √ | 1.0.0 | 5.0 | 1.0.0 | 12 | 1.0.0 | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.75)
| Chrome | Safari | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|---|---|
| × | × | 5.0 | 1.0.0 | 12 | 1.0.0 | × | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| √ | √ | √ |
jagger-wifi-tcp
史上最全wifi操控API + TCP SOCKET的物联网数据传输;
Wi-Fi 与 TCP Socket 能力可以单独使用,也可以结合使用:单独使用 Wi-Fi 能力管理连接、读取当前网络信息;单独使用 TCP Socket 能力,通过系统路由连接服务端并收发数据,无需由插件发起 Wi-Fi 连接。
结合使用时,设置 networkMode: 'wifi' 可让 TCP 通过 Wi-Fi 与设备通信。Android 将 Socket 绑定到插件管理的 Wi-Fi Network,域名解析也通过该 Network;iOS 将连接限定在 Wi-Fi 接口。这样可以减少系统默认路由选择及蜂窝网络对设备通信路径的影响,让网络通道更稳定。
快速上手(重点关注)
- 点击右上角“试用”按钮,并导入插件到宿主项目。
- iOS打包前,需要配置描述文件,对应2个能力见【iOS 打包前配置】(安卓可跳过)
- 使用项目证书(Android)/描述文件+证书(iOS)打包自定义基座
- 调用代码:
import * as connection from '@/uni_modules/jagger-wifi-tcp'
const listenerId = connection.onSocketMessage(event => {
console.log(event.socketId, event.data) // 0–255 字节数组,TCP 不保证消息边界
})
connection.connectWifi({
SSID: 'Device-AP',
password: 'your-device-password',
timeout: 30000,
success: wifiResult => {
if (wifiResult.verified === false) {
// 本示例采用保守策略:先让用户确认目标网络,再重新读取或进行设备身份验证。
console.warn('Wi-Fi 配置已接受,但尚未确认目标 SSID', wifiResult.errMsg)
return
}
connection.connectSocket({
host: '192.168.4.1',
port: 9000,
networkMode: 'wifi',
connectTimeout: 15000,
success: () => connection.writeSocket({ data: [0xAA, 0x01, 0xFF], fail: console.error }),
fail: console.error
})
},
fail: console.error
})
// 使用完后:
// connection.offSocketMessage(listenerId)
// connection.disconnectSocket({})
// connection.stopWifi({})
安装
把本目录复制到宿主项目 uni_modules。HBuilderX 4.75+,手机端 Vue 3 示例已提供。uni-app x 保留同一公共接口,宿主运行模式的最低系统要求可能更高,发布前需在实际宿主工程编译验收。
iOS 打包前配置
在 Apple Developer 的 Identifiers 页面选择与宿主 App Bundle ID 一致的 App ID,开启并保存以下两项能力:
- 开启 Access Wi-Fi Information:用于读取当前连接的 Wi-Fi 名称和 BSSID,对应
com.apple.developer.networking.wifi-info。 - 开启 Hotspot:对应 Xcode 中的 Hotspot Configuration,用于在 App 内按 SSID、密码连接 Wi-Fi,对应
com.apple.developer.networking.HotspotConfiguration。只开启 Access Wi-Fi Information 不能满足本插件的连接功能。
保存后,重新生成并下载该 App ID 对应的描述文件(.mobileprovision),替换 HBuilderX 打包配置中的旧描述文件,再制作 iOS 自定义基座或正式打包。
插件的内部已声明这两项能力,但不能代替开发者签名描述文件的配置,且权限用途描述由宿主统一在manifest.json中提供,插件不内置描述文案。
宿主权限配置
- 插件内部已包含 Android 权限和 iOS 能力声明,接入时无需再在宿主
manifest.json中额外添加同样的声明。 - iOS使用本插件完整 Wi-Fi/TCP 功能时,必须在宿主
manifest.json中配置下列两项描述。Apple 开发者后台启用能力及更新描述文件需接入方完成。
Android 权限清单
以下权限已声明在插件内。
| 权限 | 用途及当前插件的使用条件 |
|---|---|
android.permission.INTERNET |
建立 TCP Socket 并收发网络数据,包括局域网通信 |
android.permission.ACCESS_NETWORK_STATE |
读取网络能力和链路状态,识别可用 Wi-Fi Network |
android.permission.CHANGE_NETWORK_STATE |
请求 Wi-Fi Network,为设备热点连接和 Socket 绑定提供网络通道 |
android.permission.ACCESS_WIFI_STATE |
读取 Wi-Fi 开关、当前连接信息和扫描结果 |
android.permission.CHANGE_WIFI_STATE |
发起 Wi-Fi 扫描,以及旧版 Android 的 Wi-Fi 配置、连接和断开操作 |
android.permission.ACCESS_COARSE_LOCATION |
与精确定位权限一起用于兼容旧版 Wi-Fi 接口;当前代码在 Android 6+ 的扫描、读取、断开,以及需定位授权的配网调用前检查并申请 |
android.permission.ACCESS_FINE_LOCATION |
Wi-Fi 扫描、当前网络信息读取等操作所需的定位授权;Android 10 配网也走此权限检查。仅授予粗略定位不能替代精确定位要求 |
android.permission.NEARBY_WIFI_DEVICES |
当前代码在 Android 13+ 且宿主 targetSdk >= 33 时,为 connectWifi 申请;声明带 neverForLocation,不能替代扫描所需的定位权限 |
android.permission.ACCESS_LOCAL_NETWORK |
当前代码在 Android 17+ 且宿主 targetSdk >= 37 时,为 connectSocket 申请;宿主打包工具链需支持相应目标 SDK |
单独使用系统路由 TCP 不会因为调用 connectSocket 而申请 Wi-Fi 定位权限;Android 新版本的本地网络权限仍按上述条件处理。扫描需要系统 Wi-Fi 和定位服务处于开启状态,权限授权不等于开关已开启。
iOS 能力与权限用途描述清单
| 配置键 | 配置位置 | 用途 |
|---|---|---|
com.apple.developer.networking.HotspotConfiguration |
utssdk/app-ios/UTS.entitlements |
配置、连接已知 SSID,以及管理本应用添加的 Wi-Fi 配置;对应 Apple 后台 Hotspot 能力 |
com.apple.developer.networking.wifi-info |
utssdk/app-ios/UTS.entitlements |
读取当前 Wi-Fi 的 SSID/BSSID;对应 Access Wi-Fi Information 能力 |
NSLocalNetworkUsageDescription |
宿主 manifest.json → app-plus.distribute.ios.privacyDescription |
向用户说明访问局域网设备、进行 TCP 通信的用途 |
NSLocationWhenInUseUsageDescription |
宿主 manifest.json → app-plus.distribute.ios.privacyDescription |
向用户说明在读取当前 Wi-Fi 信息时申请使用期间定位的用途 |
getConnectedWifi 先尝试读取,必要时才申请定位;TCP 通信不会为读取 SSID 而主动申请定位。本插件未使用 Bonjour 服务发现,因此不需要为本插件添加 NSBonjourServices。
以下是使用完整 Wi-Fi/TCP 功能所需的 iOS 用途描述配置。该片段适用于当前 uni-app(非 uni-app x) 宿主:将文案改为实际业务用途后,合并到现有 manifest.json,不要覆盖 AppID、证书及其他配置。当前 demo 已包含这两项描述。uni-app x 的配置节点需按其对应版本文档填写。
{
"app-plus": {
"distribute": {
"ios": {
"deploymentTarget": "12.0",
"privacyDescription": {
"NSLocalNetworkUsageDescription": "用于与您选择的局域网设备建立 TCP 连接并收发数据。",
"NSLocationWhenInUseUsageDescription": "用于在您读取当前 Wi-Fi 信息时获取网络名称。"
}
}
}
}
}
Android 10 的配网/扫描需要定位授权;扫描还需开启系统 Wi-Fi 和定位服务。拒绝授权时插件返回失败,由页面提示用户检查系统设置。 声明、原生代码或签名配置变化后须重新制作自定义基座;仅更新页面不能使这些变化生效。
调用示例:由 App 连接 Wi-Fi 后连接 TCP
import * as connection from '@/uni_modules/jagger-wifi-tcp'
const listenerId = connection.onSocketMessage(event => {
console.log(event.socketId, event.data) // 0–255 字节数组,TCP 不保证消息边界
})
connection.connectWifi({
SSID: 'Device-AP',
password: 'your-device-password',
timeout: 30000,
success: wifiResult => {
if (wifiResult.verified === false) {
// 本示例采用保守策略:先让用户确认目标网络,再重新读取或进行设备身份验证。
console.warn('Wi-Fi 配置已接受,但尚未确认目标 SSID', wifiResult.errMsg)
return
}
connection.connectSocket({
host: '192.168.4.1',
port: 9000,
networkMode: 'wifi',
connectTimeout: 15000,
success: () => connection.writeSocket({ data: [0xAA, 0x01, 0xFF], fail: console.error }),
fail: console.error
})
},
fail: console.error
})
// 使用完后:
// connection.offSocketMessage(listenerId)
// connection.disconnectSocket({})
// connection.stopWifi({})
上述 IP、端口和密码均为示例,必须替换为设备实际配置。Wi-Fi 关联成功不代表 TCP 服务已经启动。
调用示例:手机已在系统设置中连接 Wi-Fi
无需再次调用 connectWifi。在 App 页面就绪后,由用户点击连接按钮调用以下函数:先启动观察,再读取当前 Wi-Fi,最后尝试绑定 Wi-Fi 建立 TCP。
import * as connection from '@/uni_modules/jagger-wifi-tcp'
function connectUsingCurrentWifi() {
connection.startWifi({
success: () => connection.getConnectedWifi({
success: result => {
console.log('当前 Wi-Fi', result.wifi)
connection.connectSocket({
host: '192.168.4.1', // 替换为设备地址
port: 9000, // 替换为设备 TCP 服务端口
networkMode: 'wifi',
connectTimeout: 15000,
success: result => console.log('TCP 已连接', result.state),
fail: error => {
// 9001004 可能是 Wi-Fi 路由尚未就绪;提示用户确认网络后再次点击连接。
// 不自动切换为 system,以免悄悄改变用户选择的连接路径。
console.error('TCP 连接失败', error.errCode, error.errMsg)
}
})
},
fail: error => console.error('读取当前 Wi-Fi 失败', error.errCode, error.errMsg)
}),
fail: error => console.error('启动 Wi-Fi 观察失败', error.errCode, error.errMsg)
})
}
// 绑定到页面的连接按钮;收到 TCP success 后才能调用 writeSocket。
// 页面使用收发功能时,按上一示例注册 onSocketMessage 并在退出时移除监听。
如果业务明确需要遵循系统默认路由,可以直接调用 connectSocket({ host, port, networkMode: 'system', ... }),不必调用 startWifi 或 connectWifi;此模式不保证访问 Android 插件请求的专用设备热点。
接口
所有异步操作接收 success / fail / complete,返回值格式为 { errCode, errMsg, ... };成功或失败只回调一次,随后执行 complete。不支持的操作明确走 fail。
平台支持表
✅ 表示该平台可以调用;❌ 表示系统不支持。iOS 不提供普通 App 扫描附近 Wi-Fi 的公开 API,因此 iOS 页面应让用户手动输入已知 SSID 和密码,再调用 connectWifi,不要调用 getWifiList。
| 接口 | Android | iOS | 说明 |
|---|---|---|---|
startWifi(options) |
✅ | ✅ | 初始化 Wi-Fi 状态观察,不会自动打开系统 Wi-Fi 开关 |
stopWifi(options) |
✅ | ✅ | 停止观察并取消等待;关闭 Wi-Fi 绑定的 TCP,保留 system TCP |
connectWifi(options) |
✅ | ✅ | 按已知 SSID、密码请求连接;iOS 不支持通过扫描结果选择或按 BSSID 定向连接 |
cancelWifiConnection(options) |
✅ | ✅ | 取消插件等待;iOS 已提交给系统的配网确认无法强制撤回 |
disconnectWifi(options) |
✅ | ✅ | iOS 只能移除本 App 添加的 SSID 配置,系统管理的网络需用户到系统设置断开 |
getConnectedWifi(options) |
✅ | ✅ | 读取当前网络;iOS 需要 Wi-Fi Information 能力并满足系统隐私条件,否则走 fail |
getWifiList(options) |
✅ | ❌ | Android 扫描附近网络;iOS 调用固定返回 9001001,不会返回列表 |
connectSocket(options) |
✅ | ✅ | 建立 TCP;networkMode: 'wifi' 在 iOS 表示限制使用 Wi-Fi 接口 |
disconnectSocket(options) |
✅ | ✅ | 取消连接中或关闭已连接 TCP |
writeSocket(options) |
✅ | ✅ | 发送 data: number[],每字节 0–255,每次 1–65536 字节 |
getSocketState(options) |
✅ | ✅ | 返回连接状态、地址参数和收发累计字节 |
onGetWifiList / offGetWifiList |
✅ | ❌ | Android 扫描结果事件;iOS 不会产生该事件 |
onWifiConnected / offWifiConnected |
✅ | ✅ | 插件主动连接 Wi-Fi 后的完整连接信息事件 |
onWifiConnectedWithPartialInfo / offWifiConnectedWithPartialInfo |
✅ | ✅ | 系统只能提供部分信息时的连接事件 |
onWifiStateChange / offWifiStateChange |
✅ | ✅ | Wi-Fi 路径丢失或请求释放等状态事件 |
onSocketStateChange / offSocketStateChange |
✅ | ✅ | TCP 状态事件 |
onSocketMessage / offSocketMessage |
✅ | ✅ | TCP 收包事件 |
onSocketError / offSocketError |
✅ | ✅ | TCP 错误事件 |
参数与行为
以下签名与 utssdk/interface.uts 一致。字段后的 ? 表示可选;这是签名说明,实际 JavaScript 调用时不写 ?。所有操作接口的 options 对象必须传入;没有业务参数且不需要回调时传 {}。操作接口同步返回 void,结果通过回调取得,不返回 Promise。监听接口使用独立的 callback / listenerId 入参,详见下方“监听”。
通用回调参数:ApiOptions
每个操作接口都接受以下三个字段;ApiCallback 的类型为 (result: ApiResult) => void。
| 入参字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
success |
ApiCallback |
否 | 不调用 | 操作成功时调用,result.errCode === 0 |
fail |
ApiCallback |
否 | 不调用 | 操作失败、超时、取消或不受支持时调用,result.errCode !== 0 |
complete |
ApiCallback |
否 | 不调用 | 在本次 success 或 fail 后调用,收到同一份结果 |
每次请求只完成一次。业务 success / fail 抛出异常时仍执行 complete;业务回调异常会记录到控制台,不中断插件后续通知。
只接收通用回调的接口
以下各接口的完整入参均为 options: ApiOptions,只有可选的 success、fail、complete,没有其他入参。表中的成功结果均另外包含公共字段 errCode、errMsg。
| 完整调用签名 | 行为 | 成功结果附加字段 |
|---|---|---|
startWifi({ success?, fail?, complete? }): void |
启动 Wi-Fi 网络观察;重复调用不会重复注册观察器,不会自动开启系统 Wi-Fi。成功仅表示观察已启动,不代表 Wi-Fi 路由已经就绪 | 无 |
stopWifi({ success?, fail?, complete? }): void |
停止观察、取消插件管理的 Wi-Fi 等待;Android 同时取消扫描并释放请求的 Network,iOS 取消当前信息读取等待。关闭绑定 Wi-Fi 的 TCP,保留已建立的 system TCP;不会关闭系统 Wi-Fi 开关,也不会移除通过 onX 注册的业务监听 | 无 |
cancelWifiConnection({ success?, fail?, complete? }): void |
取消当前 Wi-Fi 连接等待,原连接请求以 9001007 结束。Android 还会释放插件请求的 Wi-Fi Network,即使已连接,也可能因此关闭绑定该 Network 的 TCP;iOS 只能取消插件等待,不能撤回已经提交的系统配网操作 |
无 |
getConnectedWifi({ success?, fail?, complete? }): void |
读取当前 Wi-Fi;读取不到 SSID 或不满足权限条件时走 fail。iOS 必要时申请定位,读取等待最长 30000 ms,此时长不可通过入参调整 |
wifi: WifiInfo |
getWifiList({ success?, fail?, complete? }): void |
Android 发起扫描,系统接受请求后最多等待 20000 ms;等待中重复调用返回 9001008。结果同时通过本次 success 和 onGetWifiList 返回;保留有名称的接入点,不按 SSID 去重。iOS 返回 9001001;没有 SSID 过滤、扫描时长或分页入参 |
wifiList: Array<WifiInfo>,可为空数组 |
disconnectSocket({ success?, fail?, complete? }): void |
取消正在建立的 TCP,或关闭已连接 TCP及其待发送数据;原建连请求若仍在等待,以 9001007 结束。无当前会话时也成功;不要求传 socketId,不释放 Wi-Fi 会话 |
无 |
getSocketState({ success?, fail?, complete? }): void |
读取当前 TCP 状态;无会话时返回最后一次断开状态或初始状态。不要求传 socketId |
state: SocketState |
connectWifi(options: ConnectWifiOptions): void
| 入参字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
SSID |
string |
是 | 无 | 目标网络名称,UTF-8 编码长度 1–32 字节,区分大小写 |
BSSID |
string |
否 | '' |
Android 可指定接入点 MAC 地址,例如 AA:BB:CC:DD:EE:FF;iOS 不支持非空 BSSID,传入会返回 9001001 |
password |
string |
否 | '' |
开放网络不传或传空字符串;加密网络传 8–63 个可打印 ASCII 字符,跨平台目标为 WPA2 Personal,不支持 WEP、EAP 或 WPA3-only |
hidden |
boolean |
否 | false |
是否为隐藏 SSID;iOS 传 true 需要 iOS 13+ |
timeout |
number |
否 | 30000 |
连接等待时长,单位毫秒;建议传有限整数,原生层将数值限制在 5000–120000 ms |
success |
ApiCallback |
否 | 不调用 | 成功结果包含 verified;已确认连接时另含 wifi |
fail |
ApiCallback |
否 | 不调用 | 失败回调,语义同通用参数 |
complete |
ApiCallback |
否 | 不调用 | 完成回调,语义同通用参数 |
该接口会启动所需的 Wi-Fi 观察。verified: true 表示插件已确认目标连接;iOS 系统接受配置、Wi-Fi 路径可用但 SSID 不可读时,可能成功返回 verified: false,此时不返回已确认的 wifi,也不发送连接成功事件。业务必须检查 verified,不能仅凭 errCode === 0 宣称已连接目标 SSID。
disconnectWifi(options: DisconnectWifiOptions): void
| 入参字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
SSID |
string |
是 | 无 | 要断开的当前网络名称,不能为空 |
BSSID |
string |
否 | '' |
Android 在可确认接入点时用于匹配校验;不传则按 SSID 处理。iOS 当前实现不使用此字段,只按 SSID 处理 |
success |
ApiCallback |
否 | 不调用 | 请求被接受时调用,不含额外结果字段 |
fail |
ApiCallback |
否 | 不调用 | 失败回调,语义同通用参数 |
complete |
ApiCallback |
否 | 不调用 | 完成回调,语义同通用参数 |
Android 10+ 只能释放插件自己请求的网络;系统管理的网络返回 9001001,需用户到系统设置断开。Android 5–9 可请求系统断开当前匹配网络。iOS 只能移除本 App 添加且确认当前正在连接的 SSID 配置。配网等待期间返回 9001008。成功表示请求被接受,不保证系统已完成断开,应再次读取实际状态。
connectSocket(options: ConnectSocketOptions): void
| 入参字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
host |
string |
是 | 无 | 设备 IP 或主机名,去除首尾空白后不能为空;不要包含 http://、tcp://、路径或端口 |
port |
number |
是 | 无 | 目标 TCP 服务端口,1–65535 的整数 |
networkMode |
string |
否 | 'system' |
只接受 'system' 或 'wifi';前者按系统默认路由,后者在 Android 绑定插件管理的 Wi-Fi Network,在 iOS 限制使用 Wi-Fi 接口 |
connectTimeout |
number |
否 | 15000 |
建连等待时长,单位毫秒;建议传有限整数,原生层将数值限制在 1000–120000 ms |
success |
ApiCallback |
否 | 不调用 | TCP 建立成功时调用,结果含 state: SocketState |
fail |
ApiCallback |
否 | 不调用 | 建连失败、超时或取消时调用 |
complete |
ApiCallback |
否 | 不调用 | 本次建连请求结束时调用;不表示 TCP 会话已关闭 |
Android 的 'wifi' 模式要求已有可绑定网络,可先调用 startWifi 等待网络就绪,或等待 connectWifi 成功;两端都拒绝在 Wi-Fi 配网等待期间新建绑定 Wi-Fi 的 TCP。'system' 模式可单独使用,不要求先调用 Wi-Fi 接口。模式在建连时确定,没有向接口传入原生 Network 句柄的参数。
writeSocket(options: WriteSocketOptions): void
| 入参字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
data |
Array<number> |
是 | 无 | 待发送字节数组,长度 1–65536,每项为 0–255 的整数,例如 [170, 1, 255];不直接接受字符串、HEX 字符串或 ArrayBuffer |
success |
ApiCallback |
否 | 不调用 | 写入成功时调用,结果含 bytesWritten: number |
fail |
ApiCallback |
否 | 不调用 | 未连接、参数错误、队列已满、取消或写入失败时调用 |
complete |
ApiCallback |
否 | 不调用 | 完成回调,语义同通用参数 |
只向当前已连接会话写入,不接收 socketId、编码、追加换行或写入超时参数。发送成功仅表示字节已交给本地传输栈,不代表远端业务处理成功;业务确认需要设备协议 ACK。发送队列有上限,没有独立写入超时,远端不读取时可通过 disconnectSocket 取消写入。
通用请求结果:ApiResult
success、fail、complete 都接收一个 result 对象;可选字段只在对应操作实际返回时出现。
| 字段 | 类型 | 是否必有 | 说明 |
|---|---|---|---|
errCode |
number |
是 | 0 成功,非零为插件错误码,见“权限与错误” |
errMsg |
string |
是 | 结果说明或错误详情;不要依赖固定文本判断成功与失败 |
wifi |
WifiInfo |
否 | 当前或本次已确认连接的 Wi-Fi 信息;个别失败结果也可能附带相关网络信息 |
wifiList |
Array<WifiInfo> |
否 | Android getWifiList 成功时的扫描结果 |
state |
SocketState |
否 | connectSocket 成功或 getSocketState 返回的状态 |
verified |
boolean |
否 | connectWifi 对目标网络是否已确认;getConnectedWifi 不返回此字段 |
bytesWritten |
number |
否 | writeSocket 成功写入的字节数 |
插件同时管理一个 Wi-Fi 请求和一个 TCP 会话。新的有效 connectWifi / connectSocket 请求进入建连流程时会替换前一次同类请求,仍在等待的旧请求以 9001007 完成;参数或前置条件检查未通过时,不应假定旧会话已被替换。
监听
注册和取消监听的完整入参
所有 onX 的入参为一个必填函数 callback: EventCallback,类型为 (event: PluginEvent) => void,没有默认值。同步返回 number 类型的 listenerId。这里传函数本身,不传 { success, fail, complete } 对象。
所有 offX 的唯一入参为可选的 listenerId: number,同步返回 void。传编号只移除对应事件的这条监听;省略参数时移除该事件的所有监听。不存在的编号或其他事件的编号不会移除当前事件的其他监听。
| 注册接口完整签名 | 取消接口完整签名 | event.event 值 |
|---|---|---|
onGetWifiList(callback: EventCallback): number |
offGetWifiList(listenerId?: number): void |
'getWifiList' |
onWifiConnected(callback: EventCallback): number |
offWifiConnected(listenerId?: number): void |
'wifiConnected' |
onWifiConnectedWithPartialInfo(callback: EventCallback): number |
offWifiConnectedWithPartialInfo(listenerId?: number): void |
'wifiConnectedWithPartialInfo' |
onWifiStateChange(callback: EventCallback): number |
offWifiStateChange(listenerId?: number): void |
'wifiStateChange' |
onSocketStateChange(callback: EventCallback): number |
offSocketStateChange(listenerId?: number): void |
'socketStateChange' |
onSocketMessage(callback: EventCallback): number |
offSocketMessage(listenerId?: number): void |
'socketMessage' |
onSocketError(callback: EventCallback): number |
offSocketError(listenerId?: number): void |
'socketError' |
每次注册产生独立编号;重复注册同一个函数也会形成独立监听。注册监听不会自动发起扫描或连接,也不补发历史事件。两端都可以注册和移除以上监听,但 iOS 不产生 getWifiList 事件。
不能把回调函数传给 offX。 取消监听不会关闭 Wi-Fi 或 TCP,关闭连接也不会自动移除监听;页面退出时应主动使用对应编号清理。API 名称参考 uni-wifi,未挂载或覆盖全局 uni.*。
const listenerId = connection.onSocketMessage(event => {
console.log(event.socketId, event.data)
})
connection.offSocketMessage(listenerId) // 只移除上面这一条
// connection.offSocketMessage() // 移除全部 TCP 收包监听,谨慎用于多个页面共享的插件
监听回调入参:PluginEvent
每次回调接收一个 event 对象。其 event 字段为必有的 string 类型;其他字段在公共类型中均为可选,实际内容按下面的事件区分。wifi / state 的内部字段见后面的类型表。
| on / off 事件 | 回调内容 |
|---|---|
GetWifiList |
wifiList: Array<WifiInfo>;errMsg?: string,当前 Android 实现提供接入点数、可识别 SSID 数和无名称条目数。扫描失败走请求 fail,不发成功列表事件 |
WifiConnected |
wifi: WifiInfo;插件确认 Wi-Fi 连接后触发。Android 网络观察也可能触发,iOS 不保证上报用户在系统设置中的每次 SSID 切换 |
WifiConnectedWithPartialInfo |
wifi: WifiInfo,包含 SSID、空字符串 BSSID 和可选 secure;当前实现可能在同一次连接后同时发出完整信息与部分信息两个事件,不要据此重复提示连接成功 |
WifiStateChange |
errCode: number、errMsg: string、wifi?: WifiInfo;网络丢失、请求释放等通知,errCode 也可能为 0。Android 断开时可带 SSID/BSSID;iOS 路径事件可能不提供 wifi |
SocketStateChange |
state: SocketState;连接中、已连接、断开,以及 iOS 等待状态说明 |
SocketMessage |
socketId: number、data: Array<number>;每项是 0–255 的字节。TCP 是字节流,一次回调不等于一条完整业务消息,需业务自行处理粘包/拆包 |
SocketError |
socketId: number、errCode: number、errMsg: string;连接建立后的读写或断路错误,不用于重复通知本次建连请求已经返回的失败 |
Wi-Fi 信息字段:WifiInfo
| 字段 | 类型 | 是否必有 | 说明 |
|---|---|---|---|
SSID |
string |
是 | 网络名称;无法识别关联网络的状态事件可能返回空字符串 |
BSSID |
string |
是 | 接入点 MAC 地址;部分信息事件或系统未提供时为空字符串 |
secure |
boolean |
否 | 是否为加密网络;不表示具体加密算法,也不保证插件支持该网络的认证方式 |
signalStrength |
number |
否 | 信号强度,0–1;当前由 Android 提供 |
frequency |
number |
否 | 频率,单位 MHz;当前由 Android 提供 |
系统未提供的可选字段保持缺省,不能当作 false 或 0;SSID 不可读不等于未连接。
TCP 状态字段:SocketState
以下字段在 SocketState 中均为必填。
| 字段 | 类型 | 说明 |
|---|---|---|
status |
string |
'connecting'、'connected' 或 'disconnected' |
socketId |
number |
本次会话编号,可用于区分新旧事件;初始未建立过会话时为 0。编号不是 writeSocket / disconnectSocket 的入参 |
host |
string |
本次连接的主机地址;初始状态为 '' |
port |
number |
本次连接的目标端口;初始状态为 0 |
networkMode |
string |
'wifi' 或 'system';初始为 'system' |
reason |
string |
状态原因,例如 idle、snapshot、connecting、connected、manual、replaced、timeout、network_lost、remote_closed;iOS 可包含 waiting: ...,不是固定枚举全集 |
readBytes |
number |
本次会话累计收到的字节数,初始为 0 |
writeBytes |
number |
本次会话累计成功写入的字节数,初始为 0 |
建连阶段失败或超时只调用本次 connectSocket 的 fail,不会再重复发出 SocketError,但可以同时产生断开状态事件。iOS 对可恢复的 waiting 按错误内容去重;明确连接被拒绝会立即结束,暂时无路由、地址不可用或等待本地网络授权则保留连接,直到成功、系统报告失败、用户取消或达到连接超时。参数或权限检查失败不保证产生会话事件。
权限与错误
Android 权限声明随插件合并。Android 13+ 的附近 Wi-Fi 权限不能替代扫描所需的定位权限。Android 17 且 targetSdk >= 37 才请求新本地网络权限;需要宿主打包工具链支持相应目标 SDK。
iOS 能力、描述文件及用途文案配置见上方“iOS 打包前配置”和“宿主权限配置”。getConnectedWifi 先尝试系统读取,必要时请求定位;不是每次 TCP 都申请定位。没有 Bonjour 业务,因此未声明 NSBonjourServices。
| errCode | 含义 |
|---|---|
| 9001001 | 平台或能力不支持 |
| 9001002 | 参数无效 |
| 9001003 | 权限/定位条件不足,或受系统限制无法读取 Wi-Fi 信息 |
| 9001004 | 网络或 TCP 未就绪 |
| 9001005 | 操作超时 |
| 9001006 | 用户拒绝或目标不可用(Android 不总能区分二者) |
| 9001007 | 取消、停止或被替换 |
| 9001008 | 操作进行中、扫描限流或发送队列已满 |
| 9001009 | 原生配置/网络/读写错误 |
| 9001010 | 远端关闭 TCP |
| 9001011 | Android 在 TCP 连接前检测到活动 VPN;请关闭 VPN 后重试 |
错误码为本插件自定义码,原生错误信息保留在 errMsg 供排查。
常见问题排查
| 现象 | 检查方向 |
|---|---|
9001004:未连接 Wi-Fi 或系统未提供 Wi-Fi 信息 |
先确认系统当前连接、定位授权和定位开关;SSID 不可读并不等同于密码错误。Android 读取支持系统信息回退,但若系统仍未返回名称就无法伪造成功 |
9001004:绑定 Wi-Fi 的 TCP 未就绪 |
确认调用过 startWifi 或已成功 connectWifi,没有正在进行的配网/取消操作;读取到 SSID 不保证绑定路由就绪,确认网络稳定后重新点击连接 |
ECONNREFUSED / Connection refused,通常包装为 9001009 |
检查目标 IP、TCP 端口、服务是否监听及设备访问限制。它是 TCP 连接被拒绝,不能据此判断 Wi-Fi 密码错误;不要把手机源地址后的临时端口填成设备端口 |
9001005:连接超时 |
检查目标是否可达、设备服务是否启动、首次系统授权是否完成。iOS Wi-Fi 超时后系统配网可能仍在继续,重试前先读取实际网络状态 |
9001011:Android 检测到系统 VPN |
关闭 VPN、代理类隧道或企业网络隧道后重新连接 TCP;插件不会自动改用 system 模式绕过此检查。iOS 不使用该错误码做 VPN 预判 |
| 系统设置能看到网络,App 列表缺失 | 比较同一时刻的完整 SSID,并查看扫描诊断日志。插件返回有名称的扫描条目;demo 按完整 SSID 合并同名接入点,数量可少于接入点数。无名称条目不会作为可选网络返回;系统返回列表本身是否完整仍需真机对照 |
9001008:扫描被限流 |
避免连续点击或循环扫描,稍后再试;当前实现不会把旧缓存伪装成本次成功扫描。保留失败原因和上一次结果供用户参考 |
| iOS 能力已勾选但仍失败 | 检查 Bundle ID、Apple 后台能力、打包使用的 .mobileprovision 与最终 entitlements 是否一致;只修改 manifest.json 不能替代签名描述文件更新 |
| 原生修复或权限修改后行为没变化 | 重新制作并安装自定义基座或重新正式打包。页面热更新不能替换原生插件、系统权限声明或签名配置 |
| 重复出现失败吐司或连接日志 | 检查是否同时在请求 fail、onSocketError、onSocketStateChange 中提示同一结果,以及页面是否重复注册但未移除监听 |
- 如有疑问,请联系微信:jagger-yu 💌
- 反馈问题时提供:手机型号、系统版本、HBuilderX 版本、使用的基座是否重新制作、具体操作、
errCode/errMsg和相关时序日志。扫描问题另附缺失 SSID 与系统列表对照;TCP 问题附目标 IP/端口及服务状态。不要提交 Wi-Fi 密码、证书私钥或完整签名凭据。
参考:uni-wifi、Android Network、Wi-Fi Network Request、Apple Wi-Fi API、Apple 本地网络隐私。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 320
赞赏 2
下载 12586888
赞赏 1949
赞赏
京公网安备:11010802035340号