Files
sodalive-ios/docs/20260714_라이브룸_전역_표시와_키보드_레이아웃_수정/plan-task.md

12 KiB

라이브룸 전역 표시와 키보드 레이아웃 수정 계획

기준 문서

  • PRD: docs/20260714_라이브룸_전역_표시와_키보드_레이아웃_수정/prd.md
  • 코드 스타일: docs/agent-guides/code-style.md
  • 빌드/검증: docs/agent-guides/build-test-verification.md
  • 기존 외부 이동 확인 기록: docs/plan-task/20260306_라이브룸외부이동확인다이얼로그.md

구현 원칙

  • enterRoom의 API 요청·응답 처리는 유지하고, 전역 overlay와 충돌하는 navigation side effect만 분리한다.
  • 전역 라이브룸은 한 곳에서만 생성한다.
  • 표시 계층 이동으로 가려질 수 있는 기존 외부 이동 확인 다이얼로그도 같은 최상위 계층으로 옮긴다.
  • 키보드 처리 방식은 새로 만들지 않고, 현재 수동 offset과 충돌하는 safe area 적용 위치만 바로잡는다.

Phase 1: 라이브룸 전역 표시

  • Task 1.1: 라이브룸 표시 지점을 앱 최상위로 이동

    • 대상 파일:
      • 수정: SodaLive/Sources/ContentView.swift
      • 수정: SodaLive/Sources/V2/Main/MainView.swift
    • 작업 내용:
      • ContentViewNavigationStack 최상위에 전역 ZStack overlay를 구성한다.
      • AppState.shared.isShowPlayertrue이면 NavigationStack 위에 LiveRoomViewV2를 표시한다.
      • MainView 내부의 기존 LiveRoomViewV2 표시 분기를 제거해 중복 생성을 방지한다.
    • 검증 기준:
      • 실행 명령: rg -n "LiveRoomViewV2\\(" SodaLive/Sources/ContentView.swift SodaLive/Sources/V2/Main/MainView.swift
      • 기대 결과: 실제 표시 지점은 ContentView 한 곳에서만 확인된다.
  • Task 1.2: 외부 이동 확인 상태와 다이얼로그를 전역 계층으로 이동

    • 대상 파일:
      • 수정: SodaLive/Sources/App/AppState.swift
      • 수정: SodaLive/Sources/ContentView.swift
      • 수정: SodaLive/Sources/V2/Main/MainView.swift
    • 작업 내용:
      • pending navigation action과 cancel action, 다이얼로그 표시 상태를 AppState에서 관리한다.
      • MainView의 외부 이동 요청은 AppState에 위임한다.
      • ContentView에서 기존 문구와 SodaV2ActionModal을 사용해 라이브룸 위에 확인 다이얼로그를 표시한다.
      • 라이브 종료 후 pending action 실행 및 취소 시 상태 정리 의미를 유지한다.
    • 검증 기준:
      • 실행 명령: rg -n "isShowLeaveLiveNavigationDialog|requestExternalNavigation|confirmExternalNavigation|cancelExternalNavigation|requestLiveRoomQuitForExternalNavigation" SodaLive/Sources/App/AppState.swift SodaLive/Sources/ContentView.swift SodaLive/Sources/V2/Main/MainView.swift
      • 기대 결과: 상태/처리는 AppState, 표시는 ContentView, 요청 위임은 MainView에서 확인된다.

Phase 2: 라이브 채팅 키보드 레이아웃 수정

  • Task 2.1: 키보드 safe area 무시 위치 보정 (초기 보정, Phase 4에서 대체)
    • 대상 파일:
      • 수정: SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift
    • 작업 내용:
      • 내부 hosted content에 적용된 .ignoresSafeArea(.keyboard)를 제거한다.
      • ScreenCaptureSecureContainer 바깥에 .ignoresSafeArea(.keyboard)를 적용한다.
      • 기존 appliedKeyboardHeight와 채팅 입력 offset은 유지한다.
    • 검증 기준:
      • 실행 명령: rg -n "ScreenCaptureSecureContainer|ignoresSafeArea\\(\\.keyboard\\)|offset\\(y: -appliedKeyboardHeight\\)" SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift
      • 기대 결과: outer container가 키보드 safe area를 무시하고 수동 offset은 한 번만 적용된다.

Phase 3: 검증

  • Task 3.1: 변경 범위 및 정적 검증

    • 대상 파일:
      • 확인: SodaLive/Sources/ContentView.swift
      • 확인: SodaLive/Sources/V2/Main/MainView.swift
      • 확인: SodaLive/Sources/App/AppState.swift
      • 확인: SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift
    • 작업 내용:
      • 라이브룸 단일 표시, 외부 이동 확인 흐름, 키보드 modifier 위치를 검색한다.
      • git diff --check로 whitespace 오류를 확인한다.
    • 검증 기준:
      • 기대 결과: PRD 범위를 벗어난 소스 변경이 없고 정적 검사 오류가 없다.
  • Task 3.2: Debug 빌드 검증

    • 대상 파일:
      • 확인: SodaLive.xcworkspace
    • 작업 내용:
      • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build를 실행한다.
    • 검증 기준:
      • 기대 결과: ** BUILD SUCCEEDED **.
  • Task 3.3: 수동 동작 검증

    • 대상 화면:
      • 크리에이터 채널의 즉시 라이브 생성 화면
      • 라이브룸 채팅 화면
      • 라이브 중 푸시/딥링크 외부 이동 확인 화면
    • 작업 내용:
      • 즉시 라이브 생성 후 현재 화면 위에 라이브룸이 보이는지 확인한다.
      • 키보드 표시 시 입력창이 키보드 바로 위에 있고 큰 빈 공간이 없는지 확인한다.
      • 외부 이동 확인/취소 흐름을 확인한다.
    • 검증 기준:
      • 기대 결과: PRD Success Criteria를 충족한다.

Phase 4: 사용자 재검증 후 보정

  • Task 4.1: 보안 컨테이너를 화면 전체로 확장

    • 대상 파일:
      • 수정: SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift
    • 작업 내용:
      • ScreenCaptureSecureContainer에 무한 최대 frame을 부여한다.
      • 컨테이너 바깥에서 모든 safe area를 무시해 UIKit 컨테이너 경계가 전체 화면을 차지하도록 한다.
    • 검증 기준:
      • 라이브룸 배경이 상태 표시줄과 홈 인디케이터 영역까지 덮는다.
  • Task 4.2: 내부 UIHostingController의 키보드 자동 회피 제거

    • 대상 파일:
      • 수정: SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift
    • 작업 내용:
      • UIHostingController.safeAreaRegions.container로 제한한다.
      • 일반 container safe area는 내부 UI에 유지하고 keyboard safe area만 제외한다.
      • 기존 appliedKeyboardHeight offset은 유지한다.
    • 검증 기준:
      • 키보드 표시 시 내부 호스팅 크기 축소와 수동 offset이 중복되지 않는다.

Phase 5: 재검증

  • Task 5.1: 정적 검사 및 Debug 빌드

    • 대상 파일:
      • 확인: SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift
    • 검증 기준:
      • git diff --check가 성공한다.
      • SodaLive-dev Debug 빌드가 ** BUILD SUCCEEDED **로 완료된다.
  • Task 5.2: 수정본 수동 동작 검증

    • 대상 화면:
      • 전역 라이브룸 화면
      • 라이브룸 채팅 입력 화면
    • 검증 기준:
      • 라이브룸이 화면 전체를 덮는다.
      • 키보드 표시 시 입력창이 키보드 바로 위에 위치하고 큰 빈 공간이 없다.

Phase 6: 라이브 종료 후 입장 전 화면 복원

  • Task 6.1: 공용 입장 성공 처리에서 navigation 초기화 제거

    • 대상 파일:
      • 수정: SodaLive/Sources/Live/LiveViewModel.swift
      • 수정: SodaLive/Sources/Explorer/Profile/UserProfileViewModel.swift
    • 작업 내용:
      • 입장 성공 시 roomIdisShowPlayer만 갱신한다.
      • 공용 enterRoom 내부의 setAppStep(.main) 호출을 제거한다.
    • 검증 기준:
      • 앱 내부 진입점이 현재 navigation path를 유지한 채 전역 라이브룸을 표시한다.
  • Task 6.2: 콜드 스타트 라이브 푸시의 메인 전환 명시

    • 대상 파일:
      • 수정: SodaLive/Sources/Splash/SplashView.swift
    • 작업 내용:
      • 스플래시에서 pushRoomId를 로컬 값으로 소비한다.
      • .main을 설정한 뒤 소비한 room ID로 입장을 진행한다.
    • 검증 기준:
      • 기존 콜드 스타트 푸시가 스플래시에 머물지 않고 메인 위 라이브룸으로 진입한다.
  • Task 6.3: 정적 검사 및 Debug 빌드

    • 대상 파일:
      • 확인: SodaLive/Sources/Live/LiveViewModel.swift
      • 확인: SodaLive/Sources/Explorer/Profile/UserProfileViewModel.swift
      • 확인: SodaLive/Sources/Splash/SplashView.swift
    • 검증 기준:
      • git diff --check가 성공한다.
      • SodaLive-dev Debug 빌드가 ** BUILD SUCCEEDED **로 완료된다.
  • Task 6.4: 진입점별 수동 복귀 검증

    • 대상 화면:
      • 홈/라이브 탭, 라이브 상세, 크리에이터 채널, 프로필
      • 콜드 스타트 및 포그라운드 라이브 푸시
    • 검증 기준:
      • 일반 입장은 종료 후 입장 직전 화면을 표시한다.
      • 푸시 입장은 호출부에 정의된 navigation 정책을 유지한다.

