Files
sodalive-ios/docs/20261013_커뮤니티_딥링크_상세_이동/plan-task.md
T

8.4 KiB

커뮤니티 딥링크 상세 이동 계획

항목 내용
상태 구현·자동 검증 완료, 실제 게시물 UI 확인 제한
작성일 2026-10-13
요구사항 prd.md CD-001~005
API 기준 기존 상세 화면/조회 API 유지
현재 Phase 1: postId 기반 상세 라우팅

목표와 범위

정상 community postId는 상세 화면으로 전달하고 누락·무효 값은 이동하지 않는다. 공통 handler와 기존 테스트만 변경하며 UI·API·다른 딥링크·기존 댓글 화면 정리는 제외한다.

Phase 1

결과: 커뮤니티 딥링크가 사용자 ID와 무관하게 정확한 게시글 상세 route를 선택한다. 선행조건: 사용자 인터뷰 완료, 기존 딥링크 검사 22 assertions 통과.

Task 1.1 라우팅 변경과 회귀 검사

Goal P1-T1: CD-001~005를 production handler 실행으로 검증한다. Files:

  • Modify: SodaLive/Sources/App/AppDeepLinkHandler.swift

  • Test: work/tests/AppDeepLinkGiftDetailCheck.swift

  • Run: work/tests/check-app-deep-link-gift-detail.sh

  • Read: SodaLive/Sources/App/AppStep.swift, SodaLive/Sources/ContentView.swift, SodaLive/Sources/Splash/SplashView.swift

  • Read: SodaLive/Sources/V2/CreatorChannel/Community/Detail/CreatorChannelCommunityPostDetailView.swift, CreatorChannelCommunityPostDetailViewModel.swift (같은 디렉터리) Interfaces: 기존 URL handler 입력 → 기존 creatorChannelCommunityPostDetail(postId:) route. 완료 증거: RED/GREEN 실행 결과, 유효·무효·스플래시·인접 라우팅 검사.

  • RED: 정상 postId 상세 이동 및 누락·무효 값 이동 금지 회귀 검사 추가.

  • RED 확인: bash work/tests/check-app-deep-link-gift-detail.sh로 의도한 assertion 실패 확인.

  • GREEN: postId 단독 community action과 기존 상세 route 연결.

  • GREEN 확인: 같은 명령으로 신규·기존 검사 통과.

  • REFACTOR: 이번 변경이 만든 handler 내부 불필요 코드 제거 및 회귀 재검증.

Task 1.2 검증과 리뷰

Goal P1-GATE: 변경 범위의 검증 결과와 확인 불가능한 환경 조건을 구분한다. Files: 위 코드/테스트, 본 PRD/계획, reviews/phase1-community-post-detail-links.md. TDD 예외 사유: 검증·리뷰 기록만 작성하는 Task.

  • Swift 컴파일/구문 검사와 앱 빌드 실행.
  • 실제 handler 입력/결과 및 iOS UI 검증 가능 여부 기록.
  • 읽기 전용 리뷰 후 확정 문제가 있으면 신규 Task 등록, 없으면 발견 사항 없음 기록.
  • 변경 범위와 검증 결과를 Progress에 누적.

시나리오와 검증

시나리오 이진 성공 기준 실행 표면
정상 입력 voiceon://community?postId=12345가 상세 12345로 이동, 목록/댓글 예약 없음 production handler를 swiftc로 컴파일한 기존 하네스
잘못된 입력 누락·빈 값·문자·0·음수·범위 초과 입력은 route/pending 변경 없음 동일 하네스, 사용자 ID 0/양수와 path/query 변형
시작·진입점 splash에서 저장 후 apply, notificationList에서도 상세 12345 동일 하네스
인접 회귀 기존 선물/콘텐츠 라우팅 유지 기존 22 assertions

명령: bash work/tests/check-app-deep-link-gift-detail.sh, swiftc -frontend -parse SodaLive/Sources/App/AppDeepLinkHandler.swift work/tests/AppDeepLinkGiftDetailCheck.swift, xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build. iOS 수동 QA는 개발 앱에서 xcrun simctl openurl booted 'voiceon-test://community?postId=12345'로 진입해 상세 화면/게시물을 확인해야 한다. 운영 앱의 등록 scheme은 voiceon, 개발 앱은 voiceon-test다. 빌드/앱 실행이 차단되면 handler 하네스를 UI 검증으로 대체했다고 주장하지 않는다.

실행 순서와 중단 조건

P1-T1 → P1-GATE. 검증과 리뷰가 끝나면 추가 정리 없이 종료한다. 현재 브랜치에서만 작업한다.

Progress

기준 확인 — 2026-10-13

  • 기존 딥링크 하네스: exit 0, 22 assertions 통과.
  • 상세 화면은 받은 postId로 기존 상세 API를 조회함을 확인.
  • Xcode 26.0, 실행 중 시뮬레이터 없음.
  • 인터뷰 결과: postId 누락·잘못된 값은 기존 목록 fallback 대신 이동 금지.

