Flutter跨Android/iOS获取卸载后不变的唯一设备ID
解决Flutter中跨平台获取卸载后不变的设备ID问题
Android 平台解决方案
Android 上可通过以下两种可靠方式获取卸载后不变的ID:
- Settings Secure Android ID:对应原生
Settings.Secure.ANDROID_ID,Android 8.0+ 版本中,同一开发者签名的应用卸载重装后该ID保持不变,仅在恢复出厂设置、刷机或更换设备时才会变更。使用device_info_plus获取的代码示例:
注意:不同开发者签名的应用会获取到不同的ID,若需跨应用共享ID,此方案不适用。import 'package:device_info_plus/device_info_plus.dart'; Future<String?> getAndroidId() async { final androidInfo = await DeviceInfoPlugin().androidInfo; return androidInfo.id; } - MediaDrm UUID:这是硬件级别的唯一标识,基于设备的DRM模块生成,几乎不会变更(除非硬件损坏)。需要添加权限
android.permission.DRM,需通过原生代码实现后与Flutter通信,device_info_plus未直接封装该接口。
iOS 平台解决方案
iOS 由于系统限制,没有完全永久不变的设备ID,但可通过以下方式实现卸载后持久化:
- Keychain 存储自定义UUID:生成一个随机UUID,存储到iOS的Keychain中(Keychain数据不受应用卸载影响)。卸载重装应用后,先尝试从Keychain读取,若不存在则重新生成并存储。可使用
flutter_keychain包实现:import 'package:flutter_keychain/flutter_keychain.dart'; import 'package:uuid/uuid.dart'; Future<String> getPersistentDeviceId() async { String? storedId = await FlutterKeychain.get(key: 'persistent_device_id'); if (storedId != null) return storedId; String newId = const Uuid().v4(); await FlutterKeychain.put(key: 'persistent_device_id', value: newId); return newId; } - IDFV(Identifier for Vendor):同一开发者账号下的所有应用共享此ID,但若用户卸载该账号下的所有应用后重装,IDFV会变更。使用
device_info_plus获取:
此方案适合不需要完全永久不变,仅需同一厂商应用间关联的场景。import 'package:device_info_plus/device_info_plus.dart'; Future<String?> getIosIdfv() async { final iosInfo = await DeviceInfoPlugin().iosInfo; return iosInfo.identifierForVendor; }
通用注意事项
- 避免使用Advertising ID(IDFA):用户可手动重置该ID,这可能是你之前使用第三方包时出现ID每日变化的原因。
- 合规性:Android 13+ 访问
ANDROID_ID无需特殊权限,但需遵守隐私政策;iOS 使用Keychain或IDFV需在App Store隐私说明中如实披露数据用途。 - 服务器关联:若需绝对可靠的设备标识,建议将获取到的本地ID与服务器绑定,即使本地ID因特殊情况变更,也可通过服务器的关联记录识别设备。
内容的提问来源于stack exchange,提问作者Hassan Gujjar
相关产品推荐
相关产品推荐

