Flutter 獲取設(shè)備唯一碼? 比較好用的是?device_info_plus 、platform_device_id 這兩個插件。
首先來說下 device_info_plus 這個插件在獲取安卓的id不能獲取的不是androidId,而是 Build.ID 這個id 沒辦法保證唯一性所以是個大缺陷,再說iOS 獲取的是UUID,而且當(dāng)用戶卸載重裝后UUID會變,也不能保證設(shè)備的唯一性,在做一下數(shù)據(jù)統(tǒng)計的時候不能保證數(shù)據(jù)的準(zhǔn)確性。
再來說說platform_device_id,這個插件在安卓的問題上可以獲取androidid,但是部分手機不能獲取,而且有些紅米手機當(dāng)用戶卸載重裝后也會出現(xiàn)androidId變化的問題,iOS的情況跟device_info_plus這個插件的情況是一樣的。并不能滿足需要。最關(guān)鍵的是platform_device_id這個插件已經(jīng)不怎么更新了,在安卓的grade版本適配會很麻煩。
針對這個問題,以及需求的滿足,我clone了device_info_plus這個插件,并對該插件進行了改造,是的滿足我獲取設(shè)備的唯一id,并且用戶卸載重新安裝后設(shè)備唯一碼不變。
安卓部分手機無法獲取androidId的情況下會生成一個uuid,為了防止用戶卸載后重新安裝設(shè)備碼變化的問題,我采用了SharedPreferences 把獲得值保存在本地,優(yōu)先獲取SharedPreferences這里面的值。
IOS獲取的UUID 變化的問題采用的是keychain把獲取的值保存到獨立沙盒外的地方,每次優(yōu)先獲取keychain中的uuid。這樣保證設(shè)備的唯一碼不變。
使用方法
添加 device_info_plus
device_info_plus:
? ? git: https://gitee.com/breakfly/device_info_plus.git
使用
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
? // 這個處理設(shè)備號信息
? 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);
? ? ? });
? ? }
? }