import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; import '../utils/kr_secure_storage.dart'; import '../utils/kr_log_util.dart'; import 'package:crypto/crypto.dart'; import 'dart:convert'; /// 设备信息服务 /// 用于获取设备唯一标识和其他设备信息 class KRDeviceInfoService { static final KRDeviceInfoService _instance = KRDeviceInfoService._internal(); factory KRDeviceInfoService() => _instance; KRDeviceInfoService._internal(); final DeviceInfoPlugin _deviceInfo = DeviceInfoPlugin(); String? _deviceId; Map? _deviceDetails; // 获取设备唯一标识 String? get deviceId => _deviceId; // 获取设备详细信息 Map? get deviceDetails => _deviceDetails; /// 初始化设备信息 Future initialize() async { try { print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); print('📱 开始初始化设备信息服务'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); KRLogUtil.kr_i('📱 开始初始化设备信息', tag: 'KRDeviceInfoService'); _deviceId = await _getDeviceId(); _deviceDetails = await _getDeviceDetails(); print('✅ 设备信息初始化成功'); print('📱 设备ID: $_deviceId'); print('📱 设备平台: ${getPlatformName()}'); print('📱 设备型号: ${getDeviceModel()}'); print('📱 系统版本: ${getOSVersion()}'); print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); KRLogUtil.kr_i('✅ 设备信息初始化成功', tag: 'KRDeviceInfoService'); KRLogUtil.kr_i('📱 设备ID - $_deviceId', tag: 'KRDeviceInfoService'); KRLogUtil.kr_i('📱 设备详情 - $_deviceDetails', tag: 'KRDeviceInfoService'); } catch (e) { print('❌ 设备信息初始化失败: $e'); KRLogUtil.kr_e('❌ 设备信息初始化失败 - $e', tag: 'KRDeviceInfoService'); } } /// 获取设备唯一标识 Future _getDeviceId() async { try { String? identifier; if (Platform.isAndroid) { final androidInfo = await _deviceInfo.androidInfo; // Android使用androidId作为唯一标识 identifier = androidInfo.id; } else if (Platform.isIOS) { final iosInfo = await _deviceInfo.iosInfo; // iOS使用identifierForVendor作为唯一标识 identifier = iosInfo.identifierForVendor; } else if (Platform.isMacOS) { final macInfo = await _deviceInfo.macOsInfo; // macOS使用systemGUID identifier = macInfo.systemGUID; } else if (Platform.isWindows) { final windowsInfo = await _deviceInfo.windowsInfo; // Windows使用计算机名作为唯一标识 identifier = windowsInfo.computerName; } else if (Platform.isLinux) { final linuxInfo = await _deviceInfo.linuxInfo; // Linux使用machineId identifier = linuxInfo.machineId; } else { // Web或其他平台,使用生成的UUID identifier = await _getOrCreateStoredDeviceId(); } // 如果获取失败,使用存储的或生成新的ID if (identifier == null || identifier.isEmpty) { identifier = await _getOrCreateStoredDeviceId(); } return identifier; } catch (e) { print('❌ 获取设备ID失败: $e'); KRLogUtil.kr_e('❌ 获取设备ID失败 - $e', tag: 'KRDeviceInfoService'); // 如果获取失败,返回存储的或生成新的ID return await _getOrCreateStoredDeviceId(); } } /// 获取或创建存储的设备ID Future _getOrCreateStoredDeviceId() async { try { const key = 'kr_device_unique_id'; final storage = KRSecureStorage(); String? storedId = await storage.kr_readData(key: key); if (storedId == null || storedId.isEmpty) { // 生成新的UUID storedId = _generateUniqueId(); await storage.kr_saveData(key: key, value: storedId); print('📱 生成新的设备ID: $storedId'); KRLogUtil.kr_i('📱 生成新的设备ID - $storedId', tag: 'KRDeviceInfoService'); } else { print('📱 使用存储的设备ID: $storedId'); KRLogUtil.kr_i('📱 使用存储的设备ID - $storedId', tag: 'KRDeviceInfoService'); } return storedId; } catch (e) { print('❌ 获取存储的设备ID失败: $e'); KRLogUtil.kr_e('❌ 获取存储的设备ID失败 - $e', tag: 'KRDeviceInfoService'); return _generateUniqueId(); } } /// 生成唯一ID String _generateUniqueId() { final timestamp = DateTime.now().millisecondsSinceEpoch.toString(); final random = DateTime.now().microsecondsSinceEpoch.toString(); final combined = '$timestamp-$random'; // 使用MD5生成唯一标识 final bytes = utf8.encode(combined); final digest = md5.convert(bytes); return digest.toString(); } /// 获取设备详细信息 Future> _getDeviceDetails() async { try { if (Platform.isAndroid) { final androidInfo = await _deviceInfo.androidInfo; return { 'platform': 'android', 'device': androidInfo.device, 'model': androidInfo.model, 'brand': androidInfo.brand, 'manufacturer': androidInfo.manufacturer, 'androidId': androidInfo.id, 'version': androidInfo.version.release, 'sdkInt': androidInfo.version.sdkInt, }; } else if (Platform.isIOS) { final iosInfo = await _deviceInfo.iosInfo; return { 'platform': 'ios', 'name': iosInfo.name, 'model': iosInfo.model, 'systemName': iosInfo.systemName, 'systemVersion': iosInfo.systemVersion, 'identifierForVendor': iosInfo.identifierForVendor, 'isPhysicalDevice': iosInfo.isPhysicalDevice, }; } else if (Platform.isMacOS) { final macInfo = await _deviceInfo.macOsInfo; return { 'platform': 'macos', 'computerName': macInfo.computerName, 'model': macInfo.model, 'hostName': macInfo.hostName, 'arch': macInfo.arch, 'systemGUID': macInfo.systemGUID, }; } else if (Platform.isWindows) { final windowsInfo = await _deviceInfo.windowsInfo; return { 'platform': 'windows', 'computerName': windowsInfo.computerName, 'numberOfCores': windowsInfo.numberOfCores, 'systemMemoryInMegabytes': windowsInfo.systemMemoryInMegabytes, }; } else if (Platform.isLinux) { final linuxInfo = await _deviceInfo.linuxInfo; return { 'platform': 'linux', 'name': linuxInfo.name, 'version': linuxInfo.version, 'id': linuxInfo.id, 'machineId': linuxInfo.machineId, }; } else if (kIsWeb) { final webInfo = await _deviceInfo.webBrowserInfo; return { 'platform': 'web', 'browserName': webInfo.browserName.toString(), 'userAgent': webInfo.userAgent, 'vendor': webInfo.vendor, }; } return { 'platform': 'unknown', }; } catch (e) { print('❌ 获取设备详情失败: $e'); KRLogUtil.kr_e('❌ 获取设备详情失败 - $e', tag: 'KRDeviceInfoService'); return { 'platform': 'unknown', 'error': e.toString(), }; } } /// 获取平台名称 String getPlatformName() { if (Platform.isAndroid) return 'Android'; if (Platform.isIOS) return 'iOS'; if (Platform.isMacOS) return 'macOS'; if (Platform.isWindows) return 'Windows'; if (Platform.isLinux) return 'Linux'; if (kIsWeb) return 'Web'; return 'Unknown'; } /// 获取设备型号 String getDeviceModel() { if (_deviceDetails == null) return 'Unknown'; if (Platform.isAndroid) { return '${_deviceDetails!['brand']} ${_deviceDetails!['model']}'; } else if (Platform.isIOS) { return _deviceDetails!['model'] ?? 'Unknown'; } else if (Platform.isMacOS) { return _deviceDetails!['model'] ?? 'Unknown'; } return 'Unknown'; } /// 获取操作系统版本 String getOSVersion() { if (_deviceDetails == null) return 'Unknown'; if (Platform.isAndroid) { return _deviceDetails!['version'] ?? 'Unknown'; } else if (Platform.isIOS) { return _deviceDetails!['systemVersion'] ?? 'Unknown'; } return 'Unknown'; } /// 获取User-Agent信息 String getUserAgent() { final platform = getPlatformName(); final model = getDeviceModel(); final osVersion = getOSVersion(); return 'BearVPN/1.0.0 ($platform; $model; $osVersion) Flutter'; } }