From 08811a6c48daabd3c11e487ac9ccc34bdcb4085f Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Wed, 18 Mar 2026 22:07:24 +0900 Subject: [PATCH 01/14] =?UTF-8?q?[#405]=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=ED=98=B8=EC=B6=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(click=5Fpartner=5Frestaurant,=20review=5Fv1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Firebase/MapAnalyticsManager.swift | 10 +++++++++- .../MainMapViewController+Marker.swift | 9 +++++++++ .../ViewController/ReviewViewController.swift | 9 ++++----- .../ViewController/SetRateViewController.swift | 17 ++++++++++++++++- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift b/EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift index f178c53c..d4a40869 100644 --- a/EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift +++ b/EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift @@ -17,6 +17,7 @@ final class MapAnalyticsManager { private enum Event { static let clickMap = "click_map" + static let clickMapAll = "click_map_all" static let clickMapMine = "click_map_mine" static let clickPartnerRestaurant = "click_partner_restaurant" } @@ -37,7 +38,14 @@ final class MapAnalyticsManager { } /** - #2 지도 화면에서 '내 제휴' (또는 학과명) 버튼을 클릭했을 때 호출 + #2 지도 화면에서 '전체' 버튼을 클릭했을 때 호출 + */ + func logClickMapAll() { + AnalyticsService.logEvent(Event.clickMapAll) + } + + /** + #3 지도 화면에서 '내 제휴' (또는 학과명) 버튼을 클릭했을 때 호출 - Parameter collegeId: 사용자의 단과대 ID - Parameter majorId: 사용자의 학과 ID */ diff --git a/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController+Marker.swift b/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController+Marker.swift index b943aa9d..9204f2d9 100644 --- a/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController+Marker.swift +++ b/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController+Marker.swift @@ -147,6 +147,15 @@ extension MainMapViewController { /// 제휴점 상세 바텀시트 표시 func showPartnershipDetail(for partnership: PartnershipDTO) { + let partnerId = partnership.partnershipInfos.first?.id + if let partnerId = partnerId { + MapAnalyticsManager.shared.logClickPartnerRestaurant( + collegeId: currentCollegeId, + majorId: currentDepartmentId, + partnerId: partnerId + ) + } + let detailVC = PartnershipDetailSheetViewController( storeName: partnership.storeName, restaurantType: partnership.restaurantType, diff --git a/EATSSU/App/Sources/Presentation/Review/ViewController/ReviewViewController.swift b/EATSSU/App/Sources/Presentation/Review/ViewController/ReviewViewController.swift index 691dd9c4..dcf75eed 100644 --- a/EATSSU/App/Sources/Presentation/Review/ViewController/ReviewViewController.swift +++ b/EATSSU/App/Sources/Presentation/Review/ViewController/ReviewViewController.swift @@ -7,7 +7,7 @@ import UIKit import SnapKit -import FirebaseAnalytics + import Moya import EATSSUDesign @@ -201,6 +201,8 @@ final class ReviewViewController: BaseViewController { /// 리뷰 작성 버튼 탭 처리 @objc private func handleAddReviewButtonTap() { + ReviewAnalyticsManager.shared.logWriteReviewV1() + if type == "VARIABLE" { let reviewVC = SetRateViewController(mealId: menuID) reviewVC.dataBind( @@ -344,10 +346,7 @@ final class ReviewViewController: BaseViewController { private func setFirebaseTask() { FirebaseRemoteConfig.shared.fetchRestaurantInfo() -#if DEBUG -#else - Analytics.logEvent("ReviewViewControllerLoad", parameters: nil) -#endif + AnalyticsService.logEvent("ReviewViewControllerLoad") } /// 작성 후의 새로고침 함수 diff --git a/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift b/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift index c5ffe8b8..890f13f6 100644 --- a/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift +++ b/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift @@ -421,9 +421,14 @@ extension SetRateViewController { ) try await postFixReview(reviewId: reviewId, request: request) - + await MainActor.run { self.isReviewSubmitted = true + ReviewAnalyticsManager.shared.logCompleteReviewV1( + photoAttached: 0, + rating: self.setRateView.rateView.currentStar, + selection: self.validMenuIDList.count + ) self.showToast(message: TextLiteral.Review.fixReviewSuccess) self.moveToReviewVC() } @@ -470,6 +475,11 @@ extension SetRateViewController { await MainActor.run { self.isReviewSubmitted = true + ReviewAnalyticsManager.shared.logCompleteReviewV1( + photoAttached: imageUrl != nil ? 1 : 0, + rating: self.setRateView.rateView.currentStar, + selection: self.validMenuIDList.count + ) self.moveToReviewVC() } @@ -517,6 +527,11 @@ extension SetRateViewController { await MainActor.run { self.isReviewSubmitted = true + ReviewAnalyticsManager.shared.logCompleteReviewV1( + photoAttached: imageUrl != nil ? 1 : 0, + rating: self.setRateView.rateView.currentStar, + selection: self.validMenuIDList.count + ) self.moveToReviewVC() } From 9480331f18a2e632a4ee5ef39d241198333822b7 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Wed, 18 Mar 2026 22:07:31 +0900 Subject: [PATCH 02/14] =?UTF-8?q?[#405]=20=EC=8B=A0=EA=B7=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=20=EC=B6=94=EC=A0=81=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20import=20Fir?= =?UTF-8?q?ebaseAnalytics=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Auth/ViewController/LoginViewController.swift | 7 +++++++ .../ViewController/SetNickNameViewController.swift | 2 -- .../Home/ViewController/HomeViewController.swift | 1 - .../RestaurantInfoViewController.swift | 1 - .../Map/ViewController/MainMapViewController.swift | 5 +++-- .../NoDepartmentSheetViewController.swift | 1 - .../PartnershipDetailSheetViewController.swift | 1 - .../ViewController/CreatorViewController.swift | 3 ++- .../MyPage/ViewController/MyPageViewController.swift | 12 ++++++++++-- .../ViewController/MyReviewViewController.swift | 1 - .../ViewController/UserWithdrawViewController.swift | 2 +- .../PromotionPopupViewController.swift | 6 ++++-- .../Review/ViewController/ReportViewController.swift | 1 - .../Splash/NoticeSplashViewController.swift | 1 - .../Presentation/Splash/SplashViewController.swift | 1 - 15 files changed, 27 insertions(+), 18 deletions(-) diff --git a/EATSSU/App/Sources/Presentation/Auth/ViewController/LoginViewController.swift b/EATSSU/App/Sources/Presentation/Auth/ViewController/LoginViewController.swift index 6ab48ca4..e4ca029b 100644 --- a/EATSSU/App/Sources/Presentation/Auth/ViewController/LoginViewController.swift +++ b/EATSSU/App/Sources/Presentation/Auth/ViewController/LoginViewController.swift @@ -128,6 +128,7 @@ final class LoginViewController: BaseViewController { departmentId: info.departmentId, departmentName: info.departmentName ) + } changeIntoHomeViewController() } else { @@ -150,6 +151,8 @@ final class LoginViewController: BaseViewController { @objc private func kakaoLoginButtonDidTapped() { + AnalyticsService.logEvent("click_login", parameters: ["method": "kakao"]) + // 카카오톡이 설치되어 있으면 앱을 통해 로그인 시도 if UserApi.isKakaoTalkLoginAvailable() { UserApi.shared.loginWithKakaoTalk { [weak self] _, error in @@ -180,11 +183,13 @@ final class LoginViewController: BaseViewController { @objc private func appleLoginButtonDidTapped() { + AnalyticsService.logEvent("click_login", parameters: ["method": "apple"]) appleLoginRequest() } @objc private func lookingWithNoSignInButtonDidTapped() { + AnalyticsService.logEvent("click_login", parameters: ["method": "guest"]) changeIntoHomeViewController() } } @@ -246,6 +251,7 @@ extension LoginViewController { refreshToken: signData.refreshToken) _ = UserInfoManager.shared.createUserInfo(accountType: .kakao) UserDefaults.standard.set(UserInfo.AccountType.kakao.rawValue, forKey: TextLiteral.Auth.lastLoginProviderKey) + AnalyticsService.logEvent("complete_login", parameters: ["method": "kakao"]) getMyInfo() case .failure(let error): @@ -275,6 +281,7 @@ extension LoginViewController { refreshToken: signData.refreshToken) _ = UserInfoManager.shared.createUserInfo(accountType: .apple) UserDefaults.standard.set(UserInfo.AccountType.apple.rawValue, forKey: TextLiteral.Auth.lastLoginProviderKey) + AnalyticsService.logEvent("complete_login", parameters: ["method": "apple"]) getMyInfo() case .failure(let error): diff --git a/EATSSU/App/Sources/Presentation/Auth/ViewController/SetNickNameViewController.swift b/EATSSU/App/Sources/Presentation/Auth/ViewController/SetNickNameViewController.swift index f9c5ede4..75743d01 100644 --- a/EATSSU/App/Sources/Presentation/Auth/ViewController/SetNickNameViewController.swift +++ b/EATSSU/App/Sources/Presentation/Auth/ViewController/SetNickNameViewController.swift @@ -10,8 +10,6 @@ import Combine import Moya -import FirebaseAnalytics - import EATSSUDesign enum SetNickNameSource { diff --git a/EATSSU/App/Sources/Presentation/Home/ViewController/HomeViewController.swift b/EATSSU/App/Sources/Presentation/Home/ViewController/HomeViewController.swift index b1da5f78..cc6b3610 100644 --- a/EATSSU/App/Sources/Presentation/Home/ViewController/HomeViewController.swift +++ b/EATSSU/App/Sources/Presentation/Home/ViewController/HomeViewController.swift @@ -8,7 +8,6 @@ import UIKit import Combine -import FirebaseAnalytics import Moya import SnapKit diff --git a/EATSSU/App/Sources/Presentation/Home/ViewController/RestaurantInfoViewController.swift b/EATSSU/App/Sources/Presentation/Home/ViewController/RestaurantInfoViewController.swift index 6d60c68e..ac02b3b3 100644 --- a/EATSSU/App/Sources/Presentation/Home/ViewController/RestaurantInfoViewController.swift +++ b/EATSSU/App/Sources/Presentation/Home/ViewController/RestaurantInfoViewController.swift @@ -8,7 +8,6 @@ import SnapKit import Moya -import FirebaseAnalytics final class RestaurantInfoViewController: BaseViewController { // MARK: - UI Components diff --git a/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController.swift b/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController.swift index efa05b88..5d3650ba 100644 --- a/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController.swift +++ b/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController.swift @@ -10,7 +10,7 @@ import CoreLocation import NMapsMap import Moya -import FirebaseAnalytics + import EATSSUDesign @@ -112,8 +112,9 @@ final class MainMapViewController: BaseViewController { @objc private func didTapWhole() { guard currentMapMode != .all else { return } - + currentMapMode = .all + MapAnalyticsManager.shared.logClickMapAll() setInitialCameraPosition(animated: true) root.selectWhole(true) fetchPartnerships() diff --git a/EATSSU/App/Sources/Presentation/Map/ViewController/NoDepartmentSheetViewController.swift b/EATSSU/App/Sources/Presentation/Map/ViewController/NoDepartmentSheetViewController.swift index 09b0eff0..4c7bc763 100644 --- a/EATSSU/App/Sources/Presentation/Map/ViewController/NoDepartmentSheetViewController.swift +++ b/EATSSU/App/Sources/Presentation/Map/ViewController/NoDepartmentSheetViewController.swift @@ -8,7 +8,6 @@ import UIKit import SnapKit -import FirebaseAnalytics import EATSSUDesign diff --git a/EATSSU/App/Sources/Presentation/Map/ViewController/PartnershipDetailSheetViewController.swift b/EATSSU/App/Sources/Presentation/Map/ViewController/PartnershipDetailSheetViewController.swift index 65ec0ee7..1ecf307c 100644 --- a/EATSSU/App/Sources/Presentation/Map/ViewController/PartnershipDetailSheetViewController.swift +++ b/EATSSU/App/Sources/Presentation/Map/ViewController/PartnershipDetailSheetViewController.swift @@ -8,7 +8,6 @@ import UIKit import SnapKit -import FirebaseAnalytics import EATSSUDesign diff --git a/EATSSU/App/Sources/Presentation/MyPage/ViewController/CreatorViewController.swift b/EATSSU/App/Sources/Presentation/MyPage/ViewController/CreatorViewController.swift index 6b1677d9..cf63623e 100644 --- a/EATSSU/App/Sources/Presentation/MyPage/ViewController/CreatorViewController.swift +++ b/EATSSU/App/Sources/Presentation/MyPage/ViewController/CreatorViewController.swift @@ -10,7 +10,6 @@ import UIKit // External Module import SnapKit -import FirebaseAnalytics import EATSSUDesign @@ -93,11 +92,13 @@ class CreatorViewController: BaseViewController { /// @eatssu_official 인스타그램 연결 동작 @objc private func openInstagram() { + AnalyticsService.logEvent("click_creator_link", parameters: ["type": "instagram"]) open(urlString: URLConstants.instagram) } /// eatssu 랜딩페이지 연결 동작 @objc private func nextCreatorsImageTapped() { + AnalyticsService.logEvent("click_creator_link", parameters: ["type": "landing_page"]) open(urlString: URLConstants.landingPage) } } diff --git a/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyPageViewController.swift b/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyPageViewController.swift index db7aca2e..a3bb4fbb 100644 --- a/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyPageViewController.swift +++ b/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyPageViewController.swift @@ -8,7 +8,6 @@ import UIKit import WebKit -import FirebaseAnalytics import KakaoSDKCommon import KakaoSDKTalk import Moya @@ -76,6 +75,7 @@ final class MyPageViewController: BaseViewController { @objc private func userWithdrawButtonTapped() { + AnalyticsService.logEvent("click_mypage_menu", parameters: ["menu": "withdraw"]) let userWithdrawViewController = UserWithdrawViewController(nickName: nickName) navigationController?.pushViewController(userWithdrawViewController, animated: true) } @@ -99,6 +99,7 @@ final class MyPageViewController: BaseViewController { let fixAction = UIAlertAction(title: TextLiteral.MyPage.logout, style: .default, handler: { _ in + AnalyticsService.logEvent("click_logout") RealmService.shared.resetDB() let loginViewController = LoginViewController() @@ -185,21 +186,25 @@ extension MyPageViewController: UITableViewDelegate { switch indexPath.row { // "푸시 알림 설정" 스위치 토글 case MyPageLabels.NotificationSetting.rawValue: + AnalyticsService.logEvent("click_mypage_menu", parameters: ["menu": "notification_setting"]) handleNotificationSettingToggle(at: indexPath) - + // "내 정보" 스크린으로 이동 case MyPageLabels.MyInfo.rawValue: + AnalyticsService.logEvent("click_mypage_menu", parameters: ["menu": "my_info"]) let setNickNameVC = SetNickNameViewController() setNickNameVC.source = .signup navigationController?.pushViewController(setNickNameVC, animated: true) // "내 리뷰" 스크린으로 이동 case MyPageLabels.MyReview.rawValue: + AnalyticsService.logEvent("click_mypage_menu", parameters: ["menu": "my_review"]) let myReviewViewController = MyReviewViewController(nickname: nickName) navigationController?.pushViewController(myReviewViewController, animated: true) // "문의하기" 스크린으로 이동 case MyPageLabels.Inquiry.rawValue: + AnalyticsService.logEvent("click_mypage_menu", parameters: ["menu": "inquiry"]) TalkApi.shared.chatChannel(channelPublicId: TextLiteral.KakaoChannel.id) { [weak self] error in if error != nil { if let kakaoChannelLink = URL(string: "http://pf.kakao.com/\(TextLiteral.KakaoChannel.id)") { @@ -218,18 +223,21 @@ extension MyPageViewController: UITableViewDelegate { // "서비스 이용약관" 스크린으로 이동 case MyPageLabels.TermsOfUse.rawValue: + AnalyticsService.logEvent("click_mypage_menu", parameters: ["menu": "terms_of_use"]) let provisionViewController = ProvisionViewController(agreementType: .termsOfService) provisionViewController.navigationTitle = TextLiteral.MyPage.termsOfUse navigationController?.pushViewController(provisionViewController, animated: true) // "개인정보 이용약관" 스크린으로 이동 case MyPageLabels.PrivacyTermsOfUse.rawValue: + AnalyticsService.logEvent("click_mypage_menu", parameters: ["menu": "privacy_policy"]) let provisionViewController = ProvisionViewController(agreementType: .privacyPolicy) provisionViewController.navigationTitle = TextLiteral.MyPage.privacyTermsOfUse navigationController?.pushViewController(provisionViewController, animated: true) // "만든사람들" 스크린으로 이동 case MyPageLabels.Creator.rawValue: + AnalyticsService.logEvent("click_mypage_menu", parameters: ["menu": "creator"]) let creatorViewController = CreatorViewController() navigationController?.pushViewController(creatorViewController, animated: true) diff --git a/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyReviewViewController.swift b/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyReviewViewController.swift index f258496b..c1034647 100644 --- a/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyReviewViewController.swift +++ b/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyReviewViewController.swift @@ -9,7 +9,6 @@ import UIKit import Moya import SnapKit -import FirebaseAnalytics final class MyReviewViewController: BaseViewController { override var shouldHideTabBar: Bool { true } diff --git a/EATSSU/App/Sources/Presentation/MyPage/ViewController/UserWithdrawViewController.swift b/EATSSU/App/Sources/Presentation/MyPage/ViewController/UserWithdrawViewController.swift index 34c865d9..e2293063 100644 --- a/EATSSU/App/Sources/Presentation/MyPage/ViewController/UserWithdrawViewController.swift +++ b/EATSSU/App/Sources/Presentation/MyPage/ViewController/UserWithdrawViewController.swift @@ -10,7 +10,6 @@ import UIKit import Moya import Realm import SnapKit -import FirebaseAnalytics final class UserWithdrawViewController: BaseViewController { override var shouldHideTabBar: Bool { true } @@ -143,6 +142,7 @@ extension UserWithdrawViewController { ) { result in switch result { case .success: + AnalyticsService.logEvent("click_withdraw") RealmService.shared.resetDB() let loginViewController = LoginViewController() if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, diff --git a/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift b/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift index 4b489a53..41968343 100644 --- a/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift +++ b/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift @@ -7,7 +7,6 @@ import UIKit -import FirebaseAnalytics import SnapKit /// 홈 화면 진입 시 노출되는 프로모션 팝업 @@ -79,13 +78,14 @@ final class PromotionPopupViewController: BaseViewController { /// 잇슈 인스타그램 바로가기 버튼 클릭 -> 나받돼 게시물로 이동 @objc private func didTapInstagramLinkButton() { - print("클릭됨") + AnalyticsService.logEvent("click_promotion_popup", parameters: ["action": "instagram_link"]) UIApplication.shared.open(nabatdaePostURL) } /// 팝업의 그 외 영역 클릭 -> 나아돼 탭으로 이동 @objc private func didTapPopupContent() { + AnalyticsService.logEvent("click_promotion_popup", parameters: ["action": "content"]) dismiss(animated: true) { [weak self] in self?.tabBarContainer?.setTab(index: 2) } @@ -94,12 +94,14 @@ final class PromotionPopupViewController: BaseViewController { /// 다시 보지 않기 -> 평생 안 뜸 @objc private func didTapNeverShowAgainButton() { + AnalyticsService.logEvent("click_promotion_popup", parameters: ["action": "never_show_again"]) HomePromotionPopupDisplayData.hideForever() dismiss(animated: true) } @objc private func didTapCloseButton() { + AnalyticsService.logEvent("click_promotion_popup", parameters: ["action": "close"]) dismiss(animated: true) } } diff --git a/EATSSU/App/Sources/Presentation/Review/ViewController/ReportViewController.swift b/EATSSU/App/Sources/Presentation/Review/ViewController/ReportViewController.swift index ce575203..c13a6bda 100644 --- a/EATSSU/App/Sources/Presentation/Review/ViewController/ReportViewController.swift +++ b/EATSSU/App/Sources/Presentation/Review/ViewController/ReportViewController.swift @@ -9,7 +9,6 @@ import UIKit import Moya import SnapKit -import FirebaseAnalytics import EATSSUDesign diff --git a/EATSSU/App/Sources/Presentation/Splash/NoticeSplashViewController.swift b/EATSSU/App/Sources/Presentation/Splash/NoticeSplashViewController.swift index 420490e9..8527c41d 100644 --- a/EATSSU/App/Sources/Presentation/Splash/NoticeSplashViewController.swift +++ b/EATSSU/App/Sources/Presentation/Splash/NoticeSplashViewController.swift @@ -8,7 +8,6 @@ import UIKit import SnapKit -import FirebaseAnalytics import EATSSUDesign diff --git a/EATSSU/App/Sources/Presentation/Splash/SplashViewController.swift b/EATSSU/App/Sources/Presentation/Splash/SplashViewController.swift index aeff8ad5..a38e63da 100644 --- a/EATSSU/App/Sources/Presentation/Splash/SplashViewController.swift +++ b/EATSSU/App/Sources/Presentation/Splash/SplashViewController.swift @@ -8,7 +8,6 @@ import UIKit import SnapKit -import FirebaseAnalytics import EATSSUDesign From 46ab3ddba78e373d3c9f5d4ff73e3ea143c1878d Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Wed, 18 Mar 2026 22:30:00 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[#405]=20=EB=A6=AC=EB=B7=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=8B=9C=20photoAttached=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=EA=B0=80=20=EC=8B=A4=EC=A0=9C=20=EC=82=AC?= =?UTF-8?q?=EC=A7=84=20=EC=B2=A8=EB=B6=80=20=EC=83=81=ED=83=9C=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Review/ViewController/SetRateViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift b/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift index 890f13f6..2dac22df 100644 --- a/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift +++ b/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift @@ -424,8 +424,9 @@ extension SetRateViewController { await MainActor.run { self.isReviewSubmitted = true + let hasPhoto = self.userPickedImage != nil || self.setRateView.userReviewImageView.image != nil ReviewAnalyticsManager.shared.logCompleteReviewV1( - photoAttached: 0, + photoAttached: hasPhoto ? 1 : 0, rating: self.setRateView.rateView.currentStar, selection: self.validMenuIDList.count ) From 8abc18a9384e850a1d3cb58d9c677a24665d8364 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Wed, 18 Mar 2026 23:09:04 +0900 Subject: [PATCH 04/14] =?UTF-8?q?[#405]=20partnershipInfos=EA=B0=80=20?= =?UTF-8?q?=EB=B9=84=EC=96=B4=EC=9E=88=EC=96=B4=EB=8F=84=20click=5Fpartner?= =?UTF-8?q?=5Frestaurant=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MainMapViewController+Marker.swift | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController+Marker.swift b/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController+Marker.swift index 9204f2d9..2d602462 100644 --- a/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController+Marker.swift +++ b/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController+Marker.swift @@ -147,14 +147,11 @@ extension MainMapViewController { /// 제휴점 상세 바텀시트 표시 func showPartnershipDetail(for partnership: PartnershipDTO) { - let partnerId = partnership.partnershipInfos.first?.id - if let partnerId = partnerId { - MapAnalyticsManager.shared.logClickPartnerRestaurant( - collegeId: currentCollegeId, - majorId: currentDepartmentId, - partnerId: partnerId - ) - } + MapAnalyticsManager.shared.logClickPartnerRestaurant( + collegeId: currentCollegeId, + majorId: currentDepartmentId, + partnerId: partnership.partnershipInfos.first?.id ?? -1 + ) let detailVC = PartnershipDetailSheetViewController( storeName: partnership.storeName, From 0b27db5a3a101570e892f5f1e0d091e79a2200fe Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Wed, 18 Mar 2026 23:17:39 +0900 Subject: [PATCH 05/14] =?UTF-8?q?[#405]=20=EB=A6=AC=EB=B7=B0=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=20=EC=9D=B4=EB=A6=84=20v1=20=E2=86=92=20v2?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift b/EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift index d9e3bcce..187ce398 100644 --- a/EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift +++ b/EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift @@ -16,8 +16,8 @@ final class ReviewAnalyticsManager { // MARK: - Event & Parameter Keys private enum Event { - static let writeReview = "write_review_v1" - static let completeReview = "complete_review_v1" + static let writeReview = "write_review_v2" + static let completeReview = "complete_review_v2" } private enum Parameter { From c15685124f2d94c09d9913f724c6e2bf3ff63e69 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Sat, 21 Mar 2026 16:21:47 +0900 Subject: [PATCH 06/14] =?UTF-8?q?[#405]=20select=5Fday=20=E2=86=92=20click?= =?UTF-8?q?=5Fday=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift b/EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift index f5d76ebb..069dba9e 100644 --- a/EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift +++ b/EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift @@ -20,7 +20,7 @@ final class HomeAnalyticsManager { private enum Event { static let clickRestaurantInfo = "click_restaurant_info" static let selectMealTime = "select_mealtime" - static let selectDay = "select_day" + static let selectDay = "click_day" static let clickMenu = "click_menu" } From 7a1aa9412f686b9ef6a7a63ea0c760a4a63fdb95 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Sat, 21 Mar 2026 16:21:51 +0900 Subject: [PATCH 07/14] =?UTF-8?q?[#405]=20PostHog=20screen=5Fview=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EC=BA=A1=EC=B2=98=20=EB=B0=8F=20Deep=20Li?= =?UTF-8?q?nk=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EATSSU/App/Sources/Utility/Application/AppDelegate.swift | 2 +- EATSSU/App/Sources/Utility/Application/SceneDelegate.swift | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/EATSSU/App/Sources/Utility/Application/AppDelegate.swift b/EATSSU/App/Sources/Utility/Application/AppDelegate.swift index 217a0673..f9bb17bc 100644 --- a/EATSSU/App/Sources/Utility/Application/AppDelegate.swift +++ b/EATSSU/App/Sources/Utility/Application/AppDelegate.swift @@ -97,7 +97,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD let config = PostHogConfig(apiKey: apiKey, host: "https://us.i.posthog.com") config.captureApplicationLifecycleEvents = true - config.captureScreenViews = false + config.captureScreenViews = true PostHogSDK.shared.setup(config) #endif diff --git a/EATSSU/App/Sources/Utility/Application/SceneDelegate.swift b/EATSSU/App/Sources/Utility/Application/SceneDelegate.swift index ecd0dec6..cf75bd77 100644 --- a/EATSSU/App/Sources/Utility/Application/SceneDelegate.swift +++ b/EATSSU/App/Sources/Utility/Application/SceneDelegate.swift @@ -50,6 +50,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } else { LaunchSourceManager.shared.setSource(.icon) } + + // PostHog Deep Link 이벤트 + AnalyticsService.logEvent("Deep Link Opened", parameters: ["url": url.absoluteString]) } } From 53716956a02dc34dd23c446a3110c2b026215c87 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Sat, 21 Mar 2026 16:21:55 +0900 Subject: [PATCH 08/14] =?UTF-8?q?[#405]=20click=5Fpromotion=5Fpopup=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Popup/ViewController/PromotionPopupViewController.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift b/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift index 41968343..1a367d9c 100644 --- a/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift +++ b/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift @@ -78,14 +78,12 @@ final class PromotionPopupViewController: BaseViewController { /// 잇슈 인스타그램 바로가기 버튼 클릭 -> 나받돼 게시물로 이동 @objc private func didTapInstagramLinkButton() { - AnalyticsService.logEvent("click_promotion_popup", parameters: ["action": "instagram_link"]) UIApplication.shared.open(nabatdaePostURL) } /// 팝업의 그 외 영역 클릭 -> 나아돼 탭으로 이동 @objc private func didTapPopupContent() { - AnalyticsService.logEvent("click_promotion_popup", parameters: ["action": "content"]) dismiss(animated: true) { [weak self] in self?.tabBarContainer?.setTab(index: 2) } @@ -94,14 +92,12 @@ final class PromotionPopupViewController: BaseViewController { /// 다시 보지 않기 -> 평생 안 뜸 @objc private func didTapNeverShowAgainButton() { - AnalyticsService.logEvent("click_promotion_popup", parameters: ["action": "never_show_again"]) HomePromotionPopupDisplayData.hideForever() dismiss(animated: true) } @objc private func didTapCloseButton() { - AnalyticsService.logEvent("click_promotion_popup", parameters: ["action": "close"]) dismiss(animated: true) } } From 7ac9f4faf69f728d8146cfe849ca6359e45193a8 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:08:07 +0900 Subject: [PATCH 09/14] =?UTF-8?q?[#405]=20click=5Fday=20=E2=86=92=20select?= =?UTF-8?q?=5Fday=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift b/EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift index 069dba9e..f5d76ebb 100644 --- a/EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift +++ b/EATSSU/App/Sources/Data/Firebase/HomeAnalyticsManager.swift @@ -20,7 +20,7 @@ final class HomeAnalyticsManager { private enum Event { static let clickRestaurantInfo = "click_restaurant_info" static let selectMealTime = "select_mealtime" - static let selectDay = "click_day" + static let selectDay = "select_day" static let clickMenu = "click_menu" } From 7622a4b9c309f89e75ea18604772c2abe62211b2 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:08:12 +0900 Subject: [PATCH 10/14] =?UTF-8?q?[#405]=20complete=5Freview=5Fv2=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20selection=20=E2=86=92=20?= =?UTF-8?q?likes=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../App/Sources/Data/Firebase/ReviewAnalyticsManager.swift | 6 +++--- .../Review/ViewController/SetRateViewController.swift | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift b/EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift index 187ce398..03ab8635 100644 --- a/EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift +++ b/EATSSU/App/Sources/Data/Firebase/ReviewAnalyticsManager.swift @@ -23,7 +23,7 @@ final class ReviewAnalyticsManager { private enum Parameter { static let photoAttached = "photo_attached" static let rating = "rating" - static let selection = "selection" + static let likes = "likes" } // MARK: - Logging Methods @@ -41,11 +41,11 @@ final class ReviewAnalyticsManager { - Parameter rating: 사용자가 부여한 메인 별점 (1~5) - Parameter selection: 사용자가 한 번에 리뷰를 작성하는 메뉴의 총 개수 */ - func logCompleteReviewV1(photoAttached: Int, rating: Int, selection: Int) { + func logCompleteReviewV1(photoAttached: Int, rating: Int, likes: Int) { AnalyticsService.logEvent(Event.completeReview, parameters: [ Parameter.photoAttached: photoAttached, Parameter.rating: rating, - Parameter.selection: selection + Parameter.likes: likes ]) } } diff --git a/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift b/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift index 2dac22df..306d8325 100644 --- a/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift +++ b/EATSSU/App/Sources/Presentation/Review/ViewController/SetRateViewController.swift @@ -428,7 +428,7 @@ extension SetRateViewController { ReviewAnalyticsManager.shared.logCompleteReviewV1( photoAttached: hasPhoto ? 1 : 0, rating: self.setRateView.rateView.currentStar, - selection: self.validMenuIDList.count + likes: self.likedStates.filter { $0 }.count ) self.showToast(message: TextLiteral.Review.fixReviewSuccess) self.moveToReviewVC() @@ -479,7 +479,7 @@ extension SetRateViewController { ReviewAnalyticsManager.shared.logCompleteReviewV1( photoAttached: imageUrl != nil ? 1 : 0, rating: self.setRateView.rateView.currentStar, - selection: self.validMenuIDList.count + likes: self.likedStates.filter { $0 }.count ) self.moveToReviewVC() } @@ -531,7 +531,7 @@ extension SetRateViewController { ReviewAnalyticsManager.shared.logCompleteReviewV1( photoAttached: imageUrl != nil ? 1 : 0, rating: self.setRateView.rateView.currentStar, - selection: self.validMenuIDList.count + likes: self.likedStates.filter { $0 }.count ) self.moveToReviewVC() } From 4948dba446049006a769046141555a5c3934379f Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:08:17 +0900 Subject: [PATCH 11/14] =?UTF-8?q?[#405]=20=EC=9C=84=EC=A0=AF=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=EB=AA=85=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20?= =?UTF-8?q?add=5Fwidget=EC=97=90=20restaurants=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Firebase/WidgetAnalyticsManager+SendEvents.swift | 11 ++++++++--- .../Data/Firebase/WidgetAnalyticsManager.swift | 12 +++++++++--- .../Sources/Data/Timeline/ESTimelineProvider.swift | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/EATSSU/App/Sources/Data/Firebase/WidgetAnalyticsManager+SendEvents.swift b/EATSSU/App/Sources/Data/Firebase/WidgetAnalyticsManager+SendEvents.swift index 60cb4189..a2fc92ba 100644 --- a/EATSSU/App/Sources/Data/Firebase/WidgetAnalyticsManager+SendEvents.swift +++ b/EATSSU/App/Sources/Data/Firebase/WidgetAnalyticsManager+SendEvents.swift @@ -11,10 +11,15 @@ extension WidgetAnalyticsManager { func sendPendingEvents() { // 1. 위젯 추가 이벤트 전송 if userDefaults?.bool(forKey: UserDefaultsKey.widgetAdded) == true { - AnalyticsService.logEvent(Event.addWidget) + var parameters: [String: Any] = [:] + if let restaurant = userDefaults?.string(forKey: UserDefaultsKey.widgetAddedRestaurant) { + parameters["restaurants"] = restaurant + } + AnalyticsService.logEvent(Event.addWidget, parameters: parameters) userDefaults?.removeObject(forKey: UserDefaultsKey.widgetAdded) + userDefaults?.removeObject(forKey: UserDefaultsKey.widgetAddedRestaurant) #if DEBUG - print("Analytics: Logged add_widget_ios") + print("Analytics: Logged add_widget with params \(parameters)") #endif } @@ -23,7 +28,7 @@ extension WidgetAnalyticsManager { AnalyticsService.logEvent(Event.changeWidget, parameters: changeInfo) userDefaults?.removeObject(forKey: UserDefaultsKey.widgetChanged) #if DEBUG - print("Analytics: Logged change_widget_ios with params \(changeInfo)") + print("Analytics: Logged change_widget with params \(changeInfo)") #endif } } diff --git a/EATSSU/App/Sources/Data/Firebase/WidgetAnalyticsManager.swift b/EATSSU/App/Sources/Data/Firebase/WidgetAnalyticsManager.swift index 8484f8b4..793c01e6 100644 --- a/EATSSU/App/Sources/Data/Firebase/WidgetAnalyticsManager.swift +++ b/EATSSU/App/Sources/Data/Firebase/WidgetAnalyticsManager.swift @@ -31,17 +31,19 @@ final class WidgetAnalyticsManager { // MARK: - Event & Parameter Keys enum Event { - static let addWidget = "add_widget_ios" - static let changeWidget = "change_widget_ios" + static let addWidget = "add_widget" + static let changeWidget = "change_widget" } private enum Parameter { + static let restaurants = "restaurants" static let restaurantBefore = "restaurant_before" static let restaurantAfter = "restaurant_after" } enum UserDefaultsKey { static let widgetAdded = "pendingWidgetAddedEvent" + static let widgetAddedRestaurant = "pendingWidgetAddedRestaurant" static let widgetChanged = "pendingWidgetChangedEvent" } @@ -58,8 +60,12 @@ final class WidgetAnalyticsManager { // MARK: - Methods to be Called from Widget Extension /// (위젯에서 호출) 사용자가 위젯을 추가했을 때, 이벤트를 기록합니다. - func recordWidgetAdded() { + /// - Parameter restaurant: 위젯에 설정된 식당 이름 (한글) + func recordWidgetAdded(restaurant: String) { userDefaults?.set(true, forKey: UserDefaultsKey.widgetAdded) + if let paramValue = restaurantNameMap[restaurant] { + userDefaults?.set(paramValue, forKey: UserDefaultsKey.widgetAddedRestaurant) + } } /// (위젯에서 호출) 사용자가 위젯의 식당을 변경했을 때, 이전/이후 정보를 기록합니다. diff --git a/EATSSU/Widget/Sources/Data/Timeline/ESTimelineProvider.swift b/EATSSU/Widget/Sources/Data/Timeline/ESTimelineProvider.swift index 5bb14697..23d38337 100644 --- a/EATSSU/Widget/Sources/Data/Timeline/ESTimelineProvider.swift +++ b/EATSSU/Widget/Sources/Data/Timeline/ESTimelineProvider.swift @@ -105,7 +105,7 @@ struct ESTimelineProvider: AppIntentTimelineProvider { WidgetAnalyticsManager.shared.recordWidgetChanged(before: oldRestaurant, after: newRestaurant) } } else { - WidgetAnalyticsManager.shared.recordWidgetAdded() + WidgetAnalyticsManager.shared.recordWidgetAdded(restaurant: newRestaurant) } userDefaults?.set(newRestaurant, forKey: lastRestaurantKey) } From 456b2cc4cf65626e19fd274ffda10a84adb31928 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:08:22 +0900 Subject: [PATCH 12/14] =?UTF-8?q?[#405]=20popup=5Fevent=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PromotionPopupViewController.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift b/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift index 1a367d9c..f220bc0f 100644 --- a/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift +++ b/EATSSU/App/Sources/Presentation/Popup/ViewController/PromotionPopupViewController.swift @@ -78,12 +78,20 @@ final class PromotionPopupViewController: BaseViewController { /// 잇슈 인스타그램 바로가기 버튼 클릭 -> 나받돼 게시물로 이동 @objc private func didTapInstagramLinkButton() { + AnalyticsService.logEvent("popup_event", parameters: [ + "popup_name": "plz_not_me", + "popup_action": "go_insta" + ]) UIApplication.shared.open(nabatdaePostURL) } /// 팝업의 그 외 영역 클릭 -> 나아돼 탭으로 이동 @objc private func didTapPopupContent() { + AnalyticsService.logEvent("popup_event", parameters: [ + "popup_name": "plz_not_me", + "popup_action": "click_popup_image" + ]) dismiss(animated: true) { [weak self] in self?.tabBarContainer?.setTab(index: 2) } @@ -92,12 +100,20 @@ final class PromotionPopupViewController: BaseViewController { /// 다시 보지 않기 -> 평생 안 뜸 @objc private func didTapNeverShowAgainButton() { + AnalyticsService.logEvent("popup_event", parameters: [ + "popup_name": "plz_not_me", + "popup_action": "not_show_again" + ]) HomePromotionPopupDisplayData.hideForever() dismiss(animated: true) } @objc private func didTapCloseButton() { + AnalyticsService.logEvent("popup_event", parameters: [ + "popup_name": "plz_not_me", + "popup_action": "close" + ]) dismiss(animated: true) } } From 0c6367f9a7eaece1c8906c2198ed949cb3460562 Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:08:29 +0900 Subject: [PATCH 13/14] =?UTF-8?q?[#405]=20click=5Fplz=5Fnot=5Fme=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TabBar/CustomTabBarContainerController.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/EATSSU/App/Sources/Presentation/TabBar/CustomTabBarContainerController.swift b/EATSSU/App/Sources/Presentation/TabBar/CustomTabBarContainerController.swift index 0516df90..eb55dc7f 100644 --- a/EATSSU/App/Sources/Presentation/TabBar/CustomTabBarContainerController.swift +++ b/EATSSU/App/Sources/Presentation/TabBar/CustomTabBarContainerController.swift @@ -255,6 +255,11 @@ extension CustomTabBarContainerController: UITabBarControllerDelegate { // 커피 탭: 전체화면 모달로 웹뷰 표시 if selectedTab == .coffee { + let userInfo = UserInfoManager.shared.getCurrentUserInfo() + var params: [String: Any] = [:] + if let collegeId = userInfo?.collegeId { params["college"] = collegeId } + if let majorId = userInfo?.departmentId { params["major"] = majorId } + AnalyticsService.logEvent("click_plz_not_me", parameters: params) presentCoffeeWebView() return false } From d8925142a8ed6e6a330fa3a4b034bda2075f225a Mon Sep 17 00:00:00 2001 From: Hwang Sang Hwan <137605270+Hrepay@users.noreply.github.com> Date: Thu, 26 Mar 2026 00:08:40 +0900 Subject: [PATCH 14/14] =?UTF-8?q?[#405]=20=EB=85=B8=EC=85=98=20=EB=AF=B8?= =?UTF-8?q?=EC=A0=95=EC=9D=98=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Data/Firebase/MapAnalyticsManager.swift | 10 +--------- .../Map/ViewController/MainMapViewController.swift | 1 - .../MyPage/ViewController/CreatorViewController.swift | 2 -- .../MyPage/ViewController/MyPageViewController.swift | 1 - .../ViewController/UserWithdrawViewController.swift | 1 - .../Review/ViewController/ReviewViewController.swift | 2 -- 6 files changed, 1 insertion(+), 16 deletions(-) diff --git a/EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift b/EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift index d4a40869..f178c53c 100644 --- a/EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift +++ b/EATSSU/App/Sources/Data/Firebase/MapAnalyticsManager.swift @@ -17,7 +17,6 @@ final class MapAnalyticsManager { private enum Event { static let clickMap = "click_map" - static let clickMapAll = "click_map_all" static let clickMapMine = "click_map_mine" static let clickPartnerRestaurant = "click_partner_restaurant" } @@ -38,14 +37,7 @@ final class MapAnalyticsManager { } /** - #2 지도 화면에서 '전체' 버튼을 클릭했을 때 호출 - */ - func logClickMapAll() { - AnalyticsService.logEvent(Event.clickMapAll) - } - - /** - #3 지도 화면에서 '내 제휴' (또는 학과명) 버튼을 클릭했을 때 호출 + #2 지도 화면에서 '내 제휴' (또는 학과명) 버튼을 클릭했을 때 호출 - Parameter collegeId: 사용자의 단과대 ID - Parameter majorId: 사용자의 학과 ID */ diff --git a/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController.swift b/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController.swift index 5d3650ba..0c1a4489 100644 --- a/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController.swift +++ b/EATSSU/App/Sources/Presentation/Map/ViewController/MainMapViewController.swift @@ -114,7 +114,6 @@ final class MainMapViewController: BaseViewController { guard currentMapMode != .all else { return } currentMapMode = .all - MapAnalyticsManager.shared.logClickMapAll() setInitialCameraPosition(animated: true) root.selectWhole(true) fetchPartnerships() diff --git a/EATSSU/App/Sources/Presentation/MyPage/ViewController/CreatorViewController.swift b/EATSSU/App/Sources/Presentation/MyPage/ViewController/CreatorViewController.swift index cf63623e..92aef502 100644 --- a/EATSSU/App/Sources/Presentation/MyPage/ViewController/CreatorViewController.swift +++ b/EATSSU/App/Sources/Presentation/MyPage/ViewController/CreatorViewController.swift @@ -92,13 +92,11 @@ class CreatorViewController: BaseViewController { /// @eatssu_official 인스타그램 연결 동작 @objc private func openInstagram() { - AnalyticsService.logEvent("click_creator_link", parameters: ["type": "instagram"]) open(urlString: URLConstants.instagram) } /// eatssu 랜딩페이지 연결 동작 @objc private func nextCreatorsImageTapped() { - AnalyticsService.logEvent("click_creator_link", parameters: ["type": "landing_page"]) open(urlString: URLConstants.landingPage) } } diff --git a/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyPageViewController.swift b/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyPageViewController.swift index a3bb4fbb..d93632d2 100644 --- a/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyPageViewController.swift +++ b/EATSSU/App/Sources/Presentation/MyPage/ViewController/MyPageViewController.swift @@ -99,7 +99,6 @@ final class MyPageViewController: BaseViewController { let fixAction = UIAlertAction(title: TextLiteral.MyPage.logout, style: .default, handler: { _ in - AnalyticsService.logEvent("click_logout") RealmService.shared.resetDB() let loginViewController = LoginViewController() diff --git a/EATSSU/App/Sources/Presentation/MyPage/ViewController/UserWithdrawViewController.swift b/EATSSU/App/Sources/Presentation/MyPage/ViewController/UserWithdrawViewController.swift index e2293063..05c4b392 100644 --- a/EATSSU/App/Sources/Presentation/MyPage/ViewController/UserWithdrawViewController.swift +++ b/EATSSU/App/Sources/Presentation/MyPage/ViewController/UserWithdrawViewController.swift @@ -142,7 +142,6 @@ extension UserWithdrawViewController { ) { result in switch result { case .success: - AnalyticsService.logEvent("click_withdraw") RealmService.shared.resetDB() let loginViewController = LoginViewController() if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, diff --git a/EATSSU/App/Sources/Presentation/Review/ViewController/ReviewViewController.swift b/EATSSU/App/Sources/Presentation/Review/ViewController/ReviewViewController.swift index dcf75eed..b8caff6f 100644 --- a/EATSSU/App/Sources/Presentation/Review/ViewController/ReviewViewController.swift +++ b/EATSSU/App/Sources/Presentation/Review/ViewController/ReviewViewController.swift @@ -345,8 +345,6 @@ final class ReviewViewController: BaseViewController { /// Firebase 작업 설정 private func setFirebaseTask() { FirebaseRemoteConfig.shared.fetchRestaurantInfo() - - AnalyticsService.logEvent("ReviewViewControllerLoad") } /// 작성 후의 새로고침 함수