diff --git a/Atcha-iOS.xcodeproj/project.pbxproj b/Atcha-iOS.xcodeproj/project.pbxproj index 2e92916..d83766f 100644 --- a/Atcha-iOS.xcodeproj/project.pbxproj +++ b/Atcha-iOS.xcodeproj/project.pbxproj @@ -2468,7 +2468,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 23SCTLK482; FRAMEWORK_SEARCH_PATHS = ( @@ -2491,7 +2491,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.7; + MARKETING_VERSION = 1.8; PRODUCT_BUNDLE_IDENTIFIER = com.atcha.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2515,7 +2515,7 @@ CODE_SIGN_ENTITLEMENTS = "Atcha-iOS/Atcha-iOS.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 23SCTLK482; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ( @@ -2538,7 +2538,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.7; + MARKETING_VERSION = 1.8; OTHER_SWIFT_FLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = com.atcha.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2563,7 +2563,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 23SCTLK482; FRAMEWORK_SEARCH_PATHS = ( @@ -2586,7 +2586,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.7; + MARKETING_VERSION = 1.8; PRODUCT_BUNDLE_IDENTIFIER = com.atcha.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/Atcha-iOS/Core/Manager/AlarmManager.swift b/Atcha-iOS/Core/Manager/AlarmManager.swift index 2a2fa3b..765aab0 100644 --- a/Atcha-iOS/Core/Manager/AlarmManager.swift +++ b/Atcha-iOS/Core/Manager/AlarmManager.swift @@ -102,6 +102,9 @@ final class AlarmManager { /// 완전 정지: 예약/타이머/진동/알림/오디오 모두 끊기 func stopAlarm(keepSilent: Bool = false) { + autoStopWorkItem?.cancel() + autoStopWorkItem = nil + shouldKeepBackgroundAudio = false pendingStartWorkItem?.cancel() pendingStartWorkItem = nil diff --git a/Atcha-iOS/Presentation/Course/CourseSearch/CourseSearchViewController.swift b/Atcha-iOS/Presentation/Course/CourseSearch/CourseSearchViewController.swift index 1f59d7f..4ce2ca0 100644 --- a/Atcha-iOS/Presentation/Course/CourseSearch/CourseSearchViewController.swift +++ b/Atcha-iOS/Presentation/Course/CourseSearch/CourseSearchViewController.swift @@ -65,6 +65,7 @@ final class CourseSearchViewController: BaseViewController Void)? diff --git a/Atcha-iOS/Presentation/Lock/LockViewController.swift b/Atcha-iOS/Presentation/Lock/LockViewController.swift index 14bcac8..e78ccaa 100644 --- a/Atcha-iOS/Presentation/Lock/LockViewController.swift +++ b/Atcha-iOS/Presentation/Lock/LockViewController.swift @@ -142,6 +142,7 @@ final class LockViewController: BaseViewController { @objc private func startTapped() { viewModel.cancelLockScreenTimer() AlarmManager.shared.stopAlarm() + AlarmManager.shared.removeAllAlarmNotificationsExceptAutoStop() let wrapper = UserDefaultsWrapper.shared let legInfo = wrapper.object(forKey: UserDefaultsWrapper.Key.legInfo.rawValue, of: LegInfo.self) diff --git a/Atcha-iOS/Presentation/Main/MainCoordinator.swift b/Atcha-iOS/Presentation/Main/MainCoordinator.swift index d623a22..40c8429 100644 --- a/Atcha-iOS/Presentation/Main/MainCoordinator.swift +++ b/Atcha-iOS/Presentation/Main/MainCoordinator.swift @@ -241,6 +241,10 @@ final class MainCoordinator { self.navigationController.pushViewController(modifyVC, animated: true) case .detailRoute(let address, let infos, let context): + if navigationController.topViewController is DetailRouteViewController { + print("이미 상세 경로 화면입니다. 중복 push를 방지합니다.") + return + } let routeDI = diContainer.makeRouteDIContainer() let vm = routeDI.makeDetailRouteViewModel(address: address, infos: infos, context: context) let vc = routeDI.makeDetailRouteViewController(viewModel: vm) @@ -367,7 +371,7 @@ extension UINavigationController { UIView.performWithoutAnimation { if let target = viewControllers.first(where: { $0 is MainViewController }) { popToViewController(target, animated: true) - } else { + } else { popToRootViewController(animated: true) } } diff --git a/Atcha-iOS/Presentation/Onboarding/HomeRegister/HomeRegisterViewModel.swift b/Atcha-iOS/Presentation/Onboarding/HomeRegister/HomeRegisterViewModel.swift index 5f3e0eb..4ae976a 100644 --- a/Atcha-iOS/Presentation/Onboarding/HomeRegister/HomeRegisterViewModel.swift +++ b/Atcha-iOS/Presentation/Onboarding/HomeRegister/HomeRegisterViewModel.swift @@ -51,28 +51,35 @@ final class HomeRegisterViewModel: BaseViewModel { private func setupInitialState() { let defaults = UserDefaultsWrapper.shared + // 1. 이름과 주소가 이미 있다면 (직접 등록했던 유저) 바로 표시 if let buildingName = defaults.string(forKey: UserDefaultsWrapper.Key.buildingName.rawValue), let address = defaults.string(forKey: UserDefaultsWrapper.Key.homeAddress.rawValue) { self.selectedState = .selected(name: buildingName, address: address) - } else { - if let lat = defaults.double(forKey: UserDefaultsWrapper.Key.homeLat.rawValue), - let lon = defaults.double(forKey: UserDefaultsWrapper.Key.homeLon.rawValue) { - Task { - if let location = try? await fetchCurrentAddress(lat: lat, lon: lon) { - let name = location.name ?? "" - let address = location.address ?? "" - - defaults.set(name, forKey: UserDefaultsWrapper.Key.buildingName.rawValue) - defaults.set(address, forKey: UserDefaultsWrapper.Key.homeAddress.rawValue) - - await MainActor.run { - self.selectedState = .selected(name: name, address: address) - } + return + } + + // 2. 이름은 없지만 좌표는 있다면 (방금 로그인한 유저) + let lat = defaults.double(forKey: UserDefaultsWrapper.Key.homeLat.rawValue) + let lon = defaults.double(forKey: UserDefaultsWrapper.Key.homeLon.rawValue) + + if let lat, let lon, lat != 0.0 && lon != 0.0 { + // 이름이 없으니 좌표로 이름을 새로 따와서 채워주기 + Task { + if let location = try? await fetchCurrentAddress(lat: lat, lon: lon) { + let name = location.name ?? "" + let addr = location.address ?? "" + + // 따온 이름을 저장해두기 (다음엔 1번 조건에서 걸리도록) + defaults.set(name, forKey: UserDefaultsWrapper.Key.buildingName.rawValue) + defaults.set(addr, forKey: UserDefaultsWrapper.Key.homeAddress.rawValue) + + await MainActor.run { + self.selectedState = .selected(name: name, address: addr) } } - } else { - self.selectedState = LocationSelectionState.none } + } else { + self.selectedState = LocationSelectionState.none } }