Skip to content

feat: 스택 잔여분 env/dev 일괄 반영 — Phase 14~18 + 레거시 스플래시 비주얼 (머지 순서 수습) - #358

Merged
YuGeonHui merged 15 commits into
env/devfrom
feat/v2-phase18-one-tap-chip
Aug 24, 2026
Merged

feat: 스택 잔여분 env/dev 일괄 반영 — Phase 14~18 + 레거시 스플래시 비주얼 (머지 순서 수습)#358
YuGeonHui merged 15 commits into
env/devfrom
feat/v2-phase18-one-tap-chip

Conversation

@YuGeonHui

Copy link
Copy Markdown
Collaborator

왜 이 PR이 필요한가

스택 PR(#351~#357) 머지 순서가 꼬여서 env/dev에는 phase13(#351)만 들어갔습니다.

이미 머지된 PR은 base를 바꿀 수 없으므로, 모든 잔여 내용을 조상으로 포함하는 feat/v2-phase18-one-tap-chip을 env/dev로 직접 머지해 수습합니다.

포함 내용 (env/dev에 없는 15커밋, 90파일 +5293/−347)

머지 시 merge commit 방식을 권장합니다 (squash 시 phase별 커밋 이력이 한 커밋으로 뭉개짐).

검증

🤖 Generated with Claude Code

YuGeonHui and others added 15 commits August 23, 2026 14:24
- 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>
… 권한 회복)

- 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>
…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>
…, 스피너·재시도 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 이식 (런치스크린 포함)
@YuGeonHui
YuGeonHui merged commit ee4d089 into env/dev Aug 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant