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

如何在Flutter中获取安卓与iOS设备的WIFI信号强度及BSSID

在Flutter中获取WIFI信号强度与BSSID(安卓&iOS原生实现)

由于没有完全适配的pub库,直接通过MethodChannel调用原生代码是最可靠的方案,以下分平台实现:


安卓端实现

1. 配置权限

在android/app/src/main/AndroidManifest.xml中添加必要权限:

<!-- WIFI状态权限 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 定位权限(安卓10+必须,否则无法获取WIFI详情) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 安卓12+额外权限 -->
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />

注意:定位权限需要动态申请,需引导用户授权,且设备定位功能需开启。

2. 原生代码(Kotlin)

在MainActivity中配置MethodChannel处理Flutter的调用:

import android.content.Context
import android.net.wifi.WifiInfo
import android.net.wifi.WifiManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "wifi_info_channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "getWifiInfo" -> {
                    val wifiInfo = getCurrentWifiInfo()
                    wifiInfo?.let {
                        val signalStrength = it.rssi // 信号强度,负值,越接近0信号越强
                        val bssid = it.bssid
                        result.success(mapOf(
                            "signalStrength" to signalStrength,
                            "bssid" to bssid
                        ))
                    } ?: result.error("NO_WIFI", "未连接WIFI或权限不足", null)
                }
                else -> result.notImplemented()
            }
        }
    }

    private fun getCurrentWifiInfo(): WifiInfo? {
        val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager
        return if (wifiManager.isWifiEnabled) wifiManager.connectionInfo else null
    }
}

iOS端实现

1. 配置权限

在Info.plist中添加定位权限描述(iOS获取WIFI信息必须):

<key>NSLocationWhenInUseUsageDescription</key>
<string>需要获取定位权限以获取WIFI信息</string>

同时,需在Xcode项目中导入CoreWLAN框架(用于获取信号强度)。

2. 原生代码(Swift)

在AppDelegate中配置MethodChannel:

import UIKit
import Flutter
import CoreWLAN

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    private let CHANNEL = "wifi_info_channel"

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        guard let controller = window?.rootViewController as? FlutterViewController else {
            return super.application(application, didFinishLaunchingWithOptions: launchOptions)
        }
        let channel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler { [weak self] call, result in
            guard let self = self else { return }
            switch call.method {
            case "getWifiInfo":
                self.fetchWifiInfo { signalStrength, bssid in
                    if let rssi = signalStrength, let id = bssid {
                        result.success(["signalStrength": rssi, "bssid": id])
                    } else {
                        result.error("NO_WIFI", "未连接WIFI或权限不足", nil)
                    }
                }
            default:
                result.notImplemented()
            }
        }
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    private func fetchWifiInfo(completion: @escaping (Int?, String?) -> Void) {
        let wifiClient = CWWiFiClient.shared()
        guard let interface = wifiClient.interface(), let currentNetwork = interface.currentNetwork() else {
            completion(nil, nil)
            return
        }
        // 获取BSSID和RSSI信号强度
        let bssid = currentNetwork.bssid
        let rssi = currentNetwork.rssiValue
        completion(rssi, bssid)
    }
}

注意:iOS模拟器无法获取真实WIFI数据,必须用真机测试;iOS 13+需用户授权定位权限才能获取WIFI详情。


Flutter端调用代码

创建工具类统一调用原生方法:

import 'package:flutter/services.dart';

class WifiInfoUtil {
  static const _methodChannel = MethodChannel('wifi_info_channel');

  /// 获取当前WIFI的信号强度(RSSI,负值)和BSSID
  static Future<Map<String, dynamic>?> getCurrentWifiInfo() async {
    try {
      final result = await _methodChannel.invokeMethod('getWifiInfo');
      return result as Map<String, dynamic>?;
    } on PlatformException catch (e) {
      print("获取WIFI信息失败: ${e.message}");
      return null;
    }
  }
}

调用示例:

void _getWifiData() async {
  var wifiInfo = await WifiInfoUtil.getCurrentWifiInfo();
  if (wifiInfo != null) {
    print("信号强度: ${wifiInfo['signalStrength']}, BSSID: ${wifiInfo['bssid']}");
  }
}

关键注意点

  • 安卓:必须确保定位权限已授权,且WIFI处于开启状态;安卓10+无定位权限无法获取WIFI详情。
  • iOS:定位权限是硬性要求,CoreWLAN仅支持真机测试,模拟器无法返回有效数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:30:52