更新记录

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(): UninextPeerLinkCapabilities
  • isWifiEnabled(): boolean
  • prepare(options: UninextPeerLinkPrepareOptions): Promise<void>
  • connect(options: UninextPeerLinkConnectOptions): Promise<void>
  • disconnect(options: UninextPeerLinkDisconnectOptions): Promise<void>
  • getConnectionInfo(options: UninextPeerLinkGetConnectionOptions): Promise<void>

推荐接入流程

  1. 调用 getCapabilities() 判断当前平台支持情况
  2. 调用 prepare() 检查当前连接能力和网络上下文
  3. 调用 connect() 发起连接
  4. 在成功回调里再启动设备通信
  5. 页面回前台或步骤切换时调用 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-linkuninext-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 上意义最明确。
  • BSSIDipV4 等字段可能因为系统限制返回 null

Harmony

  • 当前实现基于 @ohos.wifiManager 的 P2P 能力。
  • BSSID 表示目标 P2P 设备地址。
  • getCurrentGroup() 能成功不代表最终一定连通,仍需结合 getConnectionInfo() 判断。
  • 普通三方应用在部分机型或系统版本上可能无法完整获得 P2P 管理权限。
  • 如果 p2pConnect 长时间无回调,优先检查系统能力、权限级别和机型开放范围。
  • 如果设备同时在普通 WiFi 列表可见,Harmony 上可优先考虑“系统手动连接 + App 后续通信”的替代方案。

权限与配置建议

Android

Android 端当前实现基于 WifiP2pManager。这里要同时满足两件事:

  • 包内已声明所需权限
  • 用户在运行时已授权相关权限

配置位置

推荐在项目根目录 manifest.jsonapp-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_LOCATION
  • NEARBY_WIFI_DEVICES

但前提是这些权限已经打进安装包。也就是说:

  • 只写运行时代码、不配 manifest.json,系统不会正常授权
  • 只配 manifest.json、用户拒绝授权,扫描和连接依然可能失败

额外说明

  • 某些 ROM 要求系统“定位服务”总开关本身也处于开启状态。
  • uses-feature 建议设置 required="false",避免不支持 WiFi Direct 的设备在商店直接被过滤。
  • 如果项目还涉及传统 WiFi 扫描或更复杂的网络状态读取,建议保留 ACCESS_WIFI_STATECHANGE_WIFI_STATEACCESS_NETWORK_STATE

iOS

iOS 端当前实现依赖 NetworkExtension.framework,并且区分两类配置:

  • entitlement / capability
  • Info.plist 隐私说明

插件内已包含的 capability

插件目录 utssdk/app-ios/UTS.entitlements 已声明:

  • com.apple.developer.networking.wifi-info
  • com.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 开发者签名能力已经在你的目标环境中完全可用。
  • 真机上如果拿不到 SSIDBSSIDipV4,不一定是插件错误,很多情况是 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_LOCATIONINTERNET 用户已授权,且系统定位总开关已开启
iOS UTS.entitlements + Info.plist HotspotConfiguration capability、NSLocalNetworkUsageDescription 真机签名能力和局域网访问提示是否正常
Harmony harmony-configs/entry/src/main/module.json5 INTERNETLOCATIONAPPROXIMATELY_LOCATION 真机授权、机型策略和 P2P 能力开放范围

接入建议

  • 先调用 getCapabilities(),再决定页面是否展示连接入口
  • 业务层保存 SSID + BSSID,便于后续重连
  • 将“WiFi 未开启”“权限不足”“连接超时”“P2P 忙碌”分别提示给用户
  • Harmony 上不要只看 getCurrentGroup,要以 getConnectionInfo().wifi.connected 和设备通信结果一起判断
  • 自动重连前先做 prepare(),避免旧状态残留

示例文档

更完整的业务接入示例见 uni_modules/uninext-peer-link/使用示例.md

隐私、权限声明

1. 本插件需要申请的系统权限列表:

WiFi、网络状态、定位等权限请按 Android、iOS、Harmony 平台能力在项目中统一声明

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。