feat: 스택 잔여분 env/dev 일괄 반영 — Phase 14~18 + 레거시 스플래시 비주얼 (머지 순서 수습) - #358
Merged
Conversation
- Domain: AlarmSessionSnapshot(info·도보 초·표시명·수단·확인·만료) + AlarmSessionSnapshotStore 포트 신설, AlarmInfo·TransportMode Codable, LastRoute 세션 파생값(첫 도보 초·탑승 구간· 표시명 — LA 어댑터의 표시명 로직을 Domain 순수 계산으로 이동) - 도보 시간 반영(미확정 #7 클라 임시안 확정): AlarmTiming.alarmFireDate(departureTime: firstWalkSeconds:) — 기본값 없이 등록/refresh 재스케줄/LA alarmTime/홈 배너 4곳이 같은 기준을 강제로 탄다(이중 시각 금지). refresh의 도보 출처는 스냅샷(routeId 일치 시) - RegisterAlarmUseCase: 과거 fireDate 사전 가드(AlarmError.tooLate — 권한 팝업·서버 등록 전 차단) + 등록 성공 시 스냅샷 저장. Cancel: clear. 홈 토스트 "이미 출발 시간이 지난 경로예요" - AlarmSyncService: 첫 sync 진입 시 스냅샷 시딩(diff 휘발 해소 — lastInfo 복원 + 구독자 전파로 오프라인 재실행 복원, expired 톰스톤은 2차 방어 복원) / sync 성공 시 병합 저장 + 죽은 세션 LA 로컬 재시작 위임 / 만료 확정 시 톰스톤(expired=true), 서버 sessionEnded 시 clear / "당겨짐" 배지 만료 보존(조용한 갱신이 10분을 못 채우고 지우던 문제) - LA 어댑터: 부트스트랩 직후 Activity.activities 스캔 — 스냅샷 일치+미만료+미dismiss는 adopt(관찰 재개), 그 외 즉시 정리. sync 성공 후 죽은 세션(활성 LA 없음·미확인·미dismiss) 로컬 재시작(8시간 한도·시작 실패 커버, push-to-start 무관). 최초 start 긴급도를 알람 시각 기준으로 통일 - 홈: alarmSynced 수신 시 카드 없으면 GetLastRouteDetailUseCase(신설 — 기존 미사용 detail 엔드포인트 재활용)로 카드 복원 + 도보 반영 배너 재시작. 변경 분 표기 .up 통일 - 위젯: Attributes에 수단·도보 필드(optional — 구버전 LA 재부착 디코딩 안전) → DI 컴팩트 지하철/버스 아이콘 분기 + 잠금화면 3행 "HH:mm 출발 · 정류장 도보 N분" - stopIntent 확인 기록 영속화(Phase 13 연동) — 확인된 세션은 LA 재시작 금지 - DEV: 데모 경로에 도보 leg(120초) 추가(검수 ③ 재료), 변경 시뮬레이터 기준 세션 영속화 (재실행 후 주입 diff·카드 복원 시각 정합) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… 권한 회복) - LA alert 도달 불가 판정(isAlertReachable: activity ∧ areActivitiesEnabled ∧ ¬dismissed)으로 폴백 조건 확대 - 폴백 노티 .timeSensitive + time-sensitive entitlement (집중 모드 관통) - UNUserNotificationCenterDelegate 도입 — 노티 탭 → 홈 랜딩, willPresent [.banner,.sound] 명시 - 알림 권한 deniedNow 1회 안내 토스트 (요청 이력 가드 불변, RegisterAlarmUseCase 반환값 확장) - 최후통첩 분기 applicationState 선행 검사 — 포그라운드 이중 알림 제거 - 위치 권한 didBecomeActive 재확인 — needsSearch 한정, 깜빡임·토스트 스팸 없음 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… 신선도 스탬프 + App 테스트 타겟) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… + 신선도 스탬프 + App 테스트 타겟) - 수동 갱신: Domain AlarmSyncRequesting/RequestAlarmSyncUseCase + AlarmSyncService.syncNow(4번째 트리거, inFlight 합류) + 홈 스크롤 래핑·UIRefreshControl(실패 무음) - Stage/Release URLSession 타임아웃 10/30초 + CoreNetwork 멱등 GET 1회 재시도(transport 한정) - NetworkError.offline 신설(notConnectedToInternet·dataNotAllowed) + 스플래시 실패 문구 분기(BootstrapFailureMessage) - 신선도 스탬프: AlarmSyncUpdate(info+checkedAt) 방출 + 스냅샷 syncedAt 영속화 + 배너 보조 라인·카드 푸터 "HH:mm 확인 기준" - App 테스트 타겟(AtchaV2Tests) 신설 — AlarmSyncService UIApplication·Date() 직접 참조를 isAppActive·now 주입으로 교체, 판정·폴백·만료 분기 회귀 테스트 11건 + 스플래시 매핑 테스트 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… 오늘/내일 라벨, 자동 검수 규약 기준) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…how 코디네이터 정리·스와이프 백 + LocationError 세분화 + 오늘/내일 라벨 + 다시 검색하기·스와이프 삭제) - 검색: 최근/결과 0건 DSEmptyState, .loadingPlaces(디바운스 후), 다시 검색하기 = 도착지 슬롯 초기화+포커스, 최근 검색 trailing 스와이프 삭제 - Interface: SearchEntryField + initialField, onRouteSelected가 (LastRoute, Place) 동반 - 홈: arrivalText 바인딩, 탭한 필드로 검색 진입, 위치 실패 3분기 토스트(restricted는 설정 이동 없음) - SearchCoordinator: NSObject+UINavigationControllerDelegate — 백 버튼·스와이프 백(활성화)·popToRoot didShow 단일 정리 - Domain: LocationError restricted/servicesDisabled 신설, App classify 순수 함수(AtchaV2Tests) - 오늘/내일: 내일만 접두(무라벨=오늘), Search/Home ViewData now 주입, 지난 막차 제외 - DEV 검수 훅: 예약 키워드(결과없음/경로없음) + 내일 출발 데모 대안 경로 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…태 문구가 키보드에 가림) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…수 규약 기준) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…저장, 알람 자동 등록 없음) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… 실측 추가 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, 스피너·재시도 UI 유지)
- 레거시 Icon.xcassets에서 Splash_BG/img_Atcha/img_Atcha_character를
Projects/App/Resources/Assets.xcassets(splashBackground/splashLogo/splashCharacter)로
복사 — iCloud 중복 파일(" 2.*") 제외, 기능 로직(버전체크·라우팅)은 이식하지 않음
- SplashViewController: "앗차" 텍스트 라벨 → 전체 배경 이미지 + 캐릭터/로고 세로 스택(간격 12,
정중앙). AppCoordinator가 쓰는 showLoading/showRetry/onRetryTapped API와
스피너(로고 아래)·재시도 UI는 유지
- LaunchScreen.storyboard 신규 + UILaunchScreen → UILaunchStoryboardName 교체로
런치→스플래시 전환이 레거시처럼 끊김 없이 보임 (스토리보드 없음 규약의 유일 예외 — 런치스크린은
iOS가 storyboard/UILaunchScreen만 허용)
- 검증: Debug·Stage 시뮬레이터 빌드 성공, iPhone 17 시뮬 실측으로 런치스크린·스플래시·홈 진입
프레임 캡처 확인 (로고 위치 튐 없음)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat: 레거시 스플래시 비주얼 V2 이식 (런치스크린 포함)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
왜 이 PR이 필요한가
스택 PR(#351~#357) 머지 순서가 꼬여서 env/dev에는 phase13(#351)만 들어갔습니다.
이미 머지된 PR은 base를 바꿀 수 없으므로, 모든 잔여 내용을 조상으로 포함하는
feat/v2-phase18-one-tap-chip을 env/dev로 직접 머지해 수습합니다.포함 내용 (env/dev에 없는 15커밋, 90파일 +5293/−347)
검증
docs/prompts/atcha-v2-auto-verification.md)으로 개별 검수 완료 (feat: AtchaV2 Phase 14 — 재실행 정합성 (스냅샷 + 고아 LA 재부착 + 도보 시간) #352~feat: AtchaV2 Phase 18 — 최근 경로 원탭 칩 (3탭→1탭, 최근 검색 표면 확장) #356 참고)git diff env/dev...feat/v2-phase18-one-tap-chip가 phase13 내용과 충돌 없이 잔여분만 포함함을 확인🤖 Generated with Claude Code