일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- typescript
- babel
- web track
- swagger-typescript-api
- RouteObserver
- Image Resize typescript
- uint16array
- Completer
- webrtc
- Game js
- Three-fiber
- Excel
- userevent_tracker
- jszip
- uint8array
- FirebaseAnalytics
- react
- node
- Prism.js
- REST API
- Redux
- identifierForVender
- Flutter
- Babel standalone
- Raycasting
- Three js
- KakaoMap
- androidId
- methodChannel
- code editor
- Today
- Total
Never give up
Flutter - Get device Id (uuid) 본문
먼저 UUID는 범용 고유 식별자로(쉽게 말해 특정 기기의 고유값)으로
개발을 할 때 어떤 기기에 어떤 패키지가 설치되어 있는지 등을 트래킹할 때 사용할 수 있는 고유 값 입니다
이전에 device info plus에서 가져다가 썼었는데, 필요 이상의 데이터를 가지고 왔었고
더군다나 4.0.0버전에서는 가장 필요한 친구(?)를 빼버렸습니다
- Breaking change Remove AndroidId getter to avoid Google Play policies violations
구글 정책에 위반되는 부분을 피하려고 한다는데
관련 자료를 검색해보니 광고 ID관련한 부분 문제인거 같습니다
아마도 광고 수익이 있다면 따로 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 시뮬레아터,안드로이드 에뮬레이터에서도 정상작동한것을 확인할 수 있습니다
(본인 실기기였으면 당연히 안 올렸겠지요..)
간만에 Kotlin/Swift 만져봤는데, 한가지 언어로만 개발하는게 얼마나 편한지 다시한번 깨달았습니다..
'Flutter' 카테고리의 다른 글
Flutter - RouteObserver (0) | 2022.09.08 |
---|---|
Flutter - Overlap widget without using stack (0) | 2022.01.29 |
Flutter - When you want to scrol in small widget lists (0) | 2022.01.29 |
Flutter - Custom Video player(Feat. Transform) (0) | 2022.01.28 |
Flutter - LayoutBuilder with Text widget width (0) | 2021.09.03 |