# IYKYKA — Flutter 클라이언트 멀티 컨텍스트(일상·업무 등) 기반 메신저 **IYKYKA**의 모바일 앱입니다. 서버 REST API + WebSocket과 연동합니다. --- ## 실행 방법 프로젝트 루트의 [README.md](../README.md)에 서버 기동 방법이 있습니다. 서버가 떠 있는 상태에서: ```bash cd mobile flutter pub get flutter run --dart-define=API_BASE=http://127.0.0.1:8787 ``` - **Android 에뮬레이터** → `API_BASE=http://10.0.2.2:8787` - **웹** → `sqflite` 미지원으로 로컬 메시지 캐시 전체는 동작하지 않을 수 있음. **Android / iOS / Windows 데스크톱** 권장 --- ## 기술 스택 (요약) | 구분 | 사용 | |------|------| | 상태·DI | `flutter_riverpod` | | 라우팅 | `go_router` | | HTTP | `dio` (JWT 인터셉터) | | 소켓 | `web_socket_channel` | | 로컬 DB | `sqflite` (방별 메시지 캐시) | | 보안 저장소 | `flutter_secure_storage` (토큰) | | 설정 | `shared_preferences` (테마·알림 스위치 등) | | 푸시 | `firebase_core` / `firebase_messaging`, 포그라운드는 `flutter_local_notifications` | | 앱 정보 | `package_info_plus` (설정 화면 버전 표시) | --- ## 구현된 기능 ### 인증·세션 - 회원가입 / 로그인, JWT 저장 및 API 자동 부착 - 로그아웃 시 소켓 종료 후 로그인 화면으로 이동 ### 컨텍스트·홈 - 컨텍스트 목록·선택(일상 / 업무 등), 해당 컨텍스트 기준 방·멤버·내 프로필 - 이메일 초대, 업무 컨텍스트 생성, 그룹 채팅방 만들기 - 하단 탭: 대화 / 멤버 / 내 프로필 ### 채팅 - WebSocket 실시간 메시지, 방 구독 - **오프라인/끊김 시** 전송 실패 메시지를 메모리 큐에 쌓았다가 **연결 복구 후 순차 전송** - 1:1 방: **상대 입력 중** 표시(타이핑 이벤트·디바운스), **읽음** 표시(서버 읽음 상태 + WS 갱신) - 메시지 읽음 처리(마지막 메시지 기준) API 호출 - 로컬 `sqflite`에 방별 메시지 캐시(동기화·오프라인 열람 보조) ### 검색 - **메시지 / 방 / 친구** 탭으로 구분, **클라이언트 측 필터**(쿼리 문자열) ### 설정 - 앱 이름·**버전**(`package_info_plus`) - **테마**: 시스템 / 라이트 (OS 다크여도 앱은 라이트 토스 스타일 유지) - **푸시 알림** 스위치(SharedPreferences; 켜진 경우 FCM 초기화·토큰 서버 등록 시도) - 로그아웃 ### 푸시(FCM) - Firebase 초기화 실패 시에도 앱 기동은 계속(미설정·플레이스홀더 `firebase_options` 대비) - FCM 토큰을 서버 `registerPushToken`으로 등록, 토큰 갱신 시 재등록 - 포그라운드 수신 시 로컬 알림 표시(설정 가능 범위 내) ### UI - 토스 느낌의 라이트 테마(`theme/toss_theme.dart`) --- ## 검증 명령 ```bash dart analyze lib flutter test ``` --- ## 참고 - 서버에서 실제 원격 푸시 발송(Firebase Admin 등)은 별도 연동 단계일 수 있으며, 클라이언트는 토큰 등록까지 동작하도록 구성되어 있습니다. - 실제 배포·스토어 빌드 전에는 `firebase_options.dart` 및 Android/iOS Firebase 설정을 프로젝트에 맞게 교체해야 합니다.