Flutter 开发如何不使用第三方包实现设备 MAC 地址获取
首先明确前提:从Android 6.0(API 23)、iOS 7版本开始,系统层面已经对第三方普通应用限制了真实MAC地址的获取权限,普通应用调用相关接口只能拿到固定假值
02:00:00:00:00:00,仅系统级应用、拥有特殊白名单权限的应用才可获取真实MAC地址。
无第三方包实现方案(基于Flutter平台通道)
不需要引入任何外部第三方包,自行通过Flutter原生提供的Platform Channel实现跨层通信获取即可,步骤如下:
1. Flutter层定义方法通道
在Dart代码中创建工具类,定义和原生层通信的方法通道:
import 'package:flutter/services.dart'; class MacAddressGetter { // 通道名称要和原生层保持一致,避免冲突 static const MethodChannel _macChannel = MethodChannel('custom_channel/mac_address'); static Future<String?> getDeviceMac() async { try { final String? macAddr = await _macChannel.invokeMethod('getMac'); return macAddr; } on PlatformException catch (_) { return null; } } }
调用时直接执行 MacAddressGetter.getDeviceMac() 即可拿到返回结果。
2. Android端原生适配
- 先在
android/app/src/main/AndroidManifest.xml中添加必要权限:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> - 修改
android/app/src/main/kotlin/你的包名路径/MainActivity.kt代码,实现方法通道回调: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 = "custom_channel/mac_address" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "getMac") { result.success(getMac()) } else { result.notImplemented() } } } private fun getMac(): String { val wifiManager = applicationContext.getSystemService(WIFI_SERVICE) as WifiManager return wifiManager.connectionInfo.macAddress } }
3. iOS端原生适配
修改 ios/Runner/AppDelegate.swift 代码,实现方法通道回调:
import UIKit import Flutter @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { let controller : FlutterViewController = window?.rootViewController as! FlutterViewController let macChannel = FlutterMethodChannel(name: "custom_channel/mac_address", binaryMessenger: controller.binaryMessenger) macChannel.setMethodCallHandler({ (call: FlutterMethodCall, result: FlutterResult) -> Void in guard call.method == "getMac" else { result(FlutterMethodNotImplemented) return } // iOS 7+ 普通应用无法获取真实MAC,可返回固定值或使用identifierForVendor替代 result(UIDevice.current.identifierForVendor?.uuidString ?? "02:00:00:00:00:00") }) GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
额外说明
- 如果你需要做设备唯一标识,不要依赖MAC地址,安卓端可以使用
AndroidId、iOS端使用identifierForVendor替代,这两个值是普通应用可正常获取、且足够满足大部分设备标识需求的参数。 - 仅企业内部定制应用可通过申请系统级权限、ROOT/越狱等特殊方式拿到真实MAC地址,面向公开市场的应用无法实现该需求。
内容的提问来源于stack exchange,提问作者Rajat Palankar
相关产品推荐
相关产品推荐

