Flutter 获取设备标识

本文最后更新于:2026年3月11日 下午

Flutter 获取设备标识:IMEI/UDID/UUID/ANDROID_ID

这篇文章的重点是厘清“设备标识”的概念差异,以及在 Android/iOS 上真实可用的获取方式。

概念图

常见 ID 的定义与区别

  • IMEI:蜂窝网络硬件标识,属于电话功能相关的硬件 ID。
  • UDID:iOS 设备的历史硬件标识,早期可用,但现在对 App Store 应用不可用。
  • UUID:通用唯一标识符,是一种算法生成的随机 ID,并不等同于硬件 ID。
  • MAC:网卡硬件地址,现代系统对普通应用访问受限或返回随机值。
  • ANDROID_ID:Android 系统在设备上的一个平台作用域 ID。
  • identifierForVendor:iOS 为同一开发者团队下的 App 提供的作用域 ID。

IMEI/UDID/MAC 属于“硬件级别 ID”,而 ANDROID_ID/identifierForVendor 属于“平台作用域 ID”,UUID 则是“自行生成的随机 ID”。

Android / iOS 上是否可获取

  • Android:
    • IMEI / 设备序列号:普通应用基本不可用或受严格权限限制。
    • MAC:无法稳定获取,通常返回随机值或全 0。
    • ANDROID_ID:可用,常见且稳定性相对较好。
  • iOS:
    • UDID:App Store 应用不可用。
    • MAC:不可用。
    • identifierForVendor:可用,是官方推荐的替代标识之一。

卸载重装后是否变化

  • ANDROID_ID
    • 通常在设备恢复出厂设置后会变化。
    • 在部分系统版本/厂商实现中,卸载重装可能也会变化。
  • identifierForVendor
    • 当设备上该开发者团队的所有 App 都被卸载后,再安装会变化。
  • UUID(你自己生成的):
    • 如果不做持久化,卸载重装一定变化。

结论:没有哪个 ID 能保证“跨卸载重装、跨账号、跨设备迁移”仍保持不变。

现实中的最佳实践

没有所谓“最好的实践”,只有“在你的业务场景里最合适的实践”。

工程上更稳妥的做法是:

  • 使用 device_info_plus 获取平台作用域 ID:
    • Android:device_info_plus4.0.0 2022/06/20 版本移除了 androidId发布日志中说是因为 Google Play 隐私政策所以才删除的),所以新版本插件现在拿不到 ANDROID_ID
      androidInfo.id 实际是 Build.ID(系统构建号),例如 UP1A.231005.007,它是系统版本/构建信息,不适合作为设备唯一标识。不过可以使用 android_id 插件获取 androidId。
    • iOS:identifierForVendor
  • 把平台 ID 当作“辅助标识”,不要当业务主键。

插件代码示例(device_info_plus)

pubspec.yaml:

1
2
3
4
dependencies:
flutter:
sdk: flutter
device_info_plus: ^12.3.0

lib/device_id_helper.dart:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import 'dart:io';

import 'package:device_info_plus/device_info_plus.dart';

class DeviceIdHelper {
final DeviceInfoPlugin _deviceInfo;

DeviceIdHelper({DeviceInfoPlugin? deviceInfo})
: _deviceInfo = deviceInfo ?? DeviceInfoPlugin();

Future<String?> getPlatformScopedId() async {
if (Platform.isAndroid) {
// device_info_plus 4.0.0+ 2022年6月 已移除 androidId,现在的 androidInfo.id 是 Build.ID(系统构建号)
// 你可以使用 ndroid_id 插件获取 androidId
final info = await _deviceInfo.androidInfo;
return info.androidId;
}

if (Platform.isIOS) {
final info = await _deviceInfo.iosInfo;
return info.identifierForVendor;
}

return null;
}
}

你需要接受的现实

  • 卸载重装后,平台 ID 可能变化。
  • 恢复出厂设置后,平台 ID 也可能变化。
  • 设备标识只能作为业务辅助字段,不应作为唯一主键。

Flutter 获取设备标识
http://bestkele.com/2018/03/09/flutter/device-Identifier/
作者
kele
发布于
2018年3月9日
许可协议