getUniqueIdentifier method

  1. @override
Future<String?> getUniqueIdentifier()
override

Returns the unique device identifier for the current platform.

May return null if the platform cannot provide a valid identifier.

Platform behavior:

  • Android: Returns Settings.Secure.ANDROID_ID
  • iOS: Returns UIDevice.identifierForVendor
  • macOS: Returns IOPlatformUUID using IOKit (macOS 12+: kIOMainPortDefault, older: kIOMasterPortDefault)
  • Windows: Reads the registry value HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid
  • Linux: Reads from /etc/machine-id
  • Web: Returns a fingerprint-based hash if possible; otherwise, a random UUID is generated and stored in localStorage

Implementation

@override
Future<String?> getUniqueIdentifier() async {
  const key = 'unique_device_identifier';
  String? uniqueIdentifier = window.localStorage.getItem(key);

  if (uniqueIdentifier == null) {
    try {
      final fingerprint = await _browserFingerprint.collect();
      final data = utf8.encode(fingerprint);
      final digestBuffer =
          await window.crypto.subtle.digest('SHA-256', data.toJS).toDart;

      uniqueIdentifier = bufferToHex(digestBuffer as JSArrayBuffer);
    } catch (e) {
      uniqueIdentifier = generateUUID();
      window.localStorage.setItem(key, uniqueIdentifier);

      developer.log(
        '[unique_device_identifier] Web: Failed create uuid. (Err. $e)',
      );
    }
  }

  developer.log(
    '[unique_device_identifier] Web: unique identifier: $uniqueIdentifier',
  );
  return uniqueIdentifier;
}