在 Android 中,我们有Settings.Secure.ANDROID_ID
. 我不知道 iOS 等价物。是否有一个颤振插件或一种方法可以在颤动中为 Android 和 IOS 获取唯一的设备 ID?
9 回答
有一个名为 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。
空安全码
使用Flutter 社区开发的device_info_plus插件。这就是您可以在两个平台上获取 ID 的方式。
在您的pubspec.yaml
文件中添加以下内容:
dependencies:
device_info_plus: ^3.0.1
创建一个方法:
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 {
var androidDeviceInfo = await deviceInfo.androidInfo;
return androidDeviceInfo.androidId; // unique ID on Android
}
}
用法:
String? deviceId = await _getId();
我刚刚发布了一个插件来为您的问题提供解决方案。它使用 Android 的 Settings.Secure.ANDROID_ID 并依赖 identifierForVendor 和 iOS 的钥匙串来使行为等同于 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;
}
使用device_id插件
在 .yaml 文件中添加以下代码。
device_id: ^0.1.3
在您的课程中添加导入
import 'package:device_id/device_id.dart';
现在从以下位置获取设备 ID:
String deviceid = await DeviceId.getID;
我发布了一个新的颤振插件client_information可能会有所帮助。它提供了一种从应用程序用户那里获取一些基本设备信息的简单方法。
- 添加到 pubspec.yaml
dependencies:
...
client_information: ^1.0.1
- 导入您的项目
import 'package:client_information/client_information.dart';
- 然后您可以像这样获取设备ID
/// Support on iOS, Android and web project
Future<String> getDeviceId() async {
return (await ClientInformation.fetch()).deviceId;
}
最新的:
插件device_info已给出弃用通知并由 device_info_plus取代
例子:
dependencies:
device_info_plus: ^2.1.0
如何使用:
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"
您可以在此处查看完整示例:
对于唯一 ID:
您可以使用以下代码获取唯一 ID:
if (kIsWeb) {
WebBrowserInfo webInfo = await deviceInfo.webBrowserInfo;
deviceIdentifier = webInfo.vendor +
webInfo.userAgent +
webInfo.hardwareConcurrency.toString();
} else {
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 (Platform.isLinux) {
LinuxDeviceInfo linuxInfo = await deviceInfo.linuxInfo;
deviceIdentifier = linuxInfo.machineId;
}
}
在 .yaml 文件中添加以下代码。
device_info_plus: ^1.0.0
我使用以下方法来获取支持所有平台(即)Android、IOS 和 Web 的设备信息。
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
Future<String> getDeviceIdentifier() async {
String deviceIdentifier = "unknown";
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if (kIsWeb) {
WebBrowserInfo webInfo = await deviceInfo.webBrowserInfo;
deviceIdentifier = webInfo.vendor +
webInfo.userAgent +
webInfo.hardwareConcurrency.toString();
} else {
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 (Platform.isLinux) {
LinuxDeviceInfo linuxInfo = await deviceInfo.linuxInfo;
deviceIdentifier = linuxInfo.machineId;
}
}
return deviceIdentifier;
}
如果您正在投放广告,您可以使用ASIdentifierManager。您应该只将其用于广告。出于隐私原因,iOS 上的操作系统没有提供通用的 UDID 机制。
如果您使用的是firebase_auth插件,您可以匿名签名,然后使用 FirebaseUser 的 id。这将为您提供一个特定于您的 Firebase 应用的标识符。