最近在搞 UniApp 的低功耗蓝牙(BLE)开发,安卓端顺风顺水,代码一写,MAC地址到手,通讯畅通无阻。结果一到iOS端,直接“翻车”——连接倒是能连接,但一涉及到需要校验 MAC 地址的协议,直接报错。排查了半天才发现,原来是苹果在搞“隐私保护”。今天就来和大家好好唠唠这个让无数开发者头秃的“MAC地址差异”问题,以及我们该如何优雅地填坑。
01 核心矛盾:Android vs iOS 的“平行宇宙”
在 UniApp中调用 uni.getBluetoothDevices 或监听 uni.onBluetoothDeviceFound 时,返回的 deviceId 字段在两个平台上完全是两个概念。Android 端:deviceId = MAC 地址格式通常是 AA:BB:CC:DD:EE:FF。简单粗暴,拿来就能用,直接作为设备的唯一身份证。iOS 端:deviceId = UUID (通用唯一识别码)格式通常是 E1C2A3B4-… 这种长字符串。这是苹果系统为了保护用户隐私,随机生成的一个临时标识符。它不是真实的物理 MAC 地址,而且每次重新扫描或重连,这个 ID 甚至可能会变(取决于系统版本和缓存策略)。结论:如果你的业务逻辑强依赖 MAC 地址(比如某些老旧的硬件协议),在 iOS 上直接用 deviceId 是绝对行不通的。
02 为什么苹果要这么干?
苹果在 iOS 13 之后大大加强了蓝牙隐私权限。为了防止 App 开发者通过蓝牙 MAC 地址追踪用户的物理位置和行为习惯,Apple 屏蔽了获取真实 MAC 的 API。所以,别费劲去破解 deviceId 了,那个 UUID 就是 iOS 能给你的极限。
03 解决方案:如何在 iOS 上获取“真身”?
既然 deviceId 靠不住,我们得想办法从别的地方把 MAC 地址“抠”出来。这里有几招实战中总结的方案: