在Android中,我们有Settings.Secure.ANDROID_ID
。我不知道iOS的相应功能。
在Flutter中有没有插件或方法可以获取Android和iOS的唯一设备ID?
在Android中,我们有Settings.Secure.ANDROID_ID
。我不知道iOS的相应功能。
在Flutter中有没有插件或方法可以获取Android和iOS的唯一设备ID?
使用由Flutter社区开发的device_info_plus插件。这是您可以在两个平台上获取ID的方法。
在您的pubspec.yaml
文件中添加以下内容:
dependencies:
device_info_plus: ^3.2.3
创建一个方法:Future<String?> _getId() async {
var deviceInfo = DeviceInfoPlugin();
if (Platform.isIOS) { // import 'dart:io'
var iosDeviceInfo = await deviceInfo.iosInfo;
return iosDeviceInfo.identifierForVendor; // unique ID on iOS
} else if(Platform.isAndroid) {
var androidDeviceInfo = await deviceInfo.androidInfo;
return androidDeviceInfo.androidId; // unique ID on Android
}
}
使用方法:
String? deviceId = await _getId();
有一个名为device_info的插件,你可以在这里获取它。
请查看官方示例
static Future<List<String>> getDeviceDetails() async {
String deviceName;
String deviceVersion;
String identifier;
final DeviceInfoPlugin deviceInfoPlugin = new DeviceInfoPlugin();
try {
if (Platform.isAndroid) {
var build = await deviceInfoPlugin.androidInfo;
deviceName = build.model;
deviceVersion = build.version.toString();
identifier = build.androidId; //UUID for Android
} else if (Platform.isIOS) {
var data = await deviceInfoPlugin.iosInfo;
deviceName = data.name;
deviceVersion = data.systemVersion;
identifier = data.identifierForVendor; //UUID for iOS
}
} on PlatformException {
print('Failed to get platform version');
}
//if (!mounted) return;
return [deviceName, deviceVersion, identifier];
}
您可以将此UUID存储在钥匙串中。这样,您就可以为设备设置唯一ID。
更新
identifierForVendor
会更改,因此它不是100%可靠的常量。 - Lee Mordellbuild.version
会返回一个实例,我们应该使用哪个变量? - Arief Wijaya我刚刚发布了一个插件,为你提供解决方案。 它在Android上使用Settings.Secure.ANDROID_ID,在iOS上依赖于identifierForVendor和keychain,以使行为等同于Android的。 这是链接。
更新于2021年1月3日:现在推荐使用名为device_info_plus的扩展社区插件,它支持比device_info更多的平台,并旨在支持flutter支持的所有平台。以下是使用示例:
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:device_info_plus/device_info_plus.dart';
import 'dart:io';
Future<String> getDeviceIdentifier() async {
String deviceIdentifier = "unknown";
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if (Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
deviceIdentifier = androidInfo.androidId;
} else if (Platform.isIOS) {
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
deviceIdentifier = iosInfo.identifierForVendor;
} else if (kIsWeb) {
// The web doesnt have a device UID, so use a combination fingerprint as an example
WebBrowserInfo webInfo = await deviceInfo.webBrowserInfo;
deviceIdentifier = webInfo.vendor + webInfo.userAgent + webInfo.hardwareConcurrency.toString();
} else if (Platform.isLinux) {
LinuxDeviceInfo linuxInfo = await deviceInfo.linuxInfo;
deviceIdentifier = linuxInfo.machineId;
}
return deviceIdentifier;
}
String deviceId = await PlatformDeviceId.getDeviceId;
这个包使用更新的Android嵌入版本,并且还支持空安全。
platform_device_id
是一个旧的包,但它与 Dart 3 兼容,并且给我提供了唯一的设备 ID,而不像 device_info_plus
。感谢 @cansu 提到它。 - Solomon Tesfaye插件device_info已经发布了弃用通知,并被device_info_plus替换。
示例:
dependencies:
device_info_plus: ^9.0.2
使用方法:
import 'package:device_info_plus/device_info_plus.dart';
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
print('Running on ${androidInfo.model}'); // e.g. "Moto G (4)"
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
print('Running on ${iosInfo.utsname.machine}'); // e.g. "iPod7,1"
WebBrowserInfo webBrowserInfo = await deviceInfo.webBrowserInfo;
print('Running on ${webBrowserInfo.userAgent}'); // e.g. "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
您可以在这里查看完整示例:
您可以使用以下代码来获取唯一标识符:
String deviceIdentifier = '';
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if (kIsWeb) {
final WebBrowserInfo webInfo = await deviceInfo.webBrowserInfo;
deviceIdentifier = webInfo.vendor! +
webInfo.userAgent! +
webInfo.hardwareConcurrency.toString();
} else {
if (Platform.isAndroid) {
final AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
deviceIdentifier = androidInfo.id;
} else if (Platform.isIOS) {
final IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
deviceIdentifier = iosInfo.identifierForVendor!;
} else if (Platform.isLinux) {
final LinuxDeviceInfo linuxInfo = await deviceInfo.linuxInfo;
deviceIdentifier = linuxInfo.machineId!;
}
}
编辑:自v4.1.0起,androidId已经不存在。
hardwareConcurrency
不是一个好的例子。它将返回机器上的核心数,不是非常独特的。 - Oliver Dixonuuid
包生成一个唯一标识符。 - Mahesh Jamdade使用Flutter社区开发的device_info_plus
包。这是你可以在两个平台上获取ID的方法。
在你的pubspec.yaml文件中添加以下内容:
dependencies:
device_info_plus: ^3.2.3
Future<String> getUniqueDeviceId() async {
String uniqueDeviceId = '';
var deviceInfo = DeviceInfoPlugin();
if (Platform.isIOS) { // import 'dart:io'
var iosDeviceInfo = await deviceInfo.iosInfo;
uniqueDeviceId = '${iosDeviceInfo.name}:${iosDeviceInfo.identifierForVendor}'; // unique ID on iOS
} else if(Platform.isAndroid) {
var androidDeviceInfo = await deviceInfo.androidInfo;
uniqueDeviceId = '${androidDeviceInfo.name}:${androidDeviceInfo.id}' ; // unique ID on Android
}
return uniqueDeviceId;
}
使用方法:
String deviceId = await getUniqueDeviceId();
输出:
M2102J20SG::SKQ1.211006.001
注意:
不要使用 androidDeviceInfo.androidId
。当您的 MAC 地址更改时,这会发生变化。 Android OS 10/11以上的移动设备将生成随机 MAC。除非手动禁用,否则此功能默认启用。这会导致在网络切换时 androidId
发生变化。您可以通过将上面的 androidDeviceInfo.id
更改为 androidDeviceInfo.androidId
来确认此问题。
您可能只需使用 androidDeviceInfo.name
,因为它永远不会更改。
如果操作系统更新,则 androidDeviceInfo.id
也可能更改,因为它是 Android 操作系统版本。
仅当设备使用固定 MAC 地址时,才应使用 androidDeviceInfo.androidId
如第1点所述。否则,仅使用 *.name
或 androidDeviceInfo.id
与 *.name
一起使用。
Add in your following code in your .yaml file.
device_id: ^0.1.3
Add import in your class
import 'package:device_id/device_id.dart';
Now get device id from:
String deviceid = await DeviceId.getID;
android.permission.READ_PHONE_STATE
权限。这将导致在发布应用程序到Play商店时出现警告,因为“在APK中使用这些权限的应用程序需要设置隐私政策”。 - Sisir我发布了一个新的Flutter插件client_information,它可能会有所帮助。它提供了一种简单的方式,从您的应用程序用户那里获取一些基本设备信息。
dependencies:
...
client_information: ^1.0.1
import 'package:client_information/client_information.dart';
/// Support on iOS, Android and web project
Future<String> getDeviceId() async {
return (await ClientInformation.fetch()).deviceId;
}