From 0d2032592fae13872090b40ae6593e3c53a89a20 Mon Sep 17 00:00:00 2001 From: heoseungjun Date: Tue, 2 Dec 2025 18:29:12 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20#334=20messaging=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ByeBoo-iOS/ByeBoo-iOS/App/AppDelegate.swift | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/ByeBoo-iOS/ByeBoo-iOS/App/AppDelegate.swift b/ByeBoo-iOS/ByeBoo-iOS/App/AppDelegate.swift index 9cf692bc..1bce5697 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/App/AppDelegate.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/App/AppDelegate.swift @@ -75,24 +75,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { extension AppDelegate: MessagingDelegate { - func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { - guard let fcmToken else { - return - } - - guard let notificationRepository = DIContainer.shared.resolve(type: DefaultNotificationRepository.self) else { - return - } - - Task { - do { - try await notificationRepository.updateToken(token: fcmToken) - } catch (let error) { - ByeBooLogger.error(error) - } - } - } - func application( _ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error From f087a0afb64418a1b3db78b4ecf9e60041e765ba Mon Sep 17 00:00:00 2001 From: heoseungjun Date: Tue, 2 Dec 2025 23:00:07 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20#334=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=A7=84=EC=9E=85=20=EC=8B=9C=20=ED=98=84?= =?UTF-8?q?=EC=9E=AC=20=EC=95=8C=EB=9E=8C=20=EC=88=98=EC=8B=A0=20=ED=97=88?= =?UTF-8?q?=EC=9A=A9=20=EC=83=81=ED=83=9C=20=ED=99=95=EC=9D=B8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Persistence/UserDefaultsKey.swift | 1 + .../Data/Repository/UsersRepository.swift | 20 +++++++++- .../Domain/DomainDependencyAssembler.swift | 4 ++ .../Domain/Interface/UsersInterface.swift | 1 + .../UseCase/CheckAlarmEnabledUseCase.swift | 23 +++++++++++ .../ViewController/MyPageViewController.swift | 39 ++++++++----------- .../MyPage/ViewModel/MyPageViewModel.swift | 20 ++++++++-- .../PresentationDependencyAssembler.swift | 6 ++- 8 files changed, 86 insertions(+), 28 deletions(-) create mode 100644 ByeBoo-iOS/ByeBoo-iOS/Domain/UseCase/CheckAlarmEnabledUseCase.swift diff --git a/ByeBoo-iOS/ByeBoo-iOS/Data/Persistence/UserDefaultsKey.swift b/ByeBoo-iOS/ByeBoo-iOS/Data/Persistence/UserDefaultsKey.swift index a1826dae..d9432c00 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Data/Persistence/UserDefaultsKey.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Data/Persistence/UserDefaultsKey.swift @@ -18,4 +18,5 @@ enum UserDefaultsKey: String, CaseIterable { case journeyStatus case fcmToken case hasEnterMyPage + case alarmEnabled } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Data/Repository/UsersRepository.swift b/ByeBoo-iOS/ByeBoo-iOS/Data/Repository/UsersRepository.swift index ff67c661..2700ce13 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Data/Repository/UsersRepository.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Data/Repository/UsersRepository.swift @@ -44,6 +44,8 @@ struct DefaultUsersRepository: UsersInterface { let _ = userDefaultsService.save(result.name, key: .userName) let _ = userDefaultsService.save(true, key: .isOnboardingCompleted) let _ = userDefaultsService.save(false, key: .hasEnterMyPage) + let _ = userDefaultsService.save(false, key: .alarmEnabled) + ByeBooLogger.debug("유저 정보 저장 완료") return result.toEntity() } @@ -111,7 +113,10 @@ struct DefaultUsersRepository: UsersInterface { UsersAPI.updateNotificationPermission, decodingType: AlarmEnabledResponseDTO.self ) - return result.alarmEnabled + let alarmEnabled = result.alarmEnabled + let _ = userDefaultsService.save(alarmEnabled, key: .alarmEnabled) + + return alarmEnabled } func checkHasEnterMyPage() -> Bool { @@ -124,6 +129,15 @@ struct DefaultUsersRepository: UsersInterface { } return hasEnterMyPage } + + var alarmEnabled: Bool { + get { + guard let alarmEnabled: Bool = userDefaultsService.load(key: .alarmEnabled) else { + return false + } + return alarmEnabled + } + } } final class MockUserRepository: UsersInterface { @@ -208,6 +222,10 @@ final class MockUserRepository: UsersInterface { func checkHasEnterMyPage() -> Bool { return true } + + var alarmEnabled: Bool { + return true + } } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Domain/DomainDependencyAssembler.swift b/ByeBoo-iOS/ByeBoo-iOS/Domain/DomainDependencyAssembler.swift index bc97f33a..66a926d7 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Domain/DomainDependencyAssembler.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Domain/DomainDependencyAssembler.swift @@ -151,5 +151,9 @@ struct DomainDependencyAssembler: DependencyAssembler { DIContainer.shared.register(type: CheckHasEnterMyPageUseCase.self) { _ in return DefaultCheckHasEnterMyPageUseCase(repository: userRepository) } + + DIContainer.shared.register(type: CheckAlarmEnabledUseCase.self) { _ in + return DefaultCheckAlarmEnabledUseCase(repository: userRepository) + } } } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Domain/Interface/UsersInterface.swift b/ByeBoo-iOS/ByeBoo-iOS/Domain/Interface/UsersInterface.swift index ae07146c..4a03ea33 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Domain/Interface/UsersInterface.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Domain/Interface/UsersInterface.swift @@ -22,4 +22,5 @@ protocol UsersInterface { func getLastJourneyType() -> JourneyType func updateNotificationPermission() async throws -> Bool func checkHasEnterMyPage() -> Bool + var alarmEnabled: Bool { get } } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Domain/UseCase/CheckAlarmEnabledUseCase.swift b/ByeBoo-iOS/ByeBoo-iOS/Domain/UseCase/CheckAlarmEnabledUseCase.swift new file mode 100644 index 00000000..ba12bb08 --- /dev/null +++ b/ByeBoo-iOS/ByeBoo-iOS/Domain/UseCase/CheckAlarmEnabledUseCase.swift @@ -0,0 +1,23 @@ +// +// CheckAlarmEnabledUseCase.swift +// ByeBoo-iOS +// +// Created by APPLE on 12/2/25. +// + +protocol CheckAlarmEnabledUseCase { + func execute() -> Bool +} + +struct DefaultCheckAlarmEnabledUseCase: CheckAlarmEnabledUseCase { + + private let repository: UsersInterface + + init(repository: UsersInterface) { + self.repository = repository + } + + func execute() -> Bool { + repository.alarmEnabled + } +} diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/MyPageViewController.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/MyPageViewController.swift index 0e13c2f8..60e036db 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/MyPageViewController.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/MyPageViewController.swift @@ -105,6 +105,7 @@ extension MyPageViewController { bindWithdrawResult() bindNotificationResult() bindHasEnterMyPage() + bindAlarmEnabled() } private func bindUserResult() { @@ -177,35 +178,29 @@ extension MyPageViewController { self?.rootView.noticeView.noticeSwitch.setOn(false, animated: false) return } - self?.checkNoticeAuthorizationWhenFirst() - case .failure: - break + self?.viewModel.action(.checkAlarmEnabled) + case .failure(let error) : + ByeBooLogger.error(error) } } .store(in: &cancellables) } -} - -extension MyPageViewController { - @objc - private func checkNoticeAuthorizationWhenFirst() { - UNUserNotificationCenter.current().getNotificationSettings { [weak self] settings in - guard let self else { return } - - let isOn: Bool - switch settings.authorizationStatus { - case .authorized, .provisional, .ephemeral: - isOn = true - default: - isOn = false - } - beforeNotificationStatus = isOn - DispatchQueue.main.async { - self.rootView.noticeView.noticeSwitch.setOn(isOn, animated: false) + private func bindAlarmEnabled() { + viewModel.output.alarmEnabledResult + .sink { [weak self] result in + switch result { + case .success(let alarmEnabled): + self?.rootView.noticeView.noticeSwitch.setOn(alarmEnabled, animated: true) + case .failure(let error) : + ByeBooLogger.error(error) + } } - } + .store(in: &cancellables) } +} + +extension MyPageViewController { @objc private func checkNoticeAuthorizationWhenBack() { diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewModel/MyPageViewModel.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewModel/MyPageViewModel.swift index 4d3c266e..c76e2098 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewModel/MyPageViewModel.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewModel/MyPageViewModel.swift @@ -16,34 +16,39 @@ final class MyPageViewModel: ViewModelType { private var withdrawResultSubject: PassthroughSubject, Never> = .init() private var notificationResultSubject: PassthroughSubject, Never> = .init() private var hasEnterMyPageResultSubject: PassthroughSubject, Never> = .init() + private var alarmEnabledResultSubject: PassthroughSubject, Never> = .init() private(set) var output: Output private let getUserNameUseCase: GetUserNameUseCase private let logoutUseCase: LogoutUseCase private let withdrawUseCase: WithdrawUseCase - private let checkHasEnterMyPageUseCase: CheckHasEnterMyPageUseCase private let changeNotificationPermissionUseCase: ChangeNotificationPermissionUseCase + private let checkHasEnterMyPageUseCase: CheckHasEnterMyPageUseCase + private let checkAlarmEnabledUseCase: CheckAlarmEnabledUseCase init( getUserNameUseCase: GetUserNameUseCase, logoutUseCase: LogoutUseCase, withdrawUseCase: WithdrawUseCase, changeNotificationPermissionUseCase: ChangeNotificationPermissionUseCase, - checkHasEnterMyPageUseCase: CheckHasEnterMyPageUseCase + checkHasEnterMyPageUseCase: CheckHasEnterMyPageUseCase, + checkAlarmEnabledUseCase: CheckAlarmEnabledUseCase ) { self.getUserNameUseCase = getUserNameUseCase self.logoutUseCase = logoutUseCase self.withdrawUseCase = withdrawUseCase self.changeNotificationPermissionUseCase = changeNotificationPermissionUseCase self.checkHasEnterMyPageUseCase = checkHasEnterMyPageUseCase + self.checkAlarmEnabledUseCase = checkAlarmEnabledUseCase output = Output( userResult: userResultSubject.eraseToAnyPublisher(), logoutResult: logoutResultSubject.eraseToAnyPublisher(), withdrawResult: withdrawResultSubject.eraseToAnyPublisher(), notificationResult: notificationResultSubject.eraseToAnyPublisher(), - hasEnterMyPageResult: hasEnterMyPageResultSubject.eraseToAnyPublisher() + hasEnterMyPageResult: hasEnterMyPageResultSubject.eraseToAnyPublisher(), + alarmEnabledResult: alarmEnabledResultSubject.eraseToAnyPublisher() ) } @@ -59,6 +64,8 @@ final class MyPageViewModel: ViewModelType { changeNotificationPermission() case .checkHasEnterMyPage: checkHasEnterMyPage() + case .checkAlarmEnabled: + checkAlarmEnabled() } } } @@ -70,6 +77,7 @@ extension MyPageViewModel { case withdrawActionButtonDidTap case notificationSwitchDidTap case checkHasEnterMyPage + case checkAlarmEnabled } struct Output { @@ -78,6 +86,7 @@ extension MyPageViewModel { let withdrawResult: AnyPublisher, Never> let notificationResult: AnyPublisher, Never> let hasEnterMyPageResult: AnyPublisher, Never> + let alarmEnabledResult: AnyPublisher, Never> } } @@ -136,4 +145,9 @@ extension MyPageViewModel { let result = checkHasEnterMyPageUseCase.execute() hasEnterMyPageResultSubject.send(.success(result)) } + + private func checkAlarmEnabled() { + let result = checkAlarmEnabledUseCase.execute() + alarmEnabledResultSubject.send(.success(result)) + } } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/PresentationDependencyAssembler.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/PresentationDependencyAssembler.swift index 002cc6ae..b0dc887d 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/PresentationDependencyAssembler.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/PresentationDependencyAssembler.swift @@ -153,7 +153,8 @@ struct PresentationDependencyAssembler: DependencyAssembler { let logoutUseCase = container.resolve(type: LogoutUseCase.self), let withdrawUseCase = container.resolve(type: WithdrawUseCase.self), let changeNotificationPermissionUseCase = container.resolve(type: ChangeNotificationPermissionUseCase.self), - let checkHasEnterMyPageUseCase = container.resolve(type: CheckHasEnterMyPageUseCase.self) + let checkHasEnterMyPageUseCase = container.resolve(type: CheckHasEnterMyPageUseCase.self), + let checkAlarmEnabledUseCase = container.resolve(type: CheckAlarmEnabledUseCase.self) else { ByeBooLogger.error(ByeBooError.DIFailedError) return @@ -164,7 +165,8 @@ struct PresentationDependencyAssembler: DependencyAssembler { logoutUseCase: logoutUseCase, withdrawUseCase: withdrawUseCase, changeNotificationPermissionUseCase: changeNotificationPermissionUseCase, - checkHasEnterMyPageUseCase: checkHasEnterMyPageUseCase + checkHasEnterMyPageUseCase: checkHasEnterMyPageUseCase, + checkAlarmEnabledUseCase: checkAlarmEnabledUseCase ) }