P1-T1 RED — 2026-10-13

  • 기존 하네스에 정상 입력·사용자 ID 독립성·누락/무효·스플래시·알림 목록 검사를 추가했다.
  • swiftc -frontend -parse work/tests/AppDeepLinkGiftDetailCheck.swift: exit 0.
  • bash work/tests/check-app-deep-link-gift-detail.sh: FAIL: community link accepted: voiceon://community?postId=12345, userId=0 assertion으로 실패. 기존 코드의 사용자 ID 의존성 때문에 발생한 의도된 RED다.

P1-T1 GREEN — 2026-10-13

  • community action은 postId만 보유하며 기존 상세 route에 전달한다. 사용자 ID fallback과 기존 목록/댓글 예약 호출을 handler에서 제거했다.
  • 명시적인 community 경로의 누락·무효 postId는 다른 쿼리 route로 우회하지 않는다.
  • bash work/tests/check-app-deep-link-gift-detail.sh: exit 0, 279 assertions 통과.
  • swiftc -frontend -parse SodaLive/Sources/App/AppDeepLinkHandler.swift work/tests/AppDeepLinkGiftDetailCheck.swift: exit 0.
  • git diff --check: exit 0.
  • for test_script in work/tests/check-*.sh; do bash "$test_script" || exit $?; done: exit 0, 기존 스크립트 전체 통과.
  • 첫 앱 빌드는 도구의 120초 제한으로 중단되어 실행 제한을 600초로 늘려 재실행했다.

P1-GATE — 2026-10-13

  • 앱 빌드: 위 xcodebuild ... build 재실행 결과 BUILD SUCCEEDED. 로그: /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/community-deeplink-build-retry.log.
  • 변경 handler의 빌드 경고/오류 없음. lsp_diagnostics 도구가 제공되지 않아 Swift 컴파일·구문 검사와 앱 빌드로 확인했다.
  • Xcode test: xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -destination 'platform=iOS Simulator,id=E9FC7721-AA96-440F-8349-2DC4B85F40F5' CODE_SIGNING_ALLOWED=NO test는 Scheme SodaLive-dev is not currently configured for the test action으로 실행 불가. 전체 검증 성공은 work/tests/check-*.sh 범위이며 XCTest 통과를 의미하지 않는다.
  • 독립 읽기 전용 리뷰: 차단 결함 없음, handler 하네스 279 assertions 재확인. 리뷰.
  • 실제 QA: 작업 전용 iPhone 17 Pro/iOS 26.0 시뮬레이터 9794D878-ABFB-48F6-9759-17C9C2EB48F8 생성·부팅 후 빌드한 개발 앱 설치. 부팅/설치 명령은 120초 제한에 걸렸으나 simctl get_app_container로 설치 완료를 별도 확인했다.
  • xcrun simctl launch ... 9794D878-ABFB-48F6-9759-17C9C2EB48F8 kr.co.vividnext.sodalive.debug2: PID 26019. xcrun simctl openurl 9794D878-ABFB-48F6-9759-17C9C2EB48F8 'voiceon-test://community?postId=12345' 실행.
  • 스크린샷 /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/community-deeplink-valid.png에서 첫 실행 추적 허용 팝업과 배경 홈 화면 확인. 재실행 캡처는 같은 디렉터리의 community-deeplink-reopen.png.
  • [blocked] 실제 게시글 표시·접근 권한 및 푸시 탭 UI 검증: 첫 실행 시스템 팝업을 조작할 iOS UI 자동화 도구가 제공되지 않아 완료하지 못했다. 개발 앱에서 팝업을 처리한 뒤 접근 가능한 실제 postId로 확인해야 한다. handler 검사를 UI 검증 완료로 보고하지 않는다.
  • 작업 중 SodaLive.xcodeproj/project.pbxproj에 별도 항목 정렬 diff가 관찰됐다. 직접 수정한 파일이 아니므로 임의 복구하지 않았으며 라우팅 변경 범위와 분리한다.
  • QA 정리: xcrun simctl terminate 9794D878-ABFB-48F6-9759-17C9C2EB48F8 kr.co.vividnext.sodalive.debug2 && xcrun simctl shutdown 9794D878-ABFB-48F6-9759-17C9C2EB48F8 && xcrun simctl delete 9794D878-ABFB-48F6-9759-17C9C2EB48F8 성공. 작업 전용 앱/시뮬레이터를 정리했고 사용자 기존 기기/Preview는 변경하지 않았다. 테스트 임시 바이너리는 기존 스크립트의 EXIT trap으로 제거된다.
  • 최종 딥링크 검사 279 assertions 및 git diff --check 재통과. 스크린샷·빌드 로그는 위 임시 경로에 검증 자료로 보존한다.