Flutter 获取设备唯一码 比较好用的是 device_info_plus 、platform_device_id 这两个插件。
首先来说下 device_info_plus 这个插件在获取安卓的id不能获取的不是androidId,而是 Build.ID 这个id 没办法保证唯一性所以是个大缺陷,再说iOS 获取的是UUID,而且当用户卸载重装后UUID会变,也不能保证设备的唯一性,在做一下数据统计的时候不能保证数据的准确性。
再来说说platform_device_id,这个插件在安卓的问题上可以获取androidid,但是部分手机不能获取,而且有些红米手机当用户卸载重装后也会出现androidId变化的问题,iOS的情况跟device_info_plus这个插件的情况是一样的。并不能满足需要。最关键的是platform_device_id这个插件已经不怎么更新了,在安卓的grade版本适配会很麻烦。
针对这个问题,以及需求的满足,我clone了device_info_plus这个插件,并对该插件进行了改造,是的满足我获取设备的唯一id,并且用户卸载重新安装后设备唯一码不变。
安卓部分手机无法获取androidId的情况下会生成一个uuid,为了防止用户卸载后重新安装设备码变化的问题,我采用了SharedPreferences 把获得值保存在本地,优先获取SharedPreferences这里面的值。
IOS获取的UUID 变化的问题采用的是keychain把获取的值保存到独立沙盒外的地方,每次优先获取keychain中的uuid。这样保证设备的唯一码不变。
使用方法
添加 device_info_plus
device_info_plus:
git: https://gitee.com/breakfly/device_info_plus.git
使用
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
// 这个处理设备号信息
Future<void> initDeviceState() async {
if (Platform.isIOS) {
deviceInfoPlugin.iosInfo.then((value) {
SpUtils.setString(AppOptions.deviceModelKey, value.model);
SpUtils.setString(
AppOptions.deviceMacKey, value.identifierForVendor ?? '');
});
} else if (Platform.isAndroid) {
SpUtils.setString(AppOptions.devicePlatformKey, "Android");
deviceInfoPlugin.androidInfo.then((value) {
SpUtils.setString(AppOptions.deviceModelKey, value.model);
SpUtils.setString(AppOptions.deviceMacKey, value.androidId);
});
}
}