소개
기존에 iOS 네이티브로 만들었던 간단한 유틸 앱을 Flutter로 처음 포팅해 본 경험을 정리해 보았습니다 😊
이 앱은 주변 비콘(BLE)의 신호 강도(RSSI)를 확인하는 매우 단순한 구조의 앱으로, 화면도 하나뿐인 소규모 앱입니다.
iOS 앱은 주차장 내비게이션 앱을 만들 때 필요하여 연구 목적으로 개인적으로 활용하려고 만들어 두고 혼자 사용하고 있었는데...
최근에 아파트 현장에 설치를 시작하여 나 말고도 현장 점검하는 회사 직원들도 사용하게 되었다.
혼자 사용할 때는 불편함이 없었는데 회사 동료가 사용해야 하기 되니 디자인도 신경 쓰이고 안드로이드 사용자도 많아서 Flutter로 포팅하는 게 좋을 것 같았다. 왜냐하면 회사 직원의 70%인 안드로이드 사용자는 아이폰을 휴대해야 해서 불편했다, 안드로이드 사용자에게 필요한 앱이기도 해서 회사에 도움이 될 것 같기도 하고
무엇보다도 iOS 앱을 Flutter 앱으로 포팅하는 스터디 및 개인 학습 목적으로 진행했습니다.
Flutter는 이론적으로는 공부해 봤지만, 실제 회사 프로젝트에 적용해 본 경험은 없었습니다.
정리하자면, 이번에 아래와 같은 이유로 포팅을 시작하게 되었습니다.
개인 학습 목적
나 말고 실제 회사 직원들과 협력사 직원들이 사용하게 됨, 그래서 디자인도 새롭게 예쁘게 수정해야 함
안드로이드용 앱이 없어서 불편, 회사에 도움이 되는 앱 개발
회사에서도 능률을 위해 Flutter가 더욱 필요해질 것이라는 판단
이 정도로 단순한 앱이라면 연습 삼아 포팅하기에 적절하다고 생각
진행 방법
사용한 도구
MacBook
Stitch
VS Code
Claude CLI
Codex
비콘 스캔 결과를 리스트로 보여주는 구조라 전반적으로 난이도는 낮은 편이었습니다.
작업 순서
Stitch에서 화면 UI 수정
작업용 폴더 생성 후 VS Code 실행
기존 iOS 앱 소스를 작업 폴더로 복사
Claude CLI 실행
Stitch에서 만든 UI 리소스를
stitch폴더에 추가UI와 기존 소스를 기반으로 Flutter 앱 생성 플랜 작성 요청
Claude의 질문에 답변, 모르는 부분은 Codex에 질문하며 보완
플랜이 완성되고 codex에게 검토 요청
Claude 에게 플랜대로 개발 요청
막히는 부분 Codex에게 수정시켜 중간중간 문제 해결
우여곡절 끝에 테스트 배포까지 완성
스티치 작업물
작업 폴더 구조
클로드와 나눈 대화 요약
목표
iOS 비콘 리더 앱을 Flutter로 포팅
Android + iOS 동시 지원
내가 수행한 작업
Phase 1. 프로젝트 생성 및 구조
flutter create navi_beacon_reader폴더 구조 생성
config
models
providers
services
screens
widgets
utils
pubspec.yaml의존성 추가provider
dchs_flutter_beacon
permission_handler
Phase 2. 핵심 코드 작성
파일명
역할
constants.dart
UUID, RSSI 임계값, 색상 정의
beacon_data.dart
비콘 모델 및 RssiLevel enum
beacon_provider.dart
상태 관리 및 cleanBeacons 알고리즘
beacon_service_impl.dart
dchs_flutter_beacon 연동
mock_beacon_service.dart
시뮬레이터용 Mock
permission_handler.dart
Android / iOS 권한 처리
UI 위젯
scan_button, beacon_table, rssi_indicator 등
Phase 3. 플랫폼 설정
Android
AndroidManifest.xml: BLE / 위치 권한 추가
iOS
Info.plist: 위치 / 블루투 스 권한 설명 추가Podfile: iOS 13.0 설정
Phase 4. 테스트
단위 / 위젯 테스트 16개 모두 통과
flutter analyze→ No issues found
Codex가 수정한 내용
main.dartuseMockService: false(항상 실제 비콘 서비스 사용)
beacon_service_impl.dartUUID 필터링 추가
앱 이름 변경
iOS / Android 모두 “주차장 비콘 리더”
permission_handler.dartiOS 권한 간소화 (위치 권한만)
Podfilepermission_handler 설정 추가
pubspec.yaml버전:
0.1.2+202601290001flutter_launcher_icons추가
실행 테스트
Android (SM-N950N) → 정상 실행
iOS 무선 디버깅 → 속도가 느려 중단
최종 상태
코드 분석: No issues found
협업 방식:
Claude → 코드 작성
Codex → 수정 및 최적화
결과 배포 가능한 앱
iOS (TestFlight)
Android
실행 시킨 iOS/안드로이드 앱 화면 비교
중간중간 로즈님의 훅으로 동작하는 자동으로 찍힌 스크린샷들 (auto-screenshot 플러그인 뿌듯)
플러그인 참고 링크: https://github.com/LinaYoun/auto-screenshot
<첫번째 자동 스크린샷과 중간에 찍힌 일부분 캡처 >
결과와 배운 점
디자인을 Stitch로 먼저 잡는 방식 추천
두 에이전트(Claude + Codex)의 협업 시너지가 매우 큼
약 4시간 만에 배포까지 완료
앞으로는 Flutter + AI 중심으로 지속적인 스킬 업 예정
많이 부족한 글 읽어주셔서 감사합니다.