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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:45:00