flutter(30)
-
[Flutter/iOS] 자체서명 인증서(Self-signed certificate)를 우회한 HLS 스트리밍 구현 / GCDWebServer를 사용한 로컬 프록시 서버 구현
문제 배경Flutter를 사용해서 HLS로 영상 스트리밍 기능을 구현해야 하는데, 스트리밍 서버가 동작하는 IoT 장치에서는 외부에서 접속할 수 있는 공개망에 연결되어 있다는 보장이 없었습니다. 보안상의 이유로 내부망에 연결되어서 사용되는 경우가 대부분이고, 공장에서 생성되는 시점에 HTTPS를 지원해야하다보니 Self-signed Certificate를 사용하고 있었습니다. 처음에는 Flutter에서 제공하는 video_player 패키지를 사용하려고 했으나, 애석하게도 Self-signed Certificate를 처리할 수 있는 방법이 없었습니다. 결국 네이티브에서 제공하는 플레이어를 사용하기로 결정했는데, Android는 전체적인 SSL 연결을 커스터마이징할 수 있는 기능을 제공하기 때문에 어렵지 ..
2025.04.21 -
[Flutter] Isolate를 활용한 HTTP 클라이언트 리팩토링과 iOS에서 Isolate 초기화 문제
Flutter에서 Isolate를 활용한 HTTP 클라이언트 리팩토링 Flutter 앱에서 네트워크 요청은 매우 빈번하게 사용되지만, Flutter 자체는 싱글 스레드로 동작하다보니 메인 UI 스레드에서 무거운 네트워크 작업을 처리하면 앱이 버벅거리거나 응답성이 떨어집니다. 특히 지금 진행하고 있는 프로젝트는 P2P를 통해 IoT 장비와 직접 통신을 하면서, 동시에 클라우드 서버와도 통신을 하는 구조였기 때문에 리렌더링이 반복되면 네트워크 처리 속도가 떨어지는 문제가 있었죠. 이 문제를 해결하기 위해 HTTP 통신을 Isolate에서 처리하도록 HTTP 클라이언트를 구현해서 네트워크 속도에 대한 문제를 개선했는데, iOS에서 앱을 구동할 시 문제가 발생했습니다. 메인 Isolate와 HTTP 클라이..
2025.04.11 -
[Dart] Completer를 사용한 비동기 제어
[Dart] 메시지를 통해 동작하는 Isolate를 추상화하기Isolate에 대해 알아보자에서 Isolate를 사용할 시 유의해야 할 점과, 포트를 사용해서 Isolate 사이에 여러개의 메시지를 주고받기에 기재되어있는 예제를 살펴봤습니다. 유의할 점 중에는 Isolate 갯zerodice0.tistory.com 이전에 여러가지 동작을 하나의 Isolate에서 처리 가능하도록 작성한 적이 있었다. 이를 통해서 Worker를 1~2개만 생성한 뒤 원하는 작업이 별개의 Isolate에서 동작하도록 작성할 수 있게 됐다. 물론 앱의 성능을 위해서도 Isolate는 1~2개 정도가 실행되는게 가장 적당했는데, 어느 순간 확인해보니 Worker가 4~8개씩 실행되는 경우가 있는게 아닌가. 어디가 문제인지 고민하..
2025.01.15 -
[Dart] 메시지를 통해 동작하는 Isolate를 추상화하기
Isolate에 대해 알아보자에서 Isolate를 사용할 시 유의해야 할 점과, 포트를 사용해서 Isolate 사이에 여러개의 메시지를 주고받기에 기재되어있는 예제를 살펴봤습니다. 유의할 점 중에는 Isolate 갯수가 CPU 코어 갯수±2개 정도를 유지하는게 좋다는 내용이 있었는데요. 이번에는 포트를 사용해서 Isolate 사이에 여러개의 메시지를 주고받기에서 살펴본 내용을 기반으로, 하나의 Isolate를 사용해서 여러개의 작업을 할 수 있도록 수정해보겠습니다.먼저 예제를 살펴봅시다. 포트를 사용해서 Isolate 사이에 여러개의 메시지를 주고받기에 기재되어있는 예제는 아래와 같습니다.import 'dart:async';import 'dart:convert';import 'dart:isolate';v..
2024.07.31 -
[Dart] Isolate에 대해 알아보자
#1. Dart와 동시성Dart는 기본적으로 싱글 스레드 환경에서 동작합니다. Javascript에 익숙하다면, 여기까지만 들어도 '엥? 그럼 혹시 Dart도 비동기 처리는 Javascript처럼...?'이라는 생각이 들 텐데요. 그렇습니다. Javascript와 마찬가지로 Dart 역시 이벤트 루프를 가지고 있으며, 비동기 처리를 진행하는 방식은 Javascript와 비슷합니다. 이벤트 루프에 대해 자세히 설명되어있는 글들은 여러가지가 있겠지만, Dart의 이벤트 루프에서는 Dart 문서에 기재되어있는 Dart의 동시성 항목을 참고해주세요. 대충 설명하면 Dart로 작성된 프로그램이 실행되면 이벤트들이 저장되는 이벤트 큐가 있고, 우리가 Dart로 작성하지 않아도 이벤트 큐에서 대기하고 있는 이벤트들을..
2024.07.29 -
Pigeon을 사용해서 여러개의 인터페이스를 생성할 때 발생할 수 있는 에러 정리
2024.06.21 - [Programming/Flutter] - Pigeon을 사용하여 Type-safety한 네이티브 코드 작성하기에서 Pigeon을 사용해 코드를 Type-safety한 네이티브 코드를 작성하는 방법에 대해 살펴봤다. 하지만 네이티브 코드가 많아져서 두 개의 플랫폼 코드를 작성한다고 가정하자. 이런 경우 Pigeon을 사용해서 두 개의 인터페이스를 생성하면, 위와같이 FlutterError 클래스를 재선언했다는 에러가 발생하게된다. 이런 경우에는 @ConfigurePigeon 어노테이션의 kotlinOptions에서, errorClassName을 별도로 지정해주면 간단하게 해결할 수 있다. 아래와 같이 KotlinOptions의 인자값에 errorClassName으로 문자열을 넘겨..
2024.06.24