Programming/Flutter(33)
-
[Flutter] GoRouter의 RouterDelegate와 RouteInformationProvider를 사용한 현재 라우트 추적
Flutter의 GoRouter를 사용해서 라우트를 구현하던 중, 전체 페이지에 공용으로 출력해야하는 UI를 라우터에 따라 변경해야하는 일이 있었습니다. RouterDelegate.addListener()를 호출해서 이벤트 핸들러를 등록해서, 라우트가 변경될 때마다 ValueNotifier의 값을 변경하는 방식으로 UI를 업데이트하여 간단하게 해결... 된다고 생각했지만, RouterDelegate.currentConfiguration.uri를 참조해서 업데이트하도록 작성했더니, push()를 사용해서 페이지를 이동했을 때는 ValueNotifier가 정상적으로 업데이트되지 않았습니다.한참을 고민하던 중 RouterDelegate.currentConfiguration.uri를 참조하는 대신, RouteI..
2025.04.23 -
[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 -
Sign in with Apple: iOS에서는 실패하는데 Android/Web에서는 성공하는 경우?
Flutter로 앱을 개발하다 보면 소셜 로그인 기능은 거의 필수적으로 구현하게 됩니다. 그중에서도 'Sign in with Apple'은 iOS 사용자들에게 편리한 경험을 제공하는 중요한 기능이죠. 그런데 이상하게도 Android나 Web 환경에서는 잘 동작하던 Apple Sign In이 유독 iOS 네이티브 앱에서만 실패하는 경우가 있습니다. Bundle ID가 변경되지 않았다면, 백엔드의 Apple ID 토큰 검증 로직에 있을 가능성이 높습니다! 특히, JWT(JSON Web Token)의 aud (Audience) 클레임 검증 방식이 문제의 핵심일 수 있습니다. 이 글에서는 Flutter 앱에서 Apple Sign In이 실패하는 흔한 원인 중 하나인 aud 클레임 불일치 문제와 그 해결 방법을..
2025.04.09 -
[Flutter] 때때로 생성자에서 비동기 요청을 하게되면, 비동기 요청이 실행되기 전에 dispose()가 호출될 수도 있다.
문제상황 ListView에 표시되는 ListViewItem은 필요한 데이터를 요청하기 위해 2~3개의 API를 순차적으로 조회해야했다. 문제는 사용자가 리스트를 스크롤할 경우, 요청하는 API의 수가 기하급수적으로 늘어난다는 것. 이러한 문제를 막기 위해서 스케쥴러를 구현하고, VisibilityDetector를 사용해 ListViewItem이 더 이상 화면에서 사라지면 API 요청을 취소하도록 작성했다. ListViewItem이 dispose를 호출할 때 역시 API 요청을 취소하도록 작성했다. 실제로 스크롤을 내리다보면 ListViewItem은 생성자를 호출하는 시점에 API 요청을 스케쥴링을 하고, ListViewItem이 더 이상 렌더링되지 않는 시점에는 스케쥴링한 API 요청을 취소하고 ..
2025.03.18 -
[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