.NET MAUI中NetworkInterface获取设备MAC地址失效问题咨询
核心结论
NetworkInterface 在.NET MAUI中并非完全不可用,但受限于各平台的系统权限限制和MAUI的API适配差异,无法像传统.NET Framework/.NET Core项目那样稳定获取MAC地址,这也是你遇到接口类型显示为Unknown、物理地址为空的原因。
各平台具体情况及替代方案
Android
Android 6.0(API 23)及以上版本严格限制了MAC地址的获取:仅允许获取蓝牙和本地WLAN连接的MAC,其他场景下系统会返回空值或固定占位符。MAUI中的NetworkInterface未针对此限制做适配,因此无法正常识别接口类型和获取MAC。
替代方案:使用Android原生WifiManager API(需申请ACCESS_WIFI_STATE权限,Android 12+需动态申请):
#if ANDROID using Android.Content; using Android.Net.Wifi; public string GetAndroidMacAddress() { var wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(Context.WifiService); var wifiInfo = wifiManager.ConnectionInfo; return wifiInfo.MacAddress ?? "无法获取MAC地址"; } #endif
iOS
iOS从7.0版本开始就禁止第三方应用获取真实MAC地址,系统会统一返回02:00:00:00:00:00。MAUI的NetworkInterface自然也无法绕过此限制。
替代方案:使用IdentifierForVendor(IDFV)作为设备唯一标识,虽然不是MAC,但能满足大多数设备识别需求:
#if IOS using UIKit; public string GetIOSDeviceId() { return UIDevice.CurrentDevice.IdentifierForVendor.ToString() ?? "无法获取设备标识"; } #endif
Windows
Windows平台上NetworkInterface理论上可用,但你的代码仅判断NetworkInterfaceType.Ethernet,可能遗漏了WiFi等其他类型的接口(比如WiFi对应的类型是NetworkInterfaceType.Wireless80211)。调整判断逻辑后可尝试获取:
#if WINDOWS public string GetWindowsMacAddress() { var interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (var ni in interfaces) { // 筛选可用的网络接口(排除回环、未启用的) if (ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback) { var mac = ni.GetPhysicalAddress().ToString(); if (!string.IsNullOrEmpty(mac)) { // 格式化MAC地址为标准格式(XX:XX:XX:XX:XX:XX) return string.Join(":", Enumerable.Range(0, mac.Length / 2) .Select(i => mac.Substring(i * 2, 2))); } } } return "无法获取MAC地址"; } #endif
统一调用示例
在MAUI项目中通过条件编译实现跨平台适配:
public string GetDeviceIdentifier() { #if ANDROID return GetAndroidMacAddress(); #elif IOS return GetIOSDeviceId(); #elif WINDOWS return GetWindowsMacAddress(); #else return "不支持的平台"; #endif }
内容的提问来源于stack exchange,提问作者BitWiseByteDumb

