Conversation
* feat(FCM): FCM Token 발급 및 등록/삭제 API 연동 * fix(FCM): 기존 컨벤션 적용 * fix(fcm): 테스트버전 체크
* feat(Google): 구글로그인 추가 * feat(1.1.10): 버전 업데이트
* fix(ProfileCard): Tag, StatItem FixedSize Added * feat(Settings): 프로필 설정 섹션 -> 프로필 페이지로 마이그레이션 * feat(Setting): 디자인 업데이트 * feat(Setting): NameEdit, TagEdit UI Update and SettingsView Space Added * feat(Block): Block Api Settings * feat(Blocklist): 차단 목록 추가 및 차단 해제 API 추가 및 연동 및 페이지 추가 * feat: 다이얼로그, 바텀시트 디자인 업데이트 * feat(AppInfo,Account): 앱 정보 섹션 및 계정 섹션 추가 * feat(Settings): 카드 크기 동일하게 구현 * feat(Survey): 문의 카드 추가 * feat(Survey): 문의 카드 디자인 개선 * feat(Notification): 알림설정 추가 * feat(Settings): 차단리스트, 이름설정, 프로필이미지, 태그설정 페이지 헤더 크기 줄이기 * feat(Noti): 알림카드 세로여백 조정
There was a problem hiding this comment.
Pull request overview
Release 1.2.0에 맞춰 설정 화면을 리뉴얼하고(프로필 수정/알림/피드백/약관/웹사이트/계정/차단관리), 소셜 피드에서 유저 차단 및 차단 목록/해제 플로우를 추가했으며, Google 로그인과 FCM 연동(토큰 등록/삭제, 수신 처리)까지 포함한 업데이트입니다.
Changes:
- 설정 화면 전면 리뉴얼(프로필 수정 서브페이지, 알림 토글, 피드백 전송, 약관/개인정보처리방침, 차단 목록 등) 및 기존 프로필 설정 화면 제거
- 유저 차단/차단목록 조회/차단해제 API 및 UI 연동(피드 메뉴에서 차단, 설정에서 차단목록 관리)
- Google 로그인 추가 및 Firebase Messaging 기반 FCM 토큰 등록/삭제/알림 수신 처리 추가
Reviewed changes
Copilot reviewed 50 out of 54 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| KillingPartTests/InitialSetupFlowTests.swift | UserServicing 프로토콜 확장에 맞춰 테스트 Mock 업데이트 |
| KillingPart/Views/Screens/Setup/components/PolicyDocumentView.swift | 약관/개인정보 전문 표시 뷰를 재사용 가능 컴포넌트로 분리 |
| KillingPart/Views/Screens/Setup/components/PolicyDocumentContent.swift | 약관/방침 텍스트 일부(부칙/시행일) 제거 및 정리 |
| KillingPart/Views/Screens/Setup/components/PolicyAgreementScreen.swift | 약관 전문 시트를 신규 PolicyDocumentView로 교체 |
| KillingPart/Views/Screens/Main/Social/FeedSection/FeedSectionView.swift | 피드 상태 변화 시 인덱스 리셋/보정 및 차단 액션 연결 |
| KillingPart/Views/Screens/Main/Social/FeedSection/Components/SocialFeedPageCardView.swift | 피드 메뉴에 “차단하기” 액션 추가 |
| KillingPart/Views/Screens/Main/Randoms/RandomSearchView.swift | 랜덤 피드 탐색 화면 신규 추가 |
| KillingPart/Views/Screens/Main/My/MyCollection/Settings/SettingsView.swift | 설정 메인 UI(프로필/차단관리/알림/앱정보/계정/피드백/로그아웃/탈퇴) 신규 구현 |
| KillingPart/Views/Screens/Main/My/MyCollection/Settings/ServiceTermView.swift | 설정에서 약관 화면 진입용 래퍼 뷰 추가 |
| KillingPart/Views/Screens/Main/My/MyCollection/Settings/ProfileSettings/TagEdit.swift | 태그 변경 서브페이지 신규 추가 |
| KillingPart/Views/Screens/Main/My/MyCollection/Settings/ProfileSettings/ProfileImageEdit.swift | 프로필 이미지 변경/삭제 서브페이지 신규 추가 |
| KillingPart/Views/Screens/Main/My/MyCollection/Settings/ProfileSettings/NameEdit.swift | 이름 변경 서브페이지 및 공용 헤더 컴포넌트 추가 |
| KillingPart/Views/Screens/Main/My/MyCollection/Settings/PrivacyPolicyView.swift | 설정에서 개인정보처리방침 화면 진입용 래퍼 뷰 추가 |
| KillingPart/Views/Screens/Main/My/MyCollection/Settings/BlocklistView.swift | 차단 목록 조회/검색/페이지네이션/차단해제 UI 신규 추가 |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/ProfileSettingSection.swift | 기존 프로필 설정 섹션 제거(설정 화면으로 대체) |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/components/MyCollectionProfileTagSectionView.swift | 기존 프로필 설정 하위 컴포넌트 제거 |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/components/MyCollectionProfileTagEditActionRowView.swift | 기존 프로필 설정 하위 컴포넌트 제거 |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/components/MyCollectionProfileSettingsInfoRowView.swift | 기존 프로필 설정 하위 컴포넌트 제거 |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/components/MyCollectionProfileSettingsInfoCardView.swift | 기존 프로필 설정 하위 컴포넌트 제거 |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/components/MyCollectionProfileSettingsHeaderView.swift | 기존 프로필 설정 하위 컴포넌트 제거 |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/components/MyCollectionProfileSettingPageContainerView.swift | 기존 프로필 설정 하위 컴포넌트 제거 |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/components/MyCollectionProfileImageColumnView.swift | 기존 프로필 설정 하위 컴포넌트 제거 |
| KillingPart/Views/Screens/Main/My/MyCollection/ProfileSetting/components/MyCollectionAccountActionButton.swift | 기존 프로필 설정 하위 컴포넌트 제거 |
| KillingPart/Views/Screens/Main/My/MyCollection/MyCollectionView.swift | 설정 화면으로 네비게이션 전환(기존 screenMode/transition 제거) |
| KillingPart/Views/Screens/Main/My/MyCollection/Components/ProfileCard/MyCollectionProfileStatItemView.swift | 프로필 통계 텍스트 레이아웃 안정화(lineLimit/fixedSize) |
| KillingPart/Views/Screens/Main/My/MyCollection/Components/ProfileCard/MyCollectionProfileCard.swift | 태그 영역 레이아웃 조정 및 버튼 영역 fixedSize 적용 |
| KillingPart/Views/Screens/Main/My/MyCollection/Components/ProfileCard/MyCollectionEditProfileButton.swift | 프로필 편집 버튼을 “설정” 버튼으로 변경 |
| KillingPart/Views/Screens/Auth/LoginView.swift | Google 로그인 버튼 추가 및 Demo 로그인 UI 주석 처리 |
| KillingPart/Views/Screens/Auth/Components/GoogleLoginButton.swift | Google 로그인 버튼 컴포넌트 신규 추가 |
| KillingPart/ViewModels/Social/FeedViewModel.swift | 차단 요청 상태/의존성 추가 및 blockUser 로직 구현 |
| KillingPart/ViewModels/My/MyCollection/Settings/SettingsViewModel.swift | 피드백 전송/알림 설정 조회·변경 뷰모델 신규 추가 |
| KillingPart/ViewModels/My/MyCollection/Settings/ProfileSettings/ProfileSettingViewModel.swift | 이름 드래프트/변경 로직 추가 및 태그/이름 정규화·검증 로직 정리 |
| KillingPart/ViewModels/My/MyCollection/Settings/BlocklistViewModel.swift | 차단 목록 조회/검색/페이지네이션/해제 로직 신규 추가 |
| KillingPart/ViewModels/LoginViewModel.swift | Google 로그인 플로우 추가 |
| KillingPart/ViewModels/AppViewModel.swift | 로그인 성공 시 FCM 토큰 등록 트리거 추가 |
| KillingPart/Services/UserService.swift | 차단/차단목록 조회/차단해제 API 추가 |
| KillingPart/Services/SurveyService.swift | 피드백(설문) 전송 API 신규 추가 |
| KillingPart/Services/NotificationService.swift | 알림 설정 조회/변경 API 신규 추가 |
| KillingPart/Services/FCMService.swift | FCM 토큰 등록/삭제 API 신규 추가 |
| KillingPart/Services/FCMManager.swift | FCM 토큰 수신/보류 토큰 등록/알림 탭 처리 매니저 신규 추가 |
| KillingPart/Services/AuthService.swift | GoogleSignIn 기반 구글 로그인 구현 추가 |
| KillingPart/Services/AuthenticationService.swift | 서버 Google OAuth 로그인 엔드포인트 및 로그아웃 시 FCM 토큰 삭제 추가 |
| KillingPart/Services/AppDelegate.swift | Firebase 초기화/알림 권한 요청/APNs·FCM delegate 처리 신규 추가 |
| KillingPart/Models/AuthModel.swift | Google 로그인 요청 모델 추가 |
| KillingPart/KillingPartApp.swift | AppDelegate 연결 및 GoogleSignIn URL 핸들링 추가 |
| KillingPart/KillingPart.entitlements | Push entitlement 추가/변경 |
| KillingPart/Info.plist | Firebase/GoogleSignIn/remote-notification 설정 추가 및 URL scheme 업데이트 |
| KillingPart/GoogleService-Info.plist | Firebase 설정 plist 신규 추가 |
| KillingPart/Assets.xcassets/ic_google.imageset/Contents.json | Google 아이콘 에셋 추가 |
| KillingPart.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved | Firebase/GoogleSignIn SPM 의존성 추가 |
| KillingPart.xcodeproj/project.pbxproj | 버전 업데이트(1.2.0) 및 SPM 의존성/빌드 설정 반영 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+6
to
+12
| <string>development</string> | ||
| <key>com.apple.developer.applesignin</key> | ||
| <array> | ||
| <string>Default</string> | ||
| </array> | ||
| <key>com.apple.developer.aps-environment</key> | ||
| <string>development</string> |
| <key>CFBundleURLSchemes</key> | ||
| <array> | ||
| <string>kakao$(KAKAO_NATIVE_APP_KEY)</string> | ||
| <string>com.googleusercontent.apps.619615909665-c9j3gs1vqmvi64rhb9i9ikg6dnpdghc0</string> |
Comment on lines
+47
to
+52
| <key>FirebaseAppDelegateProxyEnabled</key> | ||
| <false/> | ||
| <key>GIDClientID</key> | ||
| <string>619615909665-c9j3gs1vqmvi64rhb9i9ikg6dnpdghc0.apps.googleusercontent.com</string> | ||
| <key>GIDServerClientID</key> | ||
| <string>619615909665-o6l3i6de7i7l1msfjrvl9qu43scp08bj.apps.googleusercontent.com</string> |
| didReceiveRemoteNotification userInfo: [AnyHashable: Any], | ||
| fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void | ||
| ) { | ||
| print("[FCM][Background] 원격 알림 수신 — payload: \(userInfo)") |
| print("[FCM][4] ⚠️ APNs 토큰 nil") | ||
| } | ||
|
|
||
| print("[FCM][4] FCM 토큰: \(token)") |
Comment on lines
+221
to
+224
| Text("\(user.displayName)님을 차단 해제 할까요?") | ||
| .font(AppFont.paperlogy6SemiBold(size: 18)) | ||
| .foregroundStyle(.white) | ||
| .multilineTextAlignment(.center) |
Comment on lines
+57
to
+63
| Text("2~16자, 한글/영문/숫자 사용 가능") | ||
| .font(AppFont.paperlogy4Regular(size: 12)) | ||
| .foregroundStyle(.white.opacity(0.55)) | ||
|
|
||
| if let validation = viewModel.validateName(viewModel.nameDraft), !viewModel.nameDraft.isEmpty { | ||
| Text(validation) | ||
| .font(AppFont.paperlogy4Regular(size: 12)) |
Comment on lines
+353
to
+365
| Toggle( | ||
| "", | ||
| isOn: Binding( | ||
| get: { settingsViewModel.isNotificationEnabled }, | ||
| set: { newValue in | ||
| Task { | ||
| await settingsViewModel.updateNotificationSetting(newValue) | ||
| } | ||
| } | ||
| ) | ||
| ) | ||
| .labelsHidden() | ||
| .tint(Color.kpPrimary) |
Comment on lines
+70
to
+97
| // Button(action: viewModel.loginWithTester) { | ||
| // ZStack { | ||
| // Text("체험하기(Demo)") | ||
| // .font(AppFont.paperlogy5Medium(size: 14)) | ||
| // .opacity( | ||
| // viewModel.isLoading | ||
| // && viewModel.activeSocialLoginProvider == .tester ? 0 : 1 | ||
| // ) | ||
| // | ||
| // if viewModel.isLoading | ||
| // && viewModel.activeSocialLoginProvider == .tester { | ||
| // ProgressView() | ||
| // .tint(.white) | ||
| // } | ||
| // } | ||
| // .foregroundStyle(.white) | ||
| // .padding(.horizontal, AppSpacing.l) | ||
| // .padding(.vertical, AppSpacing.s) | ||
| // .background(Color.white.opacity(0.16)) | ||
| // .clipShape(RoundedRectangle(cornerRadius: 14, style: .continuous)) | ||
| // .overlay { | ||
| // RoundedRectangle(cornerRadius: 14, style: .continuous) | ||
| // .stroke(Color.white.opacity(0.28), lineWidth: 1) | ||
| // } | ||
| // } | ||
| // .buttonStyle(.plain) | ||
| // .disabled(viewModel.isLoading) | ||
| // .accessibilityLabel("체험하기") |
Comment on lines
3
to
15
| struct MyCollectionEditProfileButton: View { | ||
| let action: () -> Void | ||
|
|
||
| var body: some View { | ||
| Button(action: action) { | ||
| HStack(alignment:.center,spacing: 6) { | ||
| Image(systemName: "square.and.pencil") | ||
| Image(systemName: "gearshape") | ||
| .font(.system(size: 14, weight: .semibold)) | ||
| .foregroundStyle(Color.kpPrimary) | ||
|
|
||
| Text("프로필 편집") | ||
| Text("설정") | ||
| .font(AppFont.paperlogy5Medium(size: 14)) | ||
| .foregroundStyle(Color.kpPrimary) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
업데이트 내용