getUniqueIdentifier method
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
IOPlatformUUIDusing 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;
}