getDeviceUniqueId static method

Future<String?> getDeviceUniqueId()

获取设备唯一标识(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;
}