更新记录
1.0.0(2026-07-29)
支持app三端p2p方案,ios为普通wifi
平台兼容性
uni-app x(5.0)
| Chrome | Safari | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 | 鸿蒙插件版本 | 微信小程序 |
|---|---|---|---|---|---|---|---|---|
| × | × | 9.0 | 1.0.0 | 14 | 1.0.0 | 6.0.0 | 1.0.0 | × |
uninext-peer-link
uninext-peer-link 是一个面向设备热点接入、P2P 直连和局域网调试场景的 UTS 插件,统一封装 Android、iOS、Harmony 三端的连接入口、回调结构和错误码。
适用场景
- 连接设备热点后,通过 TCP / UDP / HTTP 与设备通信
- Android / Harmony 下按设备标识尝试发起 P2P 直连
- iOS 下通过系统热点接入能力连接设备热点
- 业务层希望统一处理连接状态、错误提示和重试逻辑
当前能力概览
| 平台 | 底层模式 | 连接模式 | 当前状态 | 说明 |
|---|---|---|---|---|
| Android | WiFi Direct / P2P | app-bound |
稳定支持 | 适合设备直连 |
| iOS | NEHotspotConfiguration |
system |
稳定支持 | 走系统热点接入 |
| Harmony | @ohos.wifiManager P2P |
system |
条件支持 | 受权限、系统能力和机型限制影响较大 |
说明:
- Android / Harmony 的
BSSID更接近“目标设备地址”语义,不是传统路由器 BSSID。 - Harmony 当前是 P2P 方案,不是普通 STA WiFi 切换方案。
- 如果 Harmony 普通应用无法走通
p2pConnect,建议改为“用户在系统 WiFi 页手动连接,App 只负责后续通信”。
安装与导入
插件目录:uni_modules/uninext-peer-link
import { useUninextPeerLink } from '@/uni_modules/uninext-peer-link'
const uninextPeerLink = useUninextPeerLink()
API 列表
hasPositionPermission(): Promise<boolean>getCapabilities(): UninextPeerLinkCapabilitiesisWifiEnabled(): booleanprepare(options: UninextPeerLinkPrepareOptions): Promise<void>connect(options: UninextPeerLinkConnectOptions): Promise<void>disconnect(options: UninextPeerLinkDisconnectOptions): Promise<void>getConnectionInfo(options: UninextPeerLinkGetConnectionOptions): Promise<void>
推荐接入流程
- 调用
getCapabilities()判断当前平台支持情况 - 调用
prepare()检查当前连接能力和网络上下文 - 调用
connect()发起连接 - 在成功回调里再启动设备通信
- 页面回前台或步骤切换时调用
getConnectionInfo()刷新状态
快速开始
1. 检查位置权限需求
const hasPositionPermission = await uninextPeerLink.hasPositionPermission()
console.log('has position permission', hasPositionPermission)
说明:
- Android / Harmony 某些 WiFi / P2P 能力依赖位置权限或系统等价授权
- iOS 是否需要额外位置权限,取决于你的业务是否还要读取更详细的系统网络信息
2. 检查平台能力
const capabilities = uninextPeerLink.getCapabilities()
console.log('peer link capabilities', JSON.stringify(capabilities))
返回字段:
| 字段 | 类型 | 说明 |
|---|---|---|
platform |
'android' \| 'ios' \| 'harmony' |
当前运行平台 |
supported |
boolean |
当前平台是否支持插件能力 |
canConnect |
boolean |
是否支持发起连接 |
canDisconnect |
boolean |
是否支持断开连接 |
canReadConnection |
boolean |
是否支持读取连接信息 |
connectMode |
'app-bound' \| 'system' \| 'unsupported' |
当前平台接入模式 |
3. 获取 WiFi 开关状态
const wifiEnabled = uninextPeerLink.isWifiEnabled()
console.log('connection enabled', wifiEnabled)
说明:
- Android / Harmony 返回系统 WiFi 或当前能力层面的开关状态
- iOS 公开原生 API 无法稳定获取系统 WiFi 开关真值,当前返回的是插件内部基于连接信息推导的近似状态
4. 连接前准备
uninextPeerLink.prepare({
success: (res) => {
console.log('prepare success', JSON.stringify(res))
},
fail: (err) => {
console.log('prepare fail', JSON.stringify(err))
},
complete: (res) => {
console.log('prepare complete', JSON.stringify(res))
}
})
5. 发起连接
uninextPeerLink.connect({
SSID: 'ZEEHO-DASHBOARD',
password: '12345678',
BSSID: null,
hiddenSSID: false,
joinOnce: true,
timeoutMillis: 15000,
bindProcessToNetwork: true,
success: (res) => {
console.log('connect success', JSON.stringify(res))
},
fail: (err) => {
console.log('connect fail', JSON.stringify(err))
},
complete: (res) => {
console.log('connect complete', JSON.stringify(res))
}
})
6. 获取连接信息
uninextPeerLink.getConnectionInfo({
success: (res) => {
console.log('connection info', JSON.stringify(res))
},
fail: (err) => {
console.log('connection info fail', JSON.stringify(err))
}
})
7. 断开连接
uninextPeerLink.disconnect({
SSID: 'ZEEHO-DASHBOARD',
success: (res) => {
console.log('disconnect success', JSON.stringify(res))
},
fail: (err) => {
console.log('disconnect fail', JSON.stringify(err))
}
})
参数说明
connect(options)
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
SSID |
string |
是 | - | 目标热点名或目标 P2P 组名 |
password |
string \| null |
否 | '' |
热点密码;开放网络可传空字符串 |
BSSID |
string \| null |
否 | null |
Android / Harmony 下优先表示设备地址 |
hiddenSSID |
boolean |
否 | false |
预留参数,主要供个别平台兼容 |
joinOnce |
boolean |
否 | true |
iOS 一次性接入语义更明显 |
timeoutMillis |
number |
否 | 15000 |
连接超时时间 |
bindProcessToNetwork |
boolean |
否 | true |
Android 业务保留参数 |
success |
(res) => void |
否 | - | 连接成功回调 |
fail |
(err) => void |
否 | - | 连接失败回调 |
complete |
(res) => void |
否 | - | 连接结束回调 |
prepare(options)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
success |
(res) => void |
否 | 准备成功回调 |
fail |
(err) => void |
否 | 准备失败回调 |
complete |
(res) => void |
否 | 完成回调 |
disconnect(options)
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
SSID |
string \| null |
否 | 最近一次连接的 SSID |
指定目标网络或组名 |
success |
(res) => void |
否 | - | 断开成功回调 |
fail |
(err) => void |
否 | - | 断开失败回调 |
complete |
(res) => void |
否 | - | 完成回调 |
getConnectionInfo(options)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
success |
(res) => void |
否 | 获取连接信息成功回调 |
fail |
(err) => void |
否 | 获取连接信息失败回调 |
complete |
(res) => void |
否 | 完成回调 |
hasPositionPermission()
返回值:
| 类型 | 说明 |
|---|---|
Promise<boolean> |
当前平台是否已满足插件所需的位置相关授权 |
说明:
- 这是一个快捷检查方法,便于业务层在连接前决定是否先引导用户授权
- 具体是否必须依赖位置权限,仍受平台版本、系统策略和插件底层实现影响
回调结构
成功回调
所有成功回调统一返回 UninextPeerLinkBaseSuccess:
| 字段 | 类型 | 说明 |
|---|---|---|
errCode |
number |
成功固定为 0 |
errSubject |
string |
固定为 uninext-peer-link |
errMsg |
string |
当前成功描述,通常为 ok |
state |
'idle' \| 'ready' \| 'connecting' \| 'connected' \| 'disconnected' |
当前状态 |
platform |
'android' \| 'ios' \| 'harmony' |
当前平台 |
supported |
boolean |
当前平台是否支持 |
wifi |
UninextPeerLinkConnectionInfo \| null |
当前连接信息 |
wifi 字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
SSID |
string \| null |
已连接热点名或 P2P 组名 |
BSSID |
string \| null |
已连接设备地址或 BSSID |
ipV4 |
string \| null |
当前 IPv4 地址 |
signalStrength |
number |
信号强度;无法获取时可能为 -1 |
secure |
boolean \| null |
是否加密连接 |
connected |
boolean |
当前是否已连接 |
appBound |
boolean |
Android 是否已绑定进程网络 |
失败回调
失败回调返回 IUninextPeerLinkError:
| 字段 | 类型 | 说明 |
|---|---|---|
errSubject |
string |
固定为 uninext.peer-link 或 uninext-peer-link 上下文主题 |
errCode |
UninextPeerLinkErrorCode |
统一错误码 |
errMsg |
string |
错误名称或错误文案 |
detail |
string |
原生侧补充信息 |
错误码表
| 错误码 | 含义 |
|---|---|
0 |
成功 |
1001 |
当前平台不支持系统级 WiFi 控制 |
1002 |
参数错误 |
1003 |
WiFi 未开启 |
1004 |
WiFi 配置创建或复用失败 |
1005 |
系统请求失败、被拒绝或取消 |
1006 |
连接失败 |
1007 |
连接超时 |
1008 |
连接丢失 |
1009 |
设备不支持 WiFi |
1010 |
Android 当前不支持连接能力 |
1011 |
Android 当前不支持断开能力 |
1012 |
Android 当前不支持读取 WiFi 信息 |
1013 |
Android 上下文获取失败 |
1014 |
Android ConnectivityManager 获取失败 |
1015 |
Android WiFi 服务获取失败 |
1016 |
iOS 移除 WiFi 配置被拒绝 |
1017 |
权限不足 |
1018 |
准备阶段失败 |
1019 |
未找到可移除的目标连接 |
1020 |
断开或移除失败 |
1021 |
获取连接信息失败 |
1022 |
P2P 忙碌,通常需关闭热点或稍后重试 |
1023 |
位置权限不足或未满足当前平台要求 |
1099 |
未知错误 |
平台差异与限制
Android
- 当前实现走 WiFi Direct / P2P,适合设备直连。
BSSID建议传设备地址。- Android 10+ 下 WiFi / 扫描 / P2P 相关能力通常还要结合位置权限一起判断。
- 页面连接成功后再访问设备接口,避免系统还未切网完成。
iOS
- 当前走
NEHotspotConfiguration,由系统接管接入。 joinOnce在 iOS 上意义最明确。BSSID、ipV4等字段可能因为系统限制返回null。
Harmony
- 当前实现基于
@ohos.wifiManager的 P2P 能力。 BSSID表示目标 P2P 设备地址。getCurrentGroup()能成功不代表最终一定连通,仍需结合getConnectionInfo()判断。- 普通三方应用在部分机型或系统版本上可能无法完整获得 P2P 管理权限。
- 如果
p2pConnect长时间无回调,优先检查系统能力、权限级别和机型开放范围。 - 如果设备同时在普通 WiFi 列表可见,Harmony 上可优先考虑“系统手动连接 + App 后续通信”的替代方案。
权限与配置建议
Android
Android 端当前实现基于 WifiP2pManager。这里要同时满足两件事:
- 包内已声明所需权限
- 用户在运行时已授权相关权限
配置位置
推荐在项目根目录 manifest.json 的 app-android.distribute.permissions 中声明:
{
"app-android": {
"distribute": {
"permissions": [
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.NEARBY_WIFI_DEVICES\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-feature android:name=\"android.hardware.wifi.direct\" android:required=\"false\" />"
]
}
}
}
推荐权限说明
| 权限 | 是否建议 | 用途 |
|---|---|---|
android.permission.ACCESS_FINE_LOCATION |
必需 | Android 10+ 下扫描、发现、连接 P2P 设备常常依赖定位权限 |
android.permission.NEARBY_WIFI_DEVICES |
强烈建议 | Android 13+ 的附近 WiFi 设备权限 |
android.permission.ACCESS_WIFI_STATE |
建议 | 读取 WiFi / P2P 能力状态 |
android.permission.CHANGE_WIFI_STATE |
建议 | WiFi 状态切换相关场景 |
android.permission.ACCESS_NETWORK_STATE |
建议 | 读取网络状态 |
android.permission.CHANGE_NETWORK_STATE |
建议 | 网络切换或绑定相关场景 |
android.permission.INTERNET |
必需 | 连接成功后访问设备服务 |
运行时授权说明
插件内部会在需要时申请:
ACCESS_FINE_LOCATIONNEARBY_WIFI_DEVICES
但前提是这些权限已经打进安装包。也就是说:
- 只写运行时代码、不配
manifest.json,系统不会正常授权 - 只配
manifest.json、用户拒绝授权,扫描和连接依然可能失败
额外说明
- 某些 ROM 要求系统“定位服务”总开关本身也处于开启状态。
uses-feature建议设置required="false",避免不支持 WiFi Direct 的设备在商店直接被过滤。- 如果项目还涉及传统 WiFi 扫描或更复杂的网络状态读取,建议保留
ACCESS_WIFI_STATE、CHANGE_WIFI_STATE、ACCESS_NETWORK_STATE。
iOS
iOS 端当前实现依赖 NetworkExtension.framework,并且区分两类配置:
- entitlement / capability
Info.plist隐私说明
插件内已包含的 capability
插件目录 utssdk/app-ios/UTS.entitlements 已声明:
com.apple.developer.networking.wifi-infocom.apple.developer.networking.HotspotConfiguration
这两项分别对应:
- 读取当前 WiFi 相关信息的 capability
- 使用
NEHotspotConfiguration发起热点接入的 capability
工程侧建议补充的 Info.plist
推荐在项目根目录新增 Info.plist,至少补下面内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSLocalNetworkUsageDescription</key>
<string>用于连接设备热点后访问局域网设备服务</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>用于识别当前 WiFi 信息并辅助设备连接</string>
</dict>
</plist>
配置项说明
| 配置项 | 是否建议 | 用途 |
|---|---|---|
NSLocalNetworkUsageDescription |
强烈建议 | 连接后访问局域网 IP、TCP / UDP / HTTP 服务 |
NSLocationWhenInUseUsageDescription |
建议 | 某些 WiFi 信息读取或网络识别场景下减少系统限制差异 |
额外说明
- 插件带有 entitlement,不等于 Apple 开发者签名能力已经在你的目标环境中完全可用。
- 真机上如果拿不到
SSID、BSSID或ipV4,不一定是插件错误,很多情况是 iOS 公开 API 的系统限制。 joinOnce只影响接入策略,不替代 capability、签名和隐私说明配置。
Harmony
Harmony 端建议把“权限声明”和“系统能力开放范围”分开理解。当前插件使用 @ohos.wifiManager 的 P2P 能力,常见卡点不只是权限,还包括机型和系统策略。
配置位置
推荐在项目根目录维护:harmony-configs/entry/src/main/module.json5
权限声明放在:module.requestPermissions
示例:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.LOCATION",
"usedScene": {
"when": "inuse"
},
"reason": "$string:EntryAbility_label"
},
{
"name": "ohos.permission.APPROXIMATELY_LOCATION",
"usedScene": {
"when": "inuse"
},
"reason": "$string:EntryAbility_label"
}
]
}
}
推荐权限说明
| 权限 | 是否建议 | 用途 |
|---|---|---|
ohos.permission.INTERNET |
必需 | 连接成功后访问设备服务 |
ohos.permission.LOCATION |
建议 | WiFi / 周边设备发现相关场景 |
ohos.permission.APPROXIMATELY_LOCATION |
建议 | 与定位授权链路配合使用 |
为什么建议定位权限成对配置
- Harmony 文档里定位类权限通常建议一起声明
- WiFi / 周边发现一类场景,经常会走到位置授权链路
- 少配其中一个时,更容易出现“能编译、但真机行为不稳定”的问题
还需要检查的系统能力
推荐至少关注:
module.json5中的 WiFi / 网络权限声明syscap.json中的SystemCapability.Communication.WiFi.P2P
额外说明
- 系统能力声明不等于普通应用一定能获得完整 P2P 管理权限。
- 如果目标接口要求系统应用或企业应用权限,普通应用即使声明了权限也可能无法生效。
- 某些机型上
startDiscoverDevices()、getCurrentGroup()、p2pConnect()可能表现为超时、无回调或字段不完整。
三端对照表
| 平台 | 主要配置文件 | 最小建议项 | 运行时还要确认什么 |
|---|---|---|---|
| Android | manifest.json |
ACCESS_FINE_LOCATION、INTERNET |
用户已授权,且系统定位总开关已开启 |
| iOS | UTS.entitlements + Info.plist |
HotspotConfiguration capability、NSLocalNetworkUsageDescription |
真机签名能力和局域网访问提示是否正常 |
| Harmony | harmony-configs/entry/src/main/module.json5 |
INTERNET、LOCATION、APPROXIMATELY_LOCATION |
真机授权、机型策略和 P2P 能力开放范围 |
接入建议
- 先调用
getCapabilities(),再决定页面是否展示连接入口 - 业务层保存
SSID + BSSID,便于后续重连 - 将“WiFi 未开启”“权限不足”“连接超时”“P2P 忙碌”分别提示给用户
- Harmony 上不要只看
getCurrentGroup,要以getConnectionInfo().wifi.connected和设备通信结果一起判断 - 自动重连前先做
prepare(),避免旧状态残留
示例文档
更完整的业务接入示例见 uni_modules/uninext-peer-link/使用示例.md。

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