Never give up

Flutter - Get device Id (uuid) 본문

Flutter

Flutter - Get device Id (uuid)

대기만성 개발자 2022. 9. 8. 13:35
반응형

먼저 UUID는 범용 고유 식별자로(쉽게 말해 특정 기기의 고유값)으로

 

개발을 할 때 어떤 기기에 어떤 패키지가 설치되어 있는지 등을 트래킹할 때 사용할 수 있는 고유 값 입니다

 

이전에 device info plus에서 가져다가 썼었는데, 필요 이상의 데이터를 가지고 왔었고

 

더군다나 4.0.0버전에서는 가장 필요한 친구(?)를 빼버렸습니다

  • Breaking change Remove AndroidId getter to avoid Google Play policies violations

구글 정책에 위반되는 부분을 피하려고 한다는데

 

관련 자료를 검색해보니 광고 ID관련한 부분 문제인거 같습니다

(링크 : https://support.google.com/googleplay/android-developer/answer/6048248#zippy=%2Cpersistent-identifiers-including-android-id%2C%EC%98%81%EA%B5%AC-idandroid-id-%ED%8F%AC%ED%95%A8%2C%EA%B4%91%EA%B3%A0-id-%EC%97%86%EB%8A%94-%EA%B8%B0%EA%B8%B0-%ED%83%80%EA%B2%9F%ED%8C%85)

 

아마도 광고 수익이 있다면 따로 id를 만들어서 관리해야되지 않을까 합니다

(개인적인 추측으로는 우리가 수집한 광고 데이터 멋대로 사용하지마라 정도가 아닐까 합니다)

 

서론이 길었는데 안드로이드는 Kotlin, IOS는 Swift로 만들었습니다

 

먼저 안드로이드 부분은

// MainActivity class
class MainActivity : FlutterActivity() {
    private val deviceId: String = "deviceId";

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        val contentResolver: ContentResolver = activity.contentResolver

        MethodChannel(flutterEngine.dartExecutor, deviceId).setMethodCallHandler(
            IdHandler(
                contentResolver
            )
        )
    }
}

// IdHandler class
class IdHandler(private val contentResolver: ContentResolver) : MethodChannel.MethodCallHandler {
    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        if (call.method == "getId") {
            result.success(getAndroidId())
        } else {
            result.notImplemented()
        }
    }

    @SuppressLint("HardwareIds")
    private fun getAndroidId(): String? {
        return Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)
    }
}

 

Android id api부분과 Android id 패키지를 참고해서 만들었는데

 

오레오 버전 이상 부터 지원한다 해서 그 이전버전은 어떻게 될지 모르겠습니다

(Android id api : https://developer.android.com/reference/android/provider/Settings.Secure#ANDROID_ID)

(Android package : https://pub.dev/packages/android_id)

 

다음으로 IOS부분은

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
      
    setMethodChannel()
      
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
    
    private func setMethodChannel(){
        let controller: FlutterViewController = window?.rootViewController as! FlutterViewController
        let deviceIdChannel = FlutterMethodChannel(name: "deviceId", binaryMessenger: controller.binaryMessenger)

        deviceIdChannel.setMethodCallHandler({
            (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
            if(call.method == "getId"){
                result(UIDevice.current.identifierForVendor!.uuidString)
            } else {
                result(FlutterMethodNotImplemented)
            }
          })
    }
}

identifierForVender 부분을 참고해서 만들어봤습니다

 

(링크 : https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor)

 

마지막으로 Flutter부분은

void main() {
  runApp(const MaterialApp(home: MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  static const MethodChannel _methodChannel = MethodChannel('deviceId');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('UUID Example'),
      ),
      body: Center(
        child: FutureBuilder<String?>(
          future: _methodChannel.invokeMethod<String?>('getId'),
          builder: (_, snapshot) {
            if (snapshot.hasData) {
              return Text('${snapshot.data}');
            }

            return const CircularProgressIndicator();
          },
        ),
      ),
    );
  }
}

간단하게 Method channel을 이용해서 화면에 UUID를 출력해주는 예제로 만들어봤습니다

 

< 좌: IOS simulator / 우 : android emulator >

IOS 시뮬레아터,안드로이드 에뮬레이터에서도 정상작동한것을 확인할 수 있습니다

(본인 실기기였으면 당연히 안 올렸겠지요..)

 

간만에 Kotlin/Swift 만져봤는데, 한가지 언어로만 개발하는게 얼마나 편한지 다시한번 깨달았습니다..

반응형
Comments