기기 고유 식별(Identify) 얻기 device_info

https://pub.dev/packages/device_info

https://pub.dev/packages/device_info_plus

import 'dart:io';                       //Platform 사용을 위한 패키지
import 'package:flutter/services.dart'; //PlatformException 사용을 위한 패키지
import 'package:device_info/device_info.dart'; // 디바이스 정보 사용 패키지

Future<String> getMobileId() async {
  // DeviceInfoPlugin 클래스 생성
  final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
  // id 저장할 변수
  String id = '';
  try {
    // 플랫폼 확인
    if (Platform.isAndroid) {
      // 안드로이드의 경우 androidInfo를 이용 
      // 이때 await으로 데이터 받을때까지 대기를 해야함
      final AndroidDeviceInfo androidData = await deviceInfoPlugin.androidInfo;
      // 전달 받은 변수의 멤버 변수인 androidId가 고유 id이다.
      id = androidData.androidId;
    } else if (Platform.isIOS) {
      // iOS의 경우 iosInfo를 이용 
      // 이때 await으로 데이터 받을때까지 대기를 해야함
      final IosDeviceInfo iosData = await deviceInfoPlugin.iosInfo;
      // 전달 받은 변수의 멤버 변수인 identifierForVendor가 고유 id이다.
      id = iosData.identifierForVendor;
    }
  } on PlatformException {
    // 어떠한 원인으로 실패할 경우
    id = '';
  }
  // id 한번 출력해보고 
  print('id: $id');
  // 값 리턴
  return id;
}

위 함수를 다음과 같이 사용하면 된다.

final String mobileId = await getMobileId();

안드로이드의 경우 보안 설정이 변경되거나 하면 값이 바뀔 수 있다고 하고 iOS의 경우 해당 앱을 제거하고 다시 설치하면 변경되는 것 같다.

물론 iOS의 경우 앱 개발사와 관련 있어 동일한 개발사가 만든 앱이 설치되어 있다면 변경은 안 되는 것 같다.

이 문제는 각각의 OS 정책이니 따로 찾아보면 더 많은 정보를 얻을 수 있을 것 같다.

그리고 위 id 외에도 각 os 별 얻을 수 있는 정보들이 많이 있는데 아래 코드와 같이 함수를 만들어 각 os 별 얻을 수 있는 정보들을 Map 형태로 받아 사용도 좋을 듯싶다.

// https://pub.dev/packages/device_info/example 예제 일부 

// 안드로이드에서 얻을 수 있는 정보들
Map<String, dynamic> _readAndroidBuildData(AndroidDeviceInfo build) {
  return <String, dynamic>{
    'version.securityPatch': build.version.securityPatch,
    'version.sdkInt': build.version.sdkInt,
    'version.release': build.version.release,
    'version.previewSdkInt': build.version.previewSdkInt,
    'version.incremental': build.version.incremental,
    'version.codename': build.version.codename,
    'version.baseOS': build.version.baseOS,
    'board': build.board,
    'bootloader': build.bootloader,
    'brand': build.brand,
    'device': build.device,
    'display': build.display,
    'fingerprint': build.fingerprint,
    'hardware': build.hardware,
    'host': build.host,
    'id': build.id,
    'manufacturer': build.manufacturer,
    'model': build.model,
    'product': build.product,
    'supported32BitAbis': build.supported32BitAbis,
    'supported64BitAbis': build.supported64BitAbis,
    'supportedAbis': build.supportedAbis,
    'tags': build.tags,
    'type': build.type,
    'isPhysicalDevice': build.isPhysicalDevice,
    'androidId': build.androidId,
    'systemFeatures': build.systemFeatures,
  };
}
// https://pub.dev/packages/device_info/example 예제 일부 

// ios 얻을 수 있는 정보들
Map<String, dynamic> _readIosDeviceInfo(IosDeviceInfo data) {
  return <String, dynamic>{
    'name': data.name,
    'systemName': data.systemName,
    'systemVersion': data.systemVersion,
    'model': data.model,
    'localizedModel': data.localizedModel,
    'identifierForVendor': data.identifierForVendor,
    'isPhysicalDevice': data.isPhysicalDevice,
    'utsname.sysname:': data.utsname.sysname,
    'utsname.nodename:': data.utsname.nodename,
    'utsname.release:': data.utsname.release,
    'utsname.version:': data.utsname.version,
    'utsname.machine:': data.utsname.machine,
  };