검증 기록

  • 2026-07-14: 코드 조사 결과 LiveRoomViewV2MainView 내부에 있어 navigation destination보다 아래에 놓이는 표시 계층 문제와, ScreenCaptureSecureContainer 바깥의 시스템 키보드 회피 및 내부 수동 offset이 중복될 수 있는 구조를 확인했다. 구현 및 빌드 검증은 아직 수행하지 않았다.
  • 2026-07-14: LiveRoomViewV2 표시를 ContentViewNavigationStack overlay로 옮기고, 외부 이동 확인 상태와 다이얼로그도 같은 전역 계층으로 이동했다. MainView에서는 전역 상태에 요청만 위임하도록 정리했다.
  • 2026-07-14: .ignoresSafeArea(.keyboard)를 내부 hosted content에서 ScreenCaptureSecureContainer 바깥으로 이동해 시스템 키보드 회피와 기존 수동 offset이 중복되지 않도록 했다.
  • 2026-07-14: rg로 라이브룸 단일 표시 지점, 외부 이동 확인 흐름, 키보드 modifier 위치를 확인했고 git diff --check가 오류 없이 완료됐다.
  • 2026-07-14: sandbox 환경의 CoreSimulator/XPC 접근 제한으로 최초 빌드가 소스 컴파일 전에 중단됐다. 동일 명령을 허용된 환경에서 -derivedDataPath /tmp/SodaLiveDerivedData와 함께 다시 실행했으며, 전체 빌드와 최종 변경 후 증분 빌드 모두 ** BUILD SUCCEEDED **를 확인했다.
  • 2026-07-14: Task 3.3의 실제 즉시 라이브 생성, 채팅 키보드, 라이브 중 외부 이동 확인/취소는 기기 또는 시뮬레이터 수동 QA가 필요해 미실행 상태로 남겼다.
  • 2026-07-14: 사용자 재검증에서 라이브룸이 화면 전체를 덮지 않고 키보드 위 빈 공간도 남는 것을 확인했다. 바깥 ScreenCaptureSecureContainer와 내부 UIHostingController가 별도의 safe area 경계를 가지므로 바깥 modifier 이동만으로는 부족했다.
  • 2026-07-14: ScreenCaptureSecureContainer를 전체 화면 frame으로 확장하고 모든 바깥 safe area를 무시하도록 보정했다. 내부 UIHostingController.safeAreaRegions.container로 제한해 상태 표시줄/홈 인디케이터 safe area는 유지하면서 키보드 자동 회피만 제외했다.
  • 2026-07-14: 보정 후 git diff --check가 성공했고, xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -derivedDataPath /tmp/SodaLiveDerivedData build에서 ** BUILD SUCCEEDED **를 확인했다. Task 5.2의 실제 화면 확인은 사용자 수동 재검증이 필요하다.
  • 2026-07-14: 사용자 재검증에서 크리에이터 채널로 입장한 라이브 종료 후 메인이 표시되는 문제를 확인했다. 종료 처리가 이동한 것이 아니라 공용 enterRoomsetAppStep(.main)이 입장 시 navigation path를 미리 삭제한 것이 원인이었다.
  • 2026-07-14: 일반 입장은 현재 화면을 보존하도록 공용 입장 구현 두 곳에서 navigation 초기화를 제거했다. 2025년 콜드 스타트 라이브 푸시 보정의 의도는 SplashView에서 pushRoomId 소비와 .main 전환을 명시하는 방식으로 유지했다.
  • 2026-07-14: 변경 후 git diff --check가 성공했고, xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -derivedDataPath /tmp/SodaLiveDerivedData build에서 ** BUILD SUCCEEDED **를 확인했다. Task 6.4의 진입점별 종료 복귀와 푸시 진입은 실제 앱 수동 검증이 필요하다.