getDeviceUniqueId static method
获取设备唯一标识(AndroidId或iOS唯一标识)
WHY: 改进iOS设备ID获取,增加重试机制和临时ID机制 解决iOS首次启动时Keychain未解锁导致设备ID获取失败的问题
Implementation
static Future<String?> getDeviceUniqueId() async {
// 先判断是否是Android
if (Platform.isAndroid) {
String? androidId = await getAndroidId();
if (androidId != null && androidId.isNotEmpty) {
return androidId;
}
}
// 再判断是否是iOS
if (Platform.isIOS) {
// 增加重试机制,等待Keychain解锁
// WHY: iOS首次启动时Keychain可能未解锁,需要多次重试
// 增加重试次数和延迟时间,提高成功率
for (int i = 0; i < 5; i++) {
String? iosId = await getIosUniqueId();
if (iosId != null && iosId.isNotEmpty) {
return iosId;
}
// 等待Keychain解锁,递增延迟(100ms, 200ms, 300ms, 500ms)
if (i < 4) {
final delayMs = i == 0 ? 100 : (i == 1 ? 200 : (i == 2 ? 300 : 500));
await Future.delayed(Duration(milliseconds: delayMs));
}
}
// 如果仍然失败,生成临时ID并异步保存到Keychain
// 这样不会阻塞当前请求,后续可以更新为持久ID
final tempId = _uuid.v4();
// 异步保存到Keychain(不阻塞)
_writeIosDeviceIdToKeychain(tempId).catchError((_) {
// 保存失败不影响当前流程
});
return tempId;
}
return null;
}