Conversation
There was a problem hiding this comment.
Pull request overview
온보딩 플로우를 실제 페이지 기반 UI로 교체하고(Pager), 앱 전반 텍스트 폰트를 Paperlogy 커스텀 폰트로 전환하기 위한 PR입니다. 멀티플랫폼(UIKit/AppKit) 지원을 위해 스플래시 비디오/온보딩 이미지 렌더링도 분기 처리되었습니다.
Changes:
- 온보딩 화면을 6개 페이지(TabView .page) + 마지막 CTA 버튼 구조로 추가/연결
- Paperlogy 폰트 리소스 추가 및 AppFont를 커스텀 폰트 API로 변경(등록 로직 포함)
- 스플래시/온보딩 이미지 표시를 UIKit/AppKit 양쪽에서 동작하도록 분기 처리 및 관련 프로젝트 설정 업데이트
Reviewed changes
Copilot reviewed 30 out of 54 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| KillingPart/Views/Screens/Splash/SplashView.swift | UIKit/AppKit 분기 추가 및 macOS용 AVPlayerLayer 뷰 구현 |
| KillingPart/Views/Screens/RootFlowView.swift | onboarding 라우팅을 OnboardingContainerView로 변경 |
| KillingPart/Views/Screens/Onboarding/OnboardingContainerView.swift | 페이지형 온보딩 컨테이너/진행 표시/CTA 구성 |
| KillingPart/Views/Screens/Onboarding/Pages/OnboardingPage1View.swift | 온보딩 1페이지 추가 |
| KillingPart/Views/Screens/Onboarding/Pages/OnboardingPage2View.swift | 온보딩 2페이지 추가 |
| KillingPart/Views/Screens/Onboarding/Pages/OnboardingPage3View.swift | 온보딩 3페이지 추가 |
| KillingPart/Views/Screens/Onboarding/Pages/OnboardingPage4View.swift | 온보딩 4페이지 추가 |
| KillingPart/Views/Screens/Onboarding/Pages/OnboardingPage5View.swift | 온보딩 5페이지 추가 |
| KillingPart/Views/Screens/Onboarding/Pages/OnboardingPage6View.swift | 온보딩 6페이지(마지막 문구) 추가 |
| KillingPart/Views/Screens/Onboarding/OnboardingView.swift | 기존 임시 온보딩 뷰 제거 |
| KillingPart/Views/Screens/Onboarding/Components/OnboardingImageCardView.swift | 온보딩 이미지 카드(UIKit/AppKit 로딩) 추가 |
| KillingPart/Views/Screens/Onboarding/Components/OnboardingProgressView.swift | 진행 표시 컴포넌트 추가 |
| KillingPart/Views/Screens/Onboarding/Components/OnboardingSkipButton.swift | 스킵 버튼 컴포넌트 추가 |
| KillingPart/Views/Screens/Onboarding/Components/OnboardingNextButton.swift | 다음 버튼 컴포넌트 추가 |
| KillingPart/Views/Screens/Main/MainTabView.swift | 메인 탭 텍스트 폰트 Paperlogy로 변경 |
| KillingPart/Views/Screens/Auth/LoginView.swift | 로그인 타이틀 폰트 Paperlogy로 변경 |
| KillingPart/Views/Components/PrimaryButton.swift | 버튼 폰트 Paperlogy로 변경 |
| KillingPart/Resources/Fonts/AppFont.swift | Paperlogy 폰트 등록/사용 API로 변경 |
| KillingPart/KillingPartApp.swift | 앱 초기화 시 Paperlogy 폰트 등록 호출 |
| KillingPart/Info.plist | UIAppFonts에 Paperlogy 폰트 파일 등록 |
| KillingPart/KillingPart.entitlements | entitlements 내용을 빈 dict로 변경 |
| KillingPart/Assets.xcassets/kpGray600.colorset/Contents.json | 신규 컬러 에셋 추가 |
| KillingPart/Assets.xcassets/kpGray300.colorset/Contents.json | 신규 컬러 에셋 추가 |
| KillingPart/Assets.xcassets/Onboarding/** | 온보딩 이미지 에셋 추가 |
| KillingPart.xcodeproj/project.pbxproj | Info.plist 지정, 샌드박스/빌드 설정 등 프로젝트 설정 업데이트 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <plist version="1.0"> | ||
| <dict> | ||
| <key>com.apple.security.app-sandbox</key> | ||
| <true/> | ||
| <key>com.apple.security.files.user-selected.read-only</key> | ||
| <true/> | ||
| </dict> | ||
| <dict/> |
There was a problem hiding this comment.
macOS 샌드박스 관련 entitlement 키들이 entitlements 파일에서 제거되어() 실제 코드사인 entitlement가 기대와 다르게 빠질 수 있습니다. 빌드 설정(ENABLE_APP_SANDBOX/ENABLE_USER_SELECTED_FILES)로 자동 주입을 의도한 것이라도, 팀에서 사용하는 배포/CI 환경에서 동일하게 적용되는지 확인하거나 기존 키를 entitlements 파일에 유지하는 쪽이 안전합니다.
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "onboarding)5.png", |
There was a problem hiding this comment.
onboarding_5.imageset의 1x 파일명이 "onboarding)5.png"로 되어 있어 다른 스케일 파일명 규칙(onboarding_5.png)과 불일치합니다. 의도된 것이 아니라면 리소스 파일명/Contents.json을 정리해 두는 편이 추후 관리(교체/자동 스크립트/디자이너 전달)에서 안전합니다.
| "filename" : "onboarding)5.png", | |
| "filename" : "onboarding_5.png", |
| func makeNSView(context: Context) -> SplashPlayerNSView { | ||
| let view = SplashPlayerNSView() | ||
| view.playerLayer.videoGravity = .resizeAspectFill | ||
| view.playerLayer.player = player | ||
| return view |
There was a problem hiding this comment.
macOS(AppKit) 경로에서 makeNSView에서 view.playerLayer에 접근하기 전에 wantsLayer가 아직 true가 아니라 layer가 nil일 수 있어 강제 캐스팅(layer as! AVPlayerLayer)에서 크래시가 날 수 있습니다. makeNSView에서 wantsLayer = true를 먼저 설정하거나(NSView 초기화 시점/override init), playerLayer를 안전하게 준비한 뒤에 videoGravity/player를 설정하도록 수정하세요.
| .overlay { | ||
| if shouldShowSwipeHint { | ||
| HStack { | ||
| swipeHintArrow(systemName: "chevron.left") | ||
| Spacer() | ||
| swipeHintArrow(systemName: "chevron.right") | ||
| } | ||
| .padding(.horizontal, AppSpacing.s) | ||
| .allowsHitTesting(false) | ||
| } |
There was a problem hiding this comment.
스와이프 힌트용 화살표 오버레이가 VoiceOver에 노출될 수 있습니다(allowsHitTesting(false)만으로는 접근성 제외가 되지 않음). 시각적 힌트라면 overlay 컨테이너 또는 각 Image에 accessibilityHidden(true)를 적용해 보조기기 사용자에게 불필요한 포커싱이 가지 않도록 해주세요.
| Text("이제 첫번째 **킬링파트**를 기록할 시간이예요!") | ||
| .font(AppFont.paperlogy5Medium(size: 30)) |
There was a problem hiding this comment.
문구 오타/띄어쓰기: "첫번째" → "첫 번째", "시간이예요" → "시간이에요"가 자연스러운 표기입니다(사용자 노출 문자열).
| struct OnboardingSkipButton: View { | ||
| let action: () -> Void | ||
|
|
||
| var body: some View { | ||
| Button { | ||
| action() | ||
| } label: { | ||
| Text("건너뛰기") | ||
| .font(.system(size: 14, weight: .medium)) | ||
| .foregroundStyle(.secondary) | ||
| } | ||
| .buttonStyle(.plain) | ||
| } |
There was a problem hiding this comment.
OnboardingSkipButton이 현재 코드베이스에서 참조되지 않습니다(검색 결과 정의 파일 외 사용처 없음). 실제 온보딩 플로우에서 사용할 계획이 없다면 불필요한 코드이므로 제거하고, 사용할 계획이면 OnboardingContainerView 등에 연결해 사용처가 명확해지도록 해주세요.
| struct OnboardingNextButton: View { | ||
| let action: () -> Void | ||
|
|
||
| var body: some View { | ||
| PrimaryButton(title: "다음") { | ||
| action() | ||
| } | ||
| } |
There was a problem hiding this comment.
OnboardingNextButton이 현재 코드베이스에서 참조되지 않습니다(검색 결과 정의 파일 외 사용처 없음). 실제로 사용할 컴포넌트라면 OnboardingContainerView에 연결하고, 아니라면 중복 컴포넌트(PrimaryButton 래핑)로 남지 않도록 제거하는 편이 유지보수에 좋습니다.
| GENERATE_INFOPLIST_FILE = YES; | ||
| INFOPLIST_FILE = KillingPart/Info.plist; | ||
| INFOPLIST_KEY_CFBundleDisplayName = "킬링파트"; |
There was a problem hiding this comment.
커스텀 Info.plist(KillingPart/Info.plist)를 추가했는데, 타겟 설정에서 GENERATE_INFOPLIST_FILE = YES가 그대로라 생성된 Info.plist가 사용되면서 파일의 UIAppFonts 설정이 반영되지 않을 수 있습니다. 커스텀 plist를 사용할 의도라면 GENERATE_INFOPLIST_FILE를 NO로 전환하거나(권장), 생성 plist에 UIAppFonts를 포함시키는 방식으로 정리해 주세요.
작업내용