#플러터
112023.12.25
인플루언서 
하이제니스
8,082IT테크 전문블로거
참여 콘텐츠 85
플러터(Flutter) - AWS IoT Core 연 예제 코드 MQTT

mqtt_client | Dart Package A server and browser based MQTT client for Dart supporting normal, secure sockets and websockets. pub.dev 아래의 예제 코드는 mqtt_client 패키지를 이용한 AWS IoT Core 예제이다. class Config { static const String awsRootCA = "-----BEGIN CERTIFICATE-----\nMIIDQTCCAxxxxxxxxxxxxITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\nca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVK...

2023.12.07
3
android.permission.ACCESS_COARSE_LOCATION 권한 선언이 maxSdkVersion만 다를 뿐 중복됩니다.

구글 플레이 스토어 콘솔에서 앱을 업로드 시 아래와 같은 오류가 발생하였다면... androidManifest.xml에서 android.permission.ACCESS_COARSE_LOCATION 퍼미션 추가 때 최대 SDK 버전 제한(maxSdkVersion)을 걸어주면 된다. 단순히 maxSdkVersion으로 제한을 걸면 상위버전 폰에서 퍼미션 체크를 아예 못하는 문제가 발생한다. androidManifext.xml에서 uses-permission-sdk-23을 추가해 API 23이상에 대해서 추가 퍼미션을 지정해주면 된다. android.permission.ACCESS_COARSE_LOCATION뿐만이 아니라 ACCESS_FINE_LOCATION를 쓰고 있다면 이 녀석도 발생할 테니 같이 추가해 주면 된다. #플러터 미워.... 아니지 #안드로이드 미운 거지 https://github.com/dariuszseweryn/RxAndroidBle#permissions https://developer.android.com/guide/topics/connectivity/bluetooth/permissions https://github.com/dariuszseweryn/RxAndroidBle/issues/215 https://stackoverflow.com/questions/44299197/google-play-apk-upload-err...

2023.03.21
Could not find method useProguard() for arguments [true]

좀 지난 플러터 앱을 최신 빌드(Gradle 버전 7.0.0 이상) 시스템에서 빌드 하려는데 아래와 같은 에러가 발생하였다. Build file '/Users/dong/work/flutter_prj/........../android/app/build.gradle' line: 77 A problem occurred evaluating project ':app'. > Could not find method useProguard() for arguments [true] on BuildType$AgpDecorated_Decorated{name=release, debuggable=false, Build file '/Users/dong/work/flutter_prj/......./android/app/build.gradle' line: 77 A problem occurred evaluating project ':app'. > Could not find method useProguard() for arguments [true] on BuildType$AgpDecorated_Decorated{name=release, debuggable=false, 좀 찾아보니 더 이상 난독화를 위해 build.gradle 파일에 useProguard 설정을 할 필요가 없다는 것이었다. 해당 설정이 포함되면 문제가 되는 것이다. 아래와 같이 useProguard 항...

2023.03.21
6
이 App Bundle 아티팩트 유형은 네이티브 코드를 포함하며 아직 디버그 기호가 업로드되지 않았습니다. 비정상 종료 및 ANR....

이 App Bundle 아티팩트 유형은 네이티브 코드를 포함하며 아직 디버그 기호가 업로드되지 않았습니다. 비정상 종료 및 ANR을 더 쉽게 분석하고 디버그할 수 있도록 기호 파일을 업로드하는 것이 좋습니다. 탐색기로 아래의 위치로 이동한다. [플러터 프로젝터]\build\app\intermediates\merged_native_libs\release\out\lib 그리고 거기에 보이는 폴더들을 한꺼번에 압축하자. 이름은 크게 중요하지 않다. 이제 이것을 구글 콘솔에 업로드해 주면 된다. 구글 콘솔에서 해당 프로젝트로 이동 후 왼쪽 메뉴 중 App Bindle 탐색기를 실행한다. 릴리스할 버전 오른쪽 끝에 있는 화살표를 클릭하자. 그다음 다운로드 탭을 클릭 후 네이티브 디버그 기호 오른쪽에 있는 [업로드 화살표]를 클릭하자. 위와 같이 팝업이 나타나면 아까 압축한 파일을 여기에 넣어주면 된다.

2023.03.04
황당한 ADB 에러 cannot connect to daemon at tcp:5037: cannot connect to 127.0.0.1:5037

플러터(Flutter) 개발에 주로 쓰는 macOS를 업그레이드하면서 그동안 윈도우 OS에서 빌드를 해보려는데 뭔가 잘 안되었다. 먼전 flutter doctor -v 로 상태를 확인해 보니 아래와 같은 에러가 발생하였다. X Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know about this issue at https://github.com/flutter/flutter/issues. X Exception: Unable to run "adb", check your Android SDK installation and ANDROID_SDK_ROOT environment variable: d:/Android/Sdk\platform-tools\adb.exe #1 AndroidDevices.pollingGetDevices (package:flutter_tools/src/android/android_device_discovery.dart:75:7) <asynchronous suspension> <asynchronous suspension> #3 Future.wait.<anonymous closure> (dart:async/future.dart:521:21) <asynchronous suspe...

2023.03.03
하.. 오랫만에 플러터 릴리즈하려니 힘들구만...

플러터로 만든 앱을 거의 반년 만에 기능 추가 및 개선 후 스토어에 올리려니 그새 뭐가 또 요구사항들이 늘어나 쉽게 올라가질 않느다. 그냥 최신 버전으로 올리고 패키지들 문제점들 찾아 잡고..... 그래야 할 것 같다. 아놔 ㅜㅜ 플러터 버전 올라가는 게 너무 빨라....

2023.03.03
플러터(Flutter) 문자열에 포함된 Null 값 제거 방법

외부로부터 데이터를 받는데 분명 "11100000032_BL" 와 같은 데이터를 받았는데 실제 출력해 보면 "111"만 표시되는 것이다. 문제는 브레이크 포인트를 걸어 변수를 확인해 보면 문제가 없이 "11100000032_BL"로 표시된다. 그래서 일단 해당 값을 바이트 리스트로 변환해 확인해 보니 아래와 같이 중간에 Null(널, 0) 값이 포함되어 있는 것을 확인할 수 있었다. 그래서 문자열 출력 시 널 이전까지만 표시되는 것이었다. [49, 49, 49, 0, 48, 48, 48, 48, 48, 48, 51, 50, 95, 66, 76] 이렇게 중간에 널이 껴있는 문자열 변수에서 널을 제거한 완벽한 문자열로 만드는 방법은 다음과 같다. List<int> tmp = []; foundName.codeUnits.forEach((element) { if (element != 0) tmp.add(element); }); foundName = utf8.decode(tmp); 위 코드는 문자열을 바이트로 바꿔 반복문으로 널이 아닌 값만 찾아 tmp에 담은 후 다시 문자열로 바꾸는 코드이다..... 이 코드를 조금 간단하게 만들어보면 다음과 같이 정규 표현식을 이용해 널 값만 찾아 제거할 수도 있다. foundName = foundName.replaceAll(RegExp('\\0'), '');

2023.02.24
플러터(Flutter) - BLE 통신하기(블루투스 저전력) 5. 데이터 받기 flutter_blue_plus

목차 1. 검색(scan) 편 2. 특정 장치만 검색(Scan) 편 3. 연결 및 연결 해제 편 4. 서비스 정보 얻기 5. 데이터 받기 지난번에 서비스와 캐릭터리스틱 정보(Discovery Service)를 얻는 것까지 진행하였다. 이번엔 장치에서 보내는 데이터를 받는 방법을 다뤄 볼 것이다. 여기서 다루는 코드를 실행한 환경은 다음과 같다. flutter sdk: 3.0.5 dart 2.17.6 flutter_blue_plus: 1.3.0 android compile sdk: 31 android kotlin version: 1.7.10 android gradle version: com.android.tools.build:gradle:7.1.0 1. 동작 영상 2. 소스코드 위치 flutter_ble_scan_example/example_5 at main · dong-higenis/flutter_ble_scan_example flutter_ble_scan_example. Contribute to dong-higenis/flutter_ble_scan_example development by creating an account on GitHub. github.com 3. 소스코드 리뷰 main.dart main.dart의 코드는 [4. 서비스 정보 얻기] 편과 동일하니 패스! device_screen.dart device_screen....

2022.08.19
플러터(Flutter) - BLE 통신하기(블루투스 저전력) 4. 서비스 정보 얻기 flutter_blue_plus

목차 1. 검색(scan) 편 2. 특정 장치만 검색(Scan) 편 3. 연결 및 연결 해제 편 4. 서비스 정보 얻기 5. 데이터 받기 이전 글 이후로 상당히 오랜만에 이어 쓰는 것 같다. 그 와중에 flutter_blue 패키지의 지원이 멈췄고 찾아보니 어떤 고마우신 분이 flutter_blue_plus라는 패키지로 이어받아 관리를 하고 있는 것이었다. 다행히 패키지와 메인 클래스명만 수정해 주면 그대로 쓸 수 있으니 큰 어려움을 없을 것이다. 여기서 다루는 코드를 실행한 환경은 다음과 같다. flutter sdk: 3.0.5 dart 2.17.6 flutter_blue_plus: 1.3.0 android compile sdk: 31 android kotlin version: 1.7.10 android gradle version: com.android.tools.build:gradle:7.1.0 1. 동작 영상 2. 소스코드 위치 flutter_ble_scan_example/example_4 at main · dong-higenis/flutter_ble_scan_example flutter_ble_scan_example. Contribute to dong-higenis/flutter_ble_scan_example development by creating an account on GitHub. github.com 3. 소스코드 리...

2022.08.17
10
플러터(Flutter) 버전 변경하기(다운그레이드) - 윈도우

플러터(Flutter) SDK를 최신 버전이 아닌 예전 버전으로 변경하는 방법이다. T.M.I 시작 플러터는 하위 버전으로 변경하는 명령이 존재했다가 사라진 것 같다. 항상 최신 버전만 설치하길 원하지만 아직 불안전한 플러터는 버전 업 될 때마다 아주 획기적(?)으로 바꿔놔 기존 코드를 무용지물로 만들 때가 종종 있다. 가장 좋은 것은 기존 코드를 최신 버전에 맞게 수정하는 것이지만 그게 여의치 않을 땐 플러터 버전을 하위 버전으로 변경하는 것도 좋은 방법이라 생각한다. 플러터 버전을 바꾸는 것은 git을 이용하는 방법도 있는데 이것보다 내 개인적으론 지금 설명하려는 방법이 편한 것 같다. T.M.I 끝~ 설치 방법을 요약하면 다음과 같다. 1. 플러터 SDK Release 사이트에서 원하는 버전에 원하는 채널(Stable?, beta?)을 골라 다운로드해 압축을 해제 해놓는다. 2. 현재 설치되어 있는 플러터의 위치를 파악한다. 3. 현재 설치된 플러터 위치로 이동해 혹시 모르니 기존 버전을 이름만 바꿔 놓고 다운로드한 플러터를 이동시킨다. 4. 플러터 의사(?)에게 진단을 받아 문제없는지 확인한다. 자 그럼 시작해 보자. 여기서는 현재 2.2.2@stable이 설치된 것을 2.8.0@stable 버전으로 변경할 것이다. 이것을 참고해 자신이 원하는 버전으로 변경할 수 있을 것이다. 참고로 플러터 버전 확인은 파워쉘(Powershe...

2022.04.27
3
플러터(Flutter) - 시리얼 통신 - 윈도우버전 예제 코드 링크

플러터(Flutter) 윈도우 앱에서 간단한 시리얼 통신을 예제를 만들어 봤다 GitHub - dong-higenis/flutter_libserialport_simple_example: A simple example of using libserialport for Windows in Flutter. A simple example of using libserialport for Windows in Flutter. - GitHub - dong-higenis/flutter_libserialport_simple_example: A simple example of using libserialport for Windows in Flutter. github.com 테스트 환경 flutter: 2.10.2 dart: 2.16.1 동작 환경: 윈도우 10 추가된 라이브러리 flutter_libserialport, cp949 flutter_libserialport: ^0.2.3 cp949: git: url: https://github.com/dong-higenis/dart-cp949 ref: main 코드 설명은 나중에...

2022.02.22
2
플러터(Flutter) - cp949 패키지 널-세이프티(null safety) 적용

플러터 윈도우 앱 개발에서 libserialport를 사용하다 보니 한글이 깨지는 문제가 발생하였다. cp949 | Dart Package CP949 Encoder/Decoder pub.dev 좀 찾아보니 인코딩(EUC-KR) 문제였고 위 패키지를 이용해 인코딩하면 된다고 한다. 그런데 해당 패키지에 null safety가 적용되지 않아 코드를 보니 그리 복잡하지 않아 간단하게 null safety를 적용시킬 수 있었다. 아래의 코드는 원본 소스코드의 링크이다. GitHub - jjangga0214/dart-cp949: Decode or encode CP949 (EUC-KR inclusive) in Dart. Decode or encode CP949 (EUC-KR inclusive) in Dart. - GitHub - jjangga0214/dart-cp949: Decode or encode CP949 (EUC-KR inclusive) in Dart. github.com 그리고 위 해당 프로젝트를 가져와 null safety를 적용한 소스코드의 위치는 다음과 같다. https://github.com/dong-higenis/dart-cp949 GitHub - dong-higenis/dart-cp949: Decode or encode CP949 (EUC-KR inclusive) in Dart. Decode or encode CP949 (E...

2022.02.21
6
플러터(Flutter) - Please enable Developer Mode in your system settings

flutter_libserialport | Flutter Package A simple wrapper around libserialport utilizing Flutter's build system to build and deploy the C-library for the target platform. pub.dev 플러터 윈도우 앱에서 시리얼 통신 테스트를 위해 flutter_libserialport라는 라이브러리를 패키지에 추가하여 실행하니까 아래와 같은 에러가 발생하였다. Exception: Building with plugins requires symlink support. Please enable Developer Mode in your system settings. Run start ms-settings:developers to open settings. 개발자 모드를 활성화해야 한다고 한다. 명령어 창에서 아래와 같이 입력하거나 start ms-settings:developers 윈도우 시작 버튼 > 설정 > 업데이트 및 보안 > 개발자용 을 차례로 선택한다. 개발자용 설정 화면이 나타나면 개발자 모드를 끔에서 켬으로 변경하자. 뭐 보안 어쩌고저쩌고 하는데 예를 눌러 활성화하면 된다. 이제 다시 플러터를 빌드 해보면 잘 되는 것을 볼 수 있을 것이다.

2022.02.21
플러터(Flutter) - BLE 통신하기(블루투스 저전력) 2. 특정 장치만 검색(Scan) 편 flutter_blue

목차 1. 검색(scan) 편 2. 특정 장치만 검색(Scan) 편 3. 연결 및 연결 해제 편 4. 서비스 정보 얻기 5. 데이터 받기 소스코드 위치 flutter_ble_scan_example/example_2 at main · dong-higenis/flutter_ble_scan_example flutter_ble_scan_example. Contribute to dong-higenis/flutter_ble_scan_example development by creating an account on GitHub. github.com 아래의 코드는 이전 검색 편에서 살짝만 응용해 특정 장치명만 리스트에 표시하는 기능을 추가하였다. import 'package:flutter/material.dart'; import 'package:flutter_blue/flutter_blue.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { final title = 'Flutter BLE Scan Demo'; @override Widget build(BuildContext context) { return MaterialApp( title: title, home: MyHomePage(title: title), ); } } class MyHomePage extend...

2021.12.08
12
플러터(Flutter) cmdline-tools component is missing

데스크톱 PC를 새로 맞추고 플러터를 설치하는데 아래와 같은 오류가 발생하였다. PS C:\Users\donggyu> flutter doctor Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Channel stable, 2.5.2, on Microsoft Windows [Version 10.0.19043.1237], locale ko-KR) [X] Android toolchain - develop for Android devices X cmdline-tools component is missing Run `path/to/sdkmanager --install "cmdline-tools;latest"` See https://developer.android.com/studio/command-line for more details. [√] Chrome - develop for the web [√] Android Studio (version 2020.3) [√] VS Code (version 1.60.2) [√] Connected device (2 available) 분명 안드로이드 스튜디오에 cmdline-tools이 잘 설치되어 있는데도 오류는 사라지지 않는 것이었다. 안드로이드 스튜디오 설정화면 구글링을 해보니 아래와 같은 답변을 확인할 수 있었다. ht...

2021.10.01
3
Flutter_ble_lib iOS 15 빌드 에러

Users/dong/work/flutter_prj/app/homssen/ios/Pods/MultiplatformBleAdapter/iOS/RxSwift/Platform/DataStructures/Bag.swift:176:9: warning: 'Hashable.hashValue' is deprecated as a protocol requirement; conform type 'BagKey' to 'Hashable' by implementing 'hash(into:)' instead var hashValue: Int { ^ /Users/dong/work/flutter_prj/app/homssen/ios/Pods/MultiplatformBleAdapter/iOS/RxBluetoothKit/BluetoothManager.swift:161:65: warning: 'index(where:)' is deprecated: renamed to 'firstIndex(where:)' if let index = strongSelf.scanQueue.index(where: { $0 == scanOperationBox.value! }) { ^ /Users/dong/work/flutter_prj/app/homssen/ios/Pods/MultiplatformBleAdapter/iOS/RxBluetoothKit/BluetoothManager.swift:161:65...

2021.09.29
플러터(Flutter) - BLE 패키지를 변경하다

플러터로 지금까지 개발 중이던.. 아니 슬슬 끝이 보이던.. 앱이 있는데 금일 flutter_ble_lib에서 flutter_reactive_ble로 바꾸기로 결정을 하고 변경 작업에 들어갔다. 변경하게 된 가장 큰 이유는 올해 초 이후로 업데이트가 안되고 있는 것이 가장 큰 문제였다. 최근 앱을 재시작하면서 BLE 커넥션을 계속하는 작업을 검증하다가 어느 순간 앱이 더 이상 연결이 안 되는 문제가 발생하였다. 디버깅해보니 아래와 같은 에러 메시지를 발견하였고 앱에서 Ble adapter를 너무 많이 생성하면서 발생되는 것으로 보였다. Android: Connection attempts fail with MAX client reached: 32 이래저래 수소문(?) 해보니 해당 문제는 flutter_ble_lib가 쓰고 있는 라이브러리에서 나타나는 누수(leak) 문제이고 이미 이 문제는 라이브러리에서 이미 수정이 되었지만 해당 패키지에는 업데이트가 이뤄지고 있지 않는 것으로 보인다. - 배타 버전에는 적용된 것으로 보이는데 이것도 업데이트가 잘 안되고 있다. 그런데 같은 라이브러리를 사용하고 있는 flutter_reactive_ble는 버그가 수정된 버전을 사용하고 있다고 한다. 아무튼 현재 flutter_ble_lib는 다들 바빠서 업데이트가 느린 문제가 있으니 flutter_blue나 flutter_reactive_ble로 넘어...

2021.09.16
2
플러터(Flutter) - iOS에선 BLE 맥 주소(mac address)를 사용할 수 없다.

플러터(Flutter)로 정말 오래 걸려 안드로이드 앱을 공개 테스트 형태로 진행 후 그것을 기반으로 iOS에 변환 중 어마 무시한 문제가 발생하였다.... 바로 iOS에선 BLE의 맥 주소(mac address)를 사용할 수 없다는 것이다. 현재 개발 중인 앱은 보안에 신경을 많이 써야 하는 문제가 있어 기기들의 정보를 일부 사용하고 있다. 그 정보들 중 맥 주소도 포함되어 있었는데... iOS에선 이 맥 주소를 사용할 수 없다는 것이다. 그것도 이번 iOS로 변환하면서 알게 된 것이다. iOS로 변환 후 실행하였는데 암호화 통신에서 계속 거절(Reject)이 발생하는 것이었다. 디버깅을 해보니 암호화에 사용된 맥 주소가 문제였던 것이다. 대부분의 BLE 제어 시스템에서 mac 주소를 가져오는 것은 그리 어렵지 않았기에 당연히 가능할 것이라 판단한 것이 화근이 된 것이다. 에이 설마 진짜 안되겠어!? 하고 iOS 용 BLE 스캐너 앱을 설치해서 확인하였다. 아래의 화면은 노르딕(Nordic)이라는 회사에서 제공하는 BLE 제어 앱이다. 왼쪽: iOS nRF Connect, 오른쪽: android nRF Connect iOS와 안드로이드 화면을 보면 안드로이드에선 맥 주소를 확인할 수 있지만 iOS에선 맥 주소가 안 보이는 것을 볼 수 있었다. 와.. 진짜 안 되는 것 같았다. 왜 그런가 좀 찾아보니 보안상 이유로 맥 주소를 OS 단...

2021.07.12
6
ProcessException: Process exited abnormally: fatal: HEAD가 브랜치를 가리키지 않습니다

오랜만에 리눅스 PC(우분투)에 설치된 flutter를 업그레이드하려고 아래의 명령을 내렸다. $ flutter upgrade 그런데 이 녀석이 아래와 같은 에러를 토해내는 것이었다. ProcessException: Process exited abnormally: fatal: HEAD가 브랜치를 가리키지 않습니다 Command: git rev-parse --verify @{u} 해당 문제를 해결하기 위해 방법을 찾다가 아래와 같이 설정된 채널을 확인해보게 되었는데 이상하게도 아무것도 선택되어 있지 않다는 것을 알게 되었다. $ flutter channel 그래서 바로 다음 명령으로 stable 버전으로 채널을 선택해 주고 다시 선택된 채널을 확인해 봤다. $ flutter channel stable $ flutter channel 오호! 뭔가 진행이 쭈욱 되더니 설정한 채널이 적용된 것을 볼 수 있었다. 그래서 바로 다시 한번 업그레이드 명령을 실행하였다. 오오오!!! 긋긋! 위 에러가 발생하였을 때 채널을 확인해보면 좋을 것 같다.

2021.07.08
5
플러터(Flutter) - 다국어 지원하기 easy_localization

easy_localization | Flutter Package Easy and Fast internationalizing and localization your Flutter Apps, this package simplify the internationalizing process . pub.dev easy_localization는 플러터(Flutter)에서 다국어 지원하기 위해 가장 강력한 패키지가 아닐까 싶다. 여기서는 easy_localization을 사용하는 기본 예제를 다뤄볼 것이다. 1. easy_localization 패키지 추가 easy_localization를 사용하기 위해 프로젝트의 pubspec.yaml 파일을 열어 아래와 같이 easy_localization 패키지를 추가한다. ... dependencies: ... ... easy_localization: ^3.0.0 또는 프로젝트 위치에서 명령어 창을 열고 다음 명령어를 실행한다. $ flutter pub add easy_localization 그러면 알아서 pubsepc.yaml 파일에 추가되고 패키지도 설치한다. 2. 언어별 json 파일 만들기 여기서는 한국어(ko-KR)와 영어(미국, en-US)만 만들 것이다. 프로젝트에서 assets/translations 폴더를 만들고 아래와 같이 en-US.json과 ko-KR.json을 만든다. en-US.js...

2021.07.06