변경 이력
너홀로러닝의 개발 변경 사항을 기록합니다.
[1.0.0] - 2026-04-11
🎉 첫 출시
Running Tracker: GPS & Stats의 첫 공개 버전입니다.
주요 기능
- 실시간 GPS 추적 — 거리, 페이스, 칼로리, 고도를 실시간으로 표시
- 지도 시각화 — Google Maps 기반 러닝 경로 표시
- 주간/월간 통계 — 아름다운 차트와 분석
- 배지 시스템 — 목표 달성 시 성취감을 주는 14개 배지
- 완전한 히스토리 — 날짜별로 정리된 러닝 기록
- Google 로그인 — 간편한 계정 시스템
- 음성 알림 — 킬로미터 마일스톤마다 음성 안내
- 프라이버시 우선 설계 — GPS 경로 데이터는 기기에만 저장
출시 전 빌드 이력
1.0 심사 제출까지 4번의 빌드 반복을 거쳤습니다. 각 단계에서 발견된 이슈를 해결했습니다.
빌드 1 (2026-04-11 12:30)
- 초기 업로드
- 기본 앱 기능 포함
빌드 2 (2026-04-11 12:59)
- Privacy Manifest 추가 —
PrivacyInfo.xcprivacy파일로 Required Reason API 선언 (Apple이 2024년 5월부터 의무화) - 인앱 계정 삭제 기능 추가 — App Store Review Guideline 5.1.1(v) 준수 (홈 화면 프로필 아바타 → Delete Account)
- Launch Screen 브랜딩 — Flutter 기본 placeholder를 브랜드 이미지로 교체 (#0C6848 배경 + 앱 아이콘 중앙)
- Export Compliance 자동 처리 —
ITSAppUsesNonExemptEncryption=falseInfo.plist 설정
빌드 3 (2026-04-11 13:29)
- 위치 권한 설명 추가 —
NSLocationAlwaysAndWhenInUseUsageDescription키 추가 (geolocator 패키지가 참조하는 iOS API 때문에 필수) - Apple의 ITMS-90683 경고 해결
빌드 4 (2026-04-11) — 심사 제출 빌드
- iPhone 전용 설정 —
TARGETED_DEVICE_FAMILY = "1"로 변경 - iPad 스크린샷 요구사항 회피 (1.0은 iPhone 전용으로 출시)
개발 과정 (출시 전)
🎨 러닝 중 화면 UX 재설계
초기에는 Duration이 가장 큰 요소로 표시되는 전형적인 트래커 UI였습니다. 실제 러너의 사용 맥락을 고려해 완전히 재설계했습니다.
새로운 정보 계층:
- 거리 (Hero) — 화면 중앙의 거대한 숫자 (84pt)
- 원형 프로그레스 링 — 5km 목표 기준 자동 확장 (5K → 10K → 하프마라톤 → 풀마라톤 → 다음 5K)
- 페이스 — 존별 자동 색상 변화
- Duration — 보조 정보로 축소
- 칼로리/고도 — 최소 정보로 하단
페이스 존 색상 시스템 (숫자 없이도 상태 파악):
| 페이스 | 상태 | 색상 | 라벨 |
|---|---|---|---|
| < 4:00/km | 과속 | 🔴 빨강 | SPRINT PACE |
| 4:00~5:30/km | 고강도 | 🟠 주황 | RACE PACE |
| 5:30~7:00/km | 최적 | 🟢 녹색 | TRAINING PACE |
| 7:00~9:00/km | 여유 | 🔵 파랑 | EASY PACE |
| > 9:00/km | 걷기 | ⚪ 회색 | WALKING |
시각 효과:
- 화면 가장자리 펄스 글로우 (러닝 상태 표시)
- 거리 숫자 부드러운 카운트 애니메이션
- 프로그레스 링의 SweepGradient 애니메이션
- 일시정지 시 주황색, 러닝 중 녹색으로 상태 전환
🔊 음성 알림 + 화면 잠금 방지
flutter_tts와 wakelock_plus 통합.
음성 알림 내용:
- 러닝 시작: "Let's run!"
- 매 1km 달성: "X kilometers. Pace M minutes S seconds per kilometer."
- 시간 기반 (1km 이후 매 5분): "M minutes. X kilometers."
- 러닝 종료: "Run complete. X kilometers in M minutes. Great job!"
화면 잠금 방지:
- 러닝 시작 시 자동 활성화 (
WakelockPlus.enable()) - 러닝 종료/취소 시 자동 해제
- 블루투스 이어폰으로 음성을 들으면서 폰을 주머니에 둘 수 있음
🎯 앱 아이콘
Python/Pillow 스크립트로 프로그래밍 방식 생성:
- 디자인: 진녹색 그라데이션 배경(#0C6848 → #043424) + 흰색 러닝 경로 곡선
- 시작 지점 마커: 왼쪽 링
- 러너 위치: 오른쪽 큰 원
- 드롭 섀도우: 입체감 부여
flutter_launcher_icons로 모든 iOS/Android 해상도 자동 생성- 알파 채널 없음 (App Store 요구사항)
🔐 프라이버시 아키텍처 검증
코드 분석 결과:
| 데이터 | 저장 위치 |
|---|---|
| 계정 정보 (이메일, 이름) | Firebase Auth |
| 러닝 요약 (거리, 시간, 페이스, 칼로리) | Cloud Firestore (암호화) |
| GPS 경로 데이터 | 기기 로컬 JSON 파일 (ApplicationDocumentsDirectory/routes/) |
| GPS 좌표 서버 전송 | 없음 |
→ Apple App Privacy 선언에서 "Precise Location: Not Collected"를 선언할 수 있는 유일한 러닝 앱.
🌐 영문 문서화 (Docusaurus i18n)
기존 한국어 전용 문서 사이트를 다국어로 확장:
docusaurus.config.js에 영문 locale 추가- 개인정보 처리방침 + 이용약관 영문 번역 (GDPR/CCPA 조항 포함)
- 네비게이션/푸터 다국어화
- Docusaurus 3.x의
en→en-US경로 정규화 이슈 해결 - GitHub Actions로 자동 배포 (
main브랜치 푸시 시)
📱 Android 정리
- 불필요한 위치 권한 제거
FOREGROUND_SERVICEFOREGROUND_SERVICE_LOCATIONACCESS_BACKGROUND_LOCATION
- 앱 이름을
running_tracker→Running Tracker로 변경 - 코드와 일치하지 않는 권한은 Google Play 심사 리스크
버전 정책
- Semantic Versioning 사용:
MAJOR.MINOR.PATCH - MAJOR: 큰 UX 변경 또는 호환성 깨짐
- MINOR: 새 기능 추가
- PATCH: 버그 수정
Build number(+N)는 App Store Connect 업로드 시마다 증가.