如何在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
相关产品推荐
相关产品推荐

