223 lines
11 KiB
Markdown
223 lines
11 KiB
Markdown
# PRD: 크리에이터 채널 공유
|
|
|
|
## 문서 정보
|
|
|
|
| 항목 | 내용 |
|
|
|---|---|
|
|
| 문서 상태 | 구현 완료, 수동 검증 대기 |
|
|
| 작성일 | `2026-09-14` |
|
|
| 최종 수정일 | `2026-09-15` |
|
|
| 대상 제품 | 크리에이터 채널 공유 |
|
|
| 작성자·결정권자 | 제품 요구사항: 사용자, 문서 작성: Sisyphus |
|
|
| 관련 API Contract | 해당 없음 |
|
|
| 관련 구현 계획 | `docs/20260914_크리에이터_채널_공유/plan-task.md` |
|
|
| 관련 review | 없음 |
|
|
|
|
### 요구사항 상태
|
|
|
|
| 상태 | 의미 | 구현 처리 |
|
|
|---|---|---|
|
|
| 확정 | 제품·기술 결정이 완료되어 구현 기준으로 사용 | `plan-task.md`의 Task와 완료 증거로 추적 |
|
|
| 제외 | 현재 릴리스에서 구현하지 않기로 결정 | Decision Log에 제외 이유 기록 |
|
|
|
|
## 1. Overview
|
|
|
|
크리에이터 채널 사용자는 채널을 외부 앱으로 공유할 수 있어야 한다. 내 채널에서는 우측 상단에 공유 버튼을 바로 노출하고, 다른 사람 채널에서는 우측 상단 더보기 메뉴 안에서 채널 공유를 선택한다.
|
|
|
|
공유 동작은 기존 `UserProfileView`의 채널 공유와 동일하게 OneLink 메시지를 만든 뒤 `ActivityViewController`로 시스템 공유 시트를 표시한다.
|
|
|
|
## 2. Problem Statement
|
|
|
|
- 현재 신규 `CreatorChannelView`에는 채널 공유 진입점이 없다.
|
|
- 기존 레거시 `UserProfileView`에는 채널 공유 동작이 있으나, 신규 크리에이터 채널 title bar와 더보기 overlay에는 연결되어 있지 않다.
|
|
- 사용자는 자신의 채널을 홍보하거나 다른 사람의 채널을 추천하려면 앱 밖으로 공유할 수 있어야 한다.
|
|
|
|
문제를 해결했다는 판단은 내 채널과 다른 사람 채널에서 모두 기존 채널 공유 메시지와 딥링크가 포함된 iOS 공유 시트가 열리는 것으로 한다.
|
|
|
|
## 3. Goals
|
|
|
|
### 3.1 제품 목표
|
|
|
|
- 내 크리에이터 채널 우측 상단에 공유 버튼을 직접 표시한다.
|
|
- 다른 사람 크리에이터 채널 더보기 메뉴 최상단에 `채널 공유` 항목을 표시한다.
|
|
- 공유 결과는 기존 `UserProfileView` 채널 공유와 동일한 메시지·딥링크 형식을 사용한다.
|
|
|
|
### 3.2 UX 목표
|
|
|
|
- 내 채널 사용자는 더보기 단계를 거치지 않고 바로 공유할 수 있다.
|
|
- 다른 사람 채널 사용자는 기존 더보기 메뉴 안에서 공유, 차단, 신고 동작을 한 곳에서 선택할 수 있다.
|
|
- 공유 버튼에는 `ic_audio_content_share` asset을 사용한다.
|
|
|
|
## 4. Non-Goals
|
|
|
|
- 새 공유 문구를 만들지 않는다.
|
|
- 새 딥링크 계약이나 새 API를 만들지 않는다.
|
|
- 공유 URL 생성 로직을 범용 helper로 리팩터링하지 않는다.
|
|
- `Pods/**`, `generated/**`, `build/**`는 수정하지 않는다.
|
|
- 이 문서 작업에서는 코드 구현을 진행하지 않는다.
|
|
|
|
## 5. Target Users and Permissions
|
|
|
|
| 사용자 | 목표 | 주요 작업 | 사용 환경 |
|
|
|---|---|---|---|
|
|
| 내 채널 소유자 | 내 채널 홍보 | title bar 공유 버튼 탭 | iOS 앱 |
|
|
| 다른 사람 채널 방문자 | 채널 추천 | 더보기 메뉴에서 채널 공유 선택 | iOS 앱 |
|
|
|
|
권한 정책:
|
|
|
|
- 인증 여부와 무관하게 기존 `UserProfileView.shareChannel` 동작과 동일한 조건을 따른다.
|
|
- 내 채널 여부는 기존 `CreatorChannelView`의 `isOwnCreatorChannel` 판단을 따른다.
|
|
- 공유 대상 `creatorId`는 `CreatorChannelHomeResponse.creator.creatorId`를 사용한다.
|
|
|
|
## 6. 핵심 사용자 흐름
|
|
|
|
1. 사용자가 내 크리에이터 채널에 진입한다.
|
|
2. 우측 상단 `ic_audio_content_share` 버튼을 탭한다.
|
|
3. 앱이 기존 채널 공유 메시지와 OneLink URL을 생성한다.
|
|
4. iOS `ActivityViewController` 공유 시트가 표시된다.
|
|
|
|
다른 사람 채널 흐름:
|
|
|
|
1. 사용자가 다른 사람 크리에이터 채널에 진입한다.
|
|
2. 우측 상단 더보기 버튼을 탭한다.
|
|
3. overlay 메뉴 최상단의 `채널 공유` 항목을 탭한다.
|
|
4. 앱이 기존 채널 공유 메시지와 OneLink URL을 생성한다.
|
|
5. iOS `ActivityViewController` 공유 시트가 표시된다.
|
|
|
|
## 7. 정보 구조와 라우팅
|
|
|
|
```text
|
|
CreatorChannelView(creatorId:)
|
|
titleBar
|
|
my channel: share button
|
|
other channel: more button
|
|
more overlay
|
|
channel share
|
|
block/report actions
|
|
ActivityViewController
|
|
```
|
|
|
|
별도 route나 신규 `AppStep`은 추가하지 않는다.
|
|
|
|
## 8. 기능 요구사항
|
|
|
|
### 8.1 내 채널 공유 버튼
|
|
|
|
| ID | 상태 | 요구사항 | 수용 기준 | 계약/Goal 연결 |
|
|
|---|---|---|---|---|
|
|
| `CCSHARE-001` | 확정 | 내 채널 title bar 우측 상단에 공유 버튼을 직접 표시한다. | `isOwnCreatorChannel == true`일 때 `ic_audio_content_share` 버튼이 보이고 더보기 버튼은 공유 진입에 필요하지 않다. | `P1-T1` |
|
|
| `CCSHARE-002` | 확정 | 공유 버튼 탭 시 기존 채널 공유 방식으로 iOS 공유 시트를 표시한다. | 공유 메시지에 `I18n.MemberChannel.shareChannelMessage(nickname)` 결과와 OneLink URL이 포함된다. | `P1-T2` |
|
|
|
|
### 8.2 다른 사람 채널 더보기 공유
|
|
|
|
| ID | 상태 | 요구사항 | 수용 기준 | 계약/Goal 연결 |
|
|
|---|---|---|---|---|
|
|
| `CCSHARE-003` | 확정 | 다른 사람 채널 title bar는 기존 더보기 버튼을 유지한다. | `isOwnCreatorChannel == false`일 때 더보기 버튼을 탭하면 overlay 메뉴가 열린다. | `P1-T3` |
|
|
| `CCSHARE-004` | 확정 | 더보기 overlay 메뉴 최상단에 `채널 공유` 항목을 추가한다. | 메뉴 순서는 `채널 공유`가 기존 차단/신고 항목보다 위다. | `P1-T3` |
|
|
| `CCSHARE-005` | 확정 | `채널 공유` 항목 탭 시 overlay를 닫고 공유 시트를 표시한다. | 공유 시트가 표시되며 기존 차단/신고 흐름은 변경되지 않는다. | `P1-T3` |
|
|
|
|
### 8.3 공유 링크와 메시지
|
|
|
|
| ID | 상태 | 요구사항 | 수용 기준 | 계약/Goal 연결 |
|
|
|---|---|---|---|---|
|
|
| `CCSHARE-006` | 확정 | 공유 링크 생성은 기존 `UserProfileViewModel.shareChannel`과 동일한 OneLink 파라미터를 사용한다. | `af_dp=voiceon://`, `deep_link_value=channel`, `deep_link_sub5={creatorId}`가 사용된다. | `P1-T2` |
|
|
| `CCSHARE-007` | 확정 | 공유 실패 시 기존 채널 공유 실패 처리와 동일한 사용자 피드백을 사용한다. | OneLink 생성 실패 시 `I18n.MemberChannel.shareLinkCreateFailed` 기반 popup이 표시된다. | `P1-T2` |
|
|
|
|
## 9. 반응형 기능 범위
|
|
|
|
| 기능 | iPhone | iPad | 비고 |
|
|
|---|---:|---:|---|
|
|
| 내 채널 공유 버튼 | 전체 | 전체 | 기존 title bar layout 범위 안에서 표시 |
|
|
| 다른 사람 채널 더보기 공유 | 전체 | 전체 | 기존 overlay 메뉴 패턴 유지 |
|
|
| ActivityViewController | 전체 | 전체 | 기존 `ActivityViewController` wrapper 사용 |
|
|
|
|
## 10. UI/UX Expectations
|
|
|
|
### 10.1 디자인과 component 원칙
|
|
|
|
- 공유 버튼 asset은 `ic_audio_content_share`로 고정한다.
|
|
- 신규 공용 component를 만들기보다 기존 `CreatorChannelTitleBar`, `ProfileReportMenuView`, `ActivityViewController` 패턴을 우선 재사용한다.
|
|
- 더보기 메뉴의 신규 항목 텍스트는 `채널 공유` 의미의 I18n 항목으로 제공한다.
|
|
|
|
### 10.2 화면 상태
|
|
|
|
- 홈 API 응답을 받기 전에는 공유 대상 creator 정보가 없으므로 공유 action은 실행하지 않는다.
|
|
- 공유 시트 표시 중 기존 loading overlay를 새로 추가하지 않는다.
|
|
- OneLink 생성 실패 시 기존 popup 피드백을 표시한다.
|
|
|
|
### 10.3 접근성
|
|
|
|
- 공유 버튼에는 채널 공유 의미의 accessibility label을 제공한다.
|
|
- 더보기 메뉴의 `채널 공유` 항목은 탭 가능한 충분한 영역을 유지한다.
|
|
|
|
## 11. API 계약
|
|
|
|
신규 API 계약은 없다.
|
|
|
|
공유 링크 생성 파라미터:
|
|
|
|
| Key | Value |
|
|
|---|---|
|
|
| `af_dp` | `voiceon://` |
|
|
| `deep_link_value` | `channel` |
|
|
| `deep_link_sub5` | `{creatorId}` |
|
|
|
|
## 12. 보안과 데이터 취급
|
|
|
|
- 공유 메시지에는 기존 채널 공유와 동일하게 공개 가능한 채널 nickname과 OneLink URL만 포함한다.
|
|
- 토큰, 인증 헤더, 개인정보를 공유 메시지나 로그에 포함하지 않는다.
|
|
- 새 네트워크 요청을 추가하지 않는다.
|
|
|
|
## 13. 성능과 품질 요구사항
|
|
|
|
- 공유 버튼 또는 메뉴 항목 탭 한 번으로 iOS 공유 시트가 표시되어야 한다.
|
|
- 기존 팔로우/알림/차단/신고 title bar 및 더보기 흐름을 회귀시키지 않는다.
|
|
- 테스트 타깃이 없는 현재 저장소 상태를 고려해, 구현 시 focused 빌드와 수동 검증을 완료 증거로 기록한다.
|
|
|
|
## 14. 성공 기준
|
|
|
|
### 14.1 기능 수용 기준
|
|
|
|
- [ ] 내 채널 title bar에서 `ic_audio_content_share` 버튼을 탭하면 공유 시트가 열린다. (`CCSHARE-001`, `CCSHARE-002`)
|
|
- [ ] 다른 사람 채널 더보기 메뉴 최상단 `채널 공유`를 탭하면 공유 시트가 열린다. (`CCSHARE-003`~`CCSHARE-005`)
|
|
- [x] 공유 메시지와 OneLink 파라미터가 기존 `UserProfileViewModel.shareChannel` 기준과 일치한다. (`CCSHARE-006`)
|
|
- [x] OneLink 생성 실패 시 기존 실패 popup과 동일한 피드백이 표시된다. (`CCSHARE-007`)
|
|
|
|
### 14.2 UI/UX 수용 기준
|
|
|
|
- [x] 내 채널 공유 버튼은 우측 상단 title bar에 직접 노출된다.
|
|
- [x] 다른 사람 채널 메뉴에서 `채널 공유`는 최상단에 표시된다.
|
|
- [x] 기존 차단/신고 메뉴 항목과 동작은 유지된다.
|
|
|
|
### 14.3 추적성 완료 기준
|
|
|
|
- [x] 모든 확정 요구사항이 `plan-task.md`의 Task와 연결된다.
|
|
- [x] 구현 전 코드 변경 범위가 `SodaLive/Sources/V2/CreatorChannel/**`, `SodaLive/Sources/Report/ProfileReportMenuView.swift`, `SodaLive/Sources/I18n/I18n.swift` 중심인지 확인한다.
|
|
|
|
## 15. Open Questions
|
|
|
|
| ID | 상태 | 결정 필요 사항 | 현재 권고 | 결정 주체 | 결정 기한/시점 | 영향 Goal |
|
|
|---|---|---|---|---|---|---|
|
|
| 없음 | 확정 | 추가 미결정 사항 없음 | 기존 공유 방식 재사용 | 사용자 | 2026-09-14 | 전체 |
|
|
|
|
## 16. 요구사항 추적표
|
|
|
|
| 요구사항 범위 | API Contract | 계획 Phase | Goal | 자동 검증 | 수동 검증 |
|
|
|---|---|---:|---|---|---|
|
|
| `CCSHARE-001~002` | 해당 없음 | 1 | `P1-T1`, `P1-T2` | 빌드 | 내 채널 공유 버튼 탭 |
|
|
| `CCSHARE-003~005` | 해당 없음 | 1 | `P1-T3` | 빌드 | 다른 사람 채널 더보기 공유 탭 |
|
|
| `CCSHARE-006~007` | 해당 없음 | 1 | `P1-T2`, `P1-GATE` | 코드 대조, 빌드 | 공유 메시지와 실패 popup 확인 |
|
|
|
|
## 17. Decision Log
|
|
|
|
| 날짜 | ID | 상태 | 결정 | 근거 | 영향 요구사항·계약·Goal |
|
|
|---|---|---|---|---|---|
|
|
| 2026-09-14 | `DEC-001` | 확정 | 기존 문서에 누적하지 않고 신규 문서 `docs/20260914_크리에이터_채널_공유/`를 만든다. | 사용자 선택 B | 전체 |
|
|
| 2026-09-14 | `DEC-002` | 확정 | 다른 사람 채널 더보기 메뉴의 `채널 공유` 항목은 최상단에 배치한다. | 사용자 선택 A | `CCSHARE-004`, `P1-T3` |
|
|
| 2026-09-14 | `DEC-003` | 확정 | 공유 구현은 기존 `UserProfileView`의 `ActivityViewController` 방식과 OneLink 파라미터를 재사용한다. | 사용자 요구사항, 기존 코드 확인 | `CCSHARE-002`, `CCSHARE-006` |
|
|
|
|
## 18. 변경 관리
|
|
|
|
- 공유 문구, 딥링크 파라미터, 메뉴 순서가 바뀌면 Decision Log에 정정 행을 추가한 뒤 요구사항과 `plan-task.md`를 갱신한다.
|
|
- 구현 중 테스트 타깃 또는 빌드 명령이 달라지면 `docs/agent-guides/build-test-verification.md` 확인 후 검증 기록에 실제 명령을 남긴다.
|