You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native如何检测设备热点是否开启及已连接设备数?

React Native 检测Wi-Fi/热点状态及连接设备数方案

核心问题说明

@react-native-community/netinfo仅能检测设备是否连接到Wi-Fi,无法直接判断设备是否开启了热点(个人热点/移动热点),也无法获取热点连接设备数。这类功能需要依赖原生平台API实现,以下是分平台的具体方案:


一、检测热点是否开启

React Native无跨平台内置API,需通过原生模块或第三方库实现:

1. 第三方库(可选)

可尝试react-native-hotspot类库(注意确认维护状态),但稳定性不如自定义原生模块。

2. 自定义原生模块(推荐)

Android端实现

利用系统WifiManager检测热点状态,需添加权限:

<!-- AndroidManifest.xml 中添加权限 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

原生Kotlin代码示例:

class HotspotModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
    override fun getName(): String = "HotspotModule"

    @ReactMethod
    fun isHotspotEnabled(promise: Promise) {
        val wifiManager = reactApplicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        promise.resolve(wifiManager.isWifiApEnabled)
    }
}

iOS端实现

通过CNCopyCurrentNetworkInfo或NEHotspotConfigurationManager判断,需配置权限:

<!-- Info.plist 中添加权限 -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>需要获取WiFi信息以检测热点状态</string>
<key>com.apple.developer.networking.wifi-info</key>
<true/>

原生Swift代码示例:

import NetworkExtension
import SystemConfiguration.CaptiveNetwork

class HotspotModule: NSObject, RCTBridgeModule {
    static func moduleName() -> String! { return "HotspotModule" }
    static func requiresMainQueueSetup() -> Bool { return true }

    @objc func isHotspotEnabled(_ resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
        guard let interfaces = CNCopySupportedInterfaces() as? [CFString] else {
            resolve(false)
            return
        }
        for interface in interfaces {
            if let networkInfo = CNCopyCurrentNetworkInfo(interface) as? [String: Any] {
                // 可通过SSID特征或接口类型判断是否为热点,此处简化处理
                resolve(true)
                return
            }
        }
        resolve(false)
    }
}

JS端调用

通过NativeModules调用原生方法:

import { NativeModules } from 'react-native';
const { HotspotModule } = NativeModules;

// 检测热点是否开启
async function checkHotspotStatus() {
  try {
    return await HotspotModule.isHotspotEnabled();
  } catch (err) {
    console.error(err);
    return false;
  }
}

二、获取热点连接设备数

Android端实现

通过读取系统/proc/net/arp文件统计有效设备,需添加权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 10+ 可能需要ACCESS_FINE_LOCATION权限 -->

原生Kotlin代码示例:

@ReactMethod
fun getConnectedDevicesCount(promise: Promise) {
    var count = 0
    runCatching {
        val arpFile = File("/proc/net/arp")
        val reader = BufferedReader(FileReader(arpFile))
        reader.readLine() // 跳过表头
        var line: String?
        while (reader.readLine().also { line = it } != null) {
            val parts = line?.split("\\s+".toRegex())
            if (parts?.size ?: 0 >= 4) {
                val mac = parts?.get(3)
                if (mac != "00:00:00:00:00:00") count++
            }
        }
        reader.close()
    }
    promise.resolve(count)
}

iOS端限制

苹果未开放获取热点连接设备数的正规API,无法通过合法方式实现,仅能通过监控网络流量等间接方式推测(准确性极低)。


三、整合Wi-Fi检测逻辑

结合NetInfo实现完整的状态判断:

import NetInfo from '@react-native-community/netinfo';

async function checkNetworkValidity() {
    const netInfo = await NetInfo.fetch();
    const isWifiConnected = netInfo.type === 'wifi';
    const isHotspotEnabled = await checkHotspotStatus();

    if (!isWifiConnected && !isHotspotEnabled) {
        alert('请开启Wi-Fi或热点模式');
    }
}

内容的提问来源于stack exchange,提问作者Camille Maurel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:21:01