feat: 修改ios的设备号存储方式

This commit is contained in:
speakeloudest 2026-01-12 01:47:02 -08:00
parent 4139ebcc38
commit 0474f3c9d9

View File

@ -2,6 +2,7 @@ import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_udid/flutter_udid.dart';
import 'package:flutter_keychain/flutter_keychain.dart';
import '../utils/kr_secure_storage.dart';
import '../utils/kr_log_util.dart';
import 'package:crypto/crypto.dart';
@ -142,24 +143,39 @@ class KRDeviceInfoService {
}
}
/// iOS设备ID - 使identifierForVendor,
/// iOS限制较严,IMEI等敏感信息
/// iOS设备ID - 使Keychain存储的UUID
/// iOS的identifierForVendor在所有同供应商应用卸载后会重置
/// 使flutter_keychain存储到iOS Keychain使ID也不会变化
Future<String> _getIOSDeviceId() async {
try {
const keychainKey = 'kr_ios_device_persistent_id';
// 1. iOS Keychain读取已存储的设备ID
String? storedId = await FlutterKeychain.get(key: keychainKey);
if (storedId != null && storedId.isNotEmpty) {
if (kDebugMode) {
print('📱 iOS: 从Keychain读取已存储的设备ID');
}
KRLogUtil.kr_i('📱 iOS: 使用Keychain中的持久化设备ID', tag: 'KRDeviceInfoService');
return storedId;
}
// 2. Keychain中没有ID
final iosInfo = await _deviceInfo.iosInfo;
// 使 flutter_udid
// 使
String udid = await FlutterUdid.consistentUdid;
//
// 使identifierForVendor作为主要因子
final factors = [
udid,
iosInfo.identifierForVendor ?? '', // Vendor标识
iosInfo.utsname.machine, // "iPhone14,3"
iosInfo.model, //
iosInfo.systemName, //
iosInfo.systemVersion, //
iosInfo.name, // ("iPhone 14 Pro")
iosInfo.utsname.machine, //
// : iosInfo.identifierForVendor -
// : iosInfo.name -
// : iosInfo.systemVersion -
];
final combined = factors
@ -168,13 +184,17 @@ class KRDeviceInfoService {
final bytes = utf8.encode(combined);
final hash = sha256.convert(bytes);
final newDeviceId = hash.toString();
// 3. iOS Keychain使
await FlutterKeychain.put(key: keychainKey, value: newDeviceId);
if (kDebugMode) {
print('📱 iOS多因子ID生成 - 因子数: ${factors.where((f) => f.isNotEmpty).length}');
print('📱 iOS: 生成新设备ID并保存到Keychain - 因子数: ${factors.where((f) => f.isNotEmpty).length}');
}
KRLogUtil.kr_i('📱 iOS多因子ID - $hash', tag: 'KRDeviceInfoService');
KRLogUtil.kr_i('📱 iOS: 生成并持久化新设备ID到Keychain', tag: 'KRDeviceInfoService');
return hash.toString();
return newDeviceId;
} catch (e) {
if (kDebugMode) {
print('❌ iOS设备ID获取失败: $e');