如何获得独特的设备ID?

时间:2017-07-11 10:07:46

标签: flutter

在Android中我们有,Settings.Secure.ANDROID_ID。我不知道IOS等价物。 是否有一个扑动的插件或一种方法来获得Android和IOS的独特设备ID?

10 个答案:

答案 0 :(得分:6)

我刚刚发布了一个插件来为您的问题提供解决方案。 它使用Android的Settings.Secure.ANDROID_ID并依靠identifierForVendor和iOS的钥匙串来使行为等同于Android。 Here's the link.

答案 1 :(得分:4)

有一个名为device_info的插件。你可以得到它here。在iOS中,您无法获得唯一的设备ID。这有一个炒锅。

 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();
      } 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。

答案 2 :(得分:4)

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;
}

答案 3 :(得分:1)

使用Flutter团队本身开发的device_info插件。这是您在两个平台上都可以获取ID的方式。

在您的pubspec.yaml文件中添加以下内容:

dependencies:
  device_info: ^0.4.0+4

创建方法:

Future<String> _getId() async {
  DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
  if (Theme.of(context).platform == TargetPlatform.iOS) {
    IosDeviceInfo iosDeviceInfo = await deviceInfo.iosInfo;
    return iosDeviceInfo.identifierForVendor; // unique ID on iOS
  } else {
    AndroidDeviceInfo androidDeviceInfo = await deviceInfo.androidInfo;
    return androidDeviceInfo.androidId; // unique ID on Android
  }
}

使用方式:

String deviceId = await _getId();

Source

答案 4 :(得分:1)

我发布了一个新的 Flutter 插件 client_information 可能会有所帮助。它提供了一种从应用程序用户那里获取一些基本设备信息的简单方法。

  1. 添加到 pubspec.yaml
  dependencies:
    ...
    client_information: ^1.0.1
  1. 导入到您的项目
import 'package:client_information/client_information.dart';
  1. 然后你可以像这样获取设备 ID
/// Support on iOS, Android and web project
Future<String> getDeviceId() async {
  return (await ClientInformation.fetch()).deviceId;
}

答案 5 :(得分:1)

在您的 .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;
}

答案 6 :(得分:1)

最新:

插件 device_info 给出了 deprecation notice 并替换为 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"

您可以查看 here 完整示例:

对于唯一 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;
  }
} 

答案 7 :(得分:0)

如果您要投放广告,可以使用ASIdentifierManager。您只应将其用于广告。出于隐私原因,操作系统在iOS上没有提供通用的UDID机制。

如果您使用的是firebase_auth插件,则可以匿名登录,然后使用FirebaseUser的ID。这将为您提供特定于Firebase应用程序的标识符。

答案 8 :(得分:0)

更新:由于该线程在Google上的排名很高,因此我想在此提及device_id软件包已停产。软件包platform_device_id的工作方式几乎相同,并且具有最新的活动。在iOS崩溃后看到日志中的错误并指向旧软件包后,我们将切换到该状态。

答案 9 :(得分:-1)

在.yaml文件中添加以下代码。

PUT <your_new_index_name>/_doc/1
{
  "myfield":"myvalue"
}

在您的班级中添加导入

device_id: ^0.1.3

现在从以下位置获取设备ID:

import 'package:device_id/device_id.dart';