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

Flutter使用device_info_plus获取设备ID变更问题及替代方案咨询

问题分析与解决方案

一、ID变更的原因

Android端(androidInfo.id)

  • androidInfo.id对应系统的Build.ID,这是ROM构建的版本标识符,并非硬件级唯一ID,以下场景会导致它变更:
    • 系统OTA更新:每次系统版本升级、安全补丁推送,ROM构建ID都会随之改变
    • 刷入第三方ROM/自定义固件:更换ROM后,Build.ID会同步新ROM的构建信息
    • 厂商小版本系统维护更新:部分厂商的轻量系统更新也会修改该字段

iOS端(identifierForVendor)

  • identifierForVendor是苹果提供的应用厂商级ID,以下情况会触发ID重置:
    • 用户删除该厂商下所有应用后重新安装:苹果会生成新的ID
    • 应用卸载后间隔较长时间重装:部分场景下苹果会重置该ID
    • 应用签名变更:比如从测试签名切换为正式签名,ID可能随之改变

二、获取稳定唯一设备ID的替代方案

Android端

方案1:使用androidInfo.androidId

  • 这是系统首次启动时生成的64位十六进制字符串,除非恢复出厂设置或刷写系统分区,否则不会变更。注意:少数厂商定制ROM可能存在ID重复,但概率极低。
  • 修改后代码示例:
void checkImeiOnAndroid(String apiImei) async {
    isImeiMatched = true;
    DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
    AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
    String? deviceId = androidInfo.androidId; // 替换为androidId
    isImeiMatched = (deviceId == apiImei);
    notifyListeners();
}

方案2:多硬件标识哈希生成自定义ID

  • 收集多个稳定硬件信息(如board、brand、device、hardware),通过哈希算法生成唯一字符串,降低单一标识变更风险:
import 'dart:convert';
import 'package:crypto/crypto.dart';

String generateCustomAndroidId(AndroidDeviceInfo info) {
  String rawString = "${info.board}${info.brand}${info.device}${info.hardware}${info.product}";
  var bytes = utf8.encode(rawString);
  var digest = sha256.convert(bytes);
  return digest.toString();
}

iOS端

方案1:使用advertisingIdentifier(需合规)

  • 这是苹果广告框架提供的ID,用户可在设置中主动重置,但比identifierForVendor更稳定。需引入advertising_id包,同时必须在App隐私说明中声明用途,符合App Store政策。
  • 代码示例:
import 'package:advertising_id/advertising_id.dart';

void checkDeviceIdOnIOS(String apiDeviceId) async {
    isDeviceIdMatched = true;
    String? adId = await AdvertisingId.id;
    String deviceId = adId ?? "Safari";
    isDeviceIdMatched = (deviceId == apiDeviceId);
    notifyListeners();
}

方案2:钥匙串存储自定义UUID

  • 首次启动时生成UUID,存入iOS钥匙串,即使应用卸载重装,钥匙串数据也会保留(除非用户重置设备)。需使用flutter_secure_storage包:
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:uuid/uuid.dart';

final storage = FlutterSecureStorage();
final uuid = Uuid();

Future<String> getPersistentDeviceId() async {
  String? storedId = await storage.read(key: "persistent_device_id");
  if (storedId == null) {
    storedId = uuid.v4();
    await storage.write(key: "persistent_device_id", value: storedId);
  }
  return storedId;
}

注意事项

  • 没有100%永久不变的设备ID,恢复出厂设置、硬件更换都会导致ID变化
  • 需遵守平台隐私规则:Android 10+限制IMEI等硬件标识的获取权限;iOS要求明确说明ID的使用用途

内容的提问来源于stack exchange,提问作者Tanmoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:11:10