43 lines
1.4 KiB
Dart
43 lines
1.4 KiB
Dart
import 'dart:io';
|
||
|
||
import 'package:device_info_plus/device_info_plus.dart';
|
||
import 'package:uuid/uuid.dart';
|
||
|
||
/// 设备信息工具类(控制端,非系统签名应用)
|
||
///
|
||
/// 与 WebRTCControlled 的 DeviceUtils 对应,但控制端没有系统签名,
|
||
/// 因此无法稳定获取真实的硬件序列号,这里采用「不要求准确」的兜底方案:
|
||
/// 1. 优先使用官方插件([DeviceInfoPlugin])提供的 serialNumber;
|
||
/// 2. 失败则使用 iOS 的 identifierForVendor;
|
||
/// 3. 再失败则生成随机 UUID。
|
||
class DeviceUtils {
|
||
DeviceUtils._();
|
||
|
||
/// 获取设备标识(适用于普通应用)。
|
||
///
|
||
/// 兼容各平台:Android 使用官方序列号,iOS 使用 identifierForVendor,
|
||
/// 均不可用时回退到随机 UUID。
|
||
static Future<String> getSerialNumber() async {
|
||
const uuid = Uuid();
|
||
try {
|
||
final deviceInfo = DeviceInfoPlugin();
|
||
if (Platform.isAndroid) {
|
||
final androidInfo = await deviceInfo.androidInfo;
|
||
final serial = androidInfo.serialNumber;
|
||
if (serial.isNotEmpty && serial.toLowerCase() != 'unknown') {
|
||
return serial;
|
||
}
|
||
} else if (Platform.isIOS) {
|
||
final iosInfo = await deviceInfo.iosInfo;
|
||
final id = iosInfo.identifierForVendor;
|
||
if (id != null && id.isNotEmpty) {
|
||
return id;
|
||
}
|
||
}
|
||
} catch (_) {
|
||
// 获取失败,走兜底逻辑
|
||
}
|
||
return uuid.v4();
|
||
}
|
||
}
|