Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] firebase analytics 로그 추가 #74

Merged
merged 15 commits into from
Sep 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Projects/App/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ let project = Project.configure(
.Core.DesignSystem,
.Core.PPACNetwork,
.Core.PPACUtil,
.Core.PPACAnalytics,
.ThirdParty.Lottie,
.ThirdParty.Dependency,
.ThirdParty.AppsFlyerLib,
Expand Down Expand Up @@ -85,8 +86,9 @@ let project = Project.configure(
.Core.DesignSystem,
.Core.PPACNetwork,
.Core.PPACUtil,
.Core.PPACAnalytics,
.ThirdParty.Dependency,
.ThirdParty.AppsFlyerLib,
.ThirdParty.AppsFlyerLib
],
settings: .settings(
base: [
Expand Down
3 changes: 2 additions & 1 deletion Projects/App/Sources/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import Combine

import Home
import PPACUtil
import PPACAnalytics

import AppsFlyerLib
import AppTrackingTransparency
Expand All @@ -27,8 +28,8 @@ final class AppDelegate: UIResponder, UIApplicationDelegate {
private let deeplinkMemeId = PassthroughSubject<String, Never>()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
PPACAnalytics.shared.congigureFirebaseApp()
self.window = UIWindow(frame: UIScreen.main.bounds)

let router = SplashRouter(navigationController, deeplinkMemeId: self.deeplinkMemeId)
self.navigationController.setNavigationBarHidden(true, animated: false)
self.appRouter = router
Expand Down
32 changes: 32 additions & 0 deletions Projects/Core/PPACAnalytics/Project.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// Project.swift
// PPACAnalytics
//
// Created by hyeryeong on 9/02/24
//

import ProjectDescription
import ProjectDescriptionHelpers

let project = Project(
name: "PPACAnalytics",
targets: [
.configure(
name: "PPACAnalytics",
product: .framework,
infoPlist: .default,
sources: "Sources/**",
resources: "Resources/**",
dependencies: [
.ThirdParty.FirebaseAnalytics,
.ThirdParty.FirebaseCrashlytics
],
settings: .settings(
base: [
"OTHER_LDFLAGS": ["-all_load -Objc"]
]
)
)
]
)

1 change: 1 addition & 0 deletions Projects/Core/PPACAnalytics/Resources/dummy.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
더미임미다
90 changes: 90 additions & 0 deletions Projects/Core/PPACAnalytics/Sources/PPACAnalytics.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
//
// PPACAnalytics.swift
// PPACAnalytics
//
// Created by 장혜령 on 9/2/24.
//

import Foundation

import FirebaseCore
import FirebaseAnalytics

final public class PPACAnalytics {
static public let shared = PPACAnalytics()

public enum UserInteraction: String {
case click
case view
case swipe
case scroll
}

public enum Page: String {
case recommend
case memeDetail = "meme_detail"
case search
case searchDetail = "search_detail"
case myPage = "my_page"
case settings
}

public enum UserEvent: String {
case reaction
case copy
case share
case save
case saveCancel = "save_cancel"
case tag
case searchBar = "search_bar"
case hotKeyword = "hot_keyword"
case keyword
case meme
case settings
case appUpdate = "app_update"
}

private init() {
print("PPACAnalytics init")
}

public func congigureFirebaseApp() {
FirebaseApp.configure()
}

public func log(
interaction: UserInteraction,
event: UserEvent,
page: Page,
memeId: String? = nil,
memeTitle: String? = nil,
extraParameters: [String: Any]? = nil
) {

var keyName = interaction.rawValue
if interaction != .scroll {
keyName += "_" + event.rawValue
}

var parameters: [String: Any] = [:]
parameters["page"] = page.rawValue

if let memeId {
parameters["meme_id"] = memeId
}

if let memeTitle {
parameters["meme_title"] = memeTitle
}

if let extraParameters {
parameters.merge(extraParameters) { (current, _) in current }
}

Analytics
.logEvent(
keyName,
parameters: parameters
)
}
}
1 change: 1 addition & 0 deletions Projects/Core/PPACAnalytics/Sources/dummy.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
//더미임미다
2 changes: 1 addition & 1 deletion Projects/Core/PPACNetwork/Sources/NetworkService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ final public class NetworkService: NetworkServiceable {
return .failure(.invalidResponse)
}

NetworkLogger.logResponse(httpResponse, data: data)
//NetworkLogger.logResponse(httpResponse, data: data)
let error: NetworkError
switch httpResponse.statusCode {
case 200..<300:
Expand Down
1 change: 1 addition & 0 deletions Projects/Features/MemeDetail/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ let project = Project(
.Core.PPACUtil,
.Core.PPACDomain,
.Core.PPACData,
.Core.PPACAnalytics
]
)
]
Expand Down
9 changes: 9 additions & 0 deletions Projects/Features/MemeDetail/Sources/MemeDetailCardView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import SwiftUI

import DesignSystem
import PPACModels
import PPACAnalytics
import ResourceKit

import Lottie
Expand Down Expand Up @@ -45,6 +46,14 @@ struct MemeDetailCardView: View {

HashTagView(keywords: meme.keywords)
.padding(.bottom, 11)
.onTapGesture {
PPACAnalytics.shared
.log(
interaction: .click,
event: .tag,
page: .memeDetail
)
}

subtitleLabel
.padding(.bottom, 20)
Expand Down
4 changes: 4 additions & 0 deletions Projects/Features/MemeDetail/Sources/MemeDetailView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import ResourceKit
import DesignSystem

import Kingfisher
import PPACAnalytics

public struct MemeDetailView: View {

Expand Down Expand Up @@ -49,6 +50,9 @@ public struct MemeDetailView: View {
.opacity(0.4)
.edgesIgnoringSafeArea(.top)
)
.onAppear {
viewModel.logMemeDetail(interaction: .view, event: .meme)
}
.plainNavigationBar(
backHandler: { viewModel.dispatch(type: .naviBackButtonTapped) },
rightActionHandler: nil,
Expand Down
21 changes: 21 additions & 0 deletions Projects/Features/MemeDetail/Sources/MemeDetailViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import PPACUtil
import PPACModels
import PPACDomain

import PPACAnalytics

@MainActor
public protocol MemeDetailRouting: AnyObject {
func popView()
Expand Down Expand Up @@ -91,6 +93,20 @@ public final class MemeDetailViewModel: ViewModelType, ObservableObject {
}
}
}

public func logMemeDetail(
interaction: PPACAnalytics.UserInteraction = .click,
event: PPACAnalytics.UserEvent
) {
PPACAnalytics.shared
.log(
interaction: interaction,
event: event,
page: .memeDetail,
memeId: self.state.meme.id,
memeTitle: self.state.meme.title
)
}
}

private extension MemeDetailViewModel {
Expand All @@ -101,6 +117,7 @@ private extension MemeDetailViewModel {
try await reactToMemeUseCase.execute(memeId: state.meme.id)
self.state.meme.reaction += 1
self.state.meme.isReaction = true
self.logMemeDetail(event: .reaction)
print("reaction success")
} catch {
// TODO: - 에러처리
Expand All @@ -120,6 +137,7 @@ private extension MemeDetailViewModel {
}
UIPasteboard.general.image = image
state.isCopied = true
self.logMemeDetail(event: .copy)
} catch {
print("Failed to load image data: \(error)")
}
Expand All @@ -133,6 +151,7 @@ private extension MemeDetailViewModel {
try await bookmarkMemeUseCase.execute(memeId: state.meme.id)
state.meme.isFarmemed = true
state.isFarmemeChanged = true
self.logMemeDetail(event: .save)
} catch {
// TODO: - 에러처리
print(error)
Expand All @@ -147,6 +166,7 @@ private extension MemeDetailViewModel {
try await bookmarkMemeUseCase.delete(memeId: state.meme.id)
state.meme.isFarmemed = false
state.isFarmemeChanged = true
self.logMemeDetail(event: .saveCancel)
} catch {
// TODO: - 에러처리
print(error)
Expand All @@ -157,5 +177,6 @@ private extension MemeDetailViewModel {
func showShareSheet() async {
let deeplinkUrl = "https://farmeme.onelink.me/RtpU/y09dosru?deep_link_value=\(self.state.meme.id)"
self.router?.showShareView(items: [deeplinkUrl])
self.logMemeDetail(event: .share)
}
}
1 change: 1 addition & 0 deletions Projects/Features/MyPage/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ let project = Project(
.ResourceKit,
.Core.DesignSystem,
.Core.PPACModels,
.Core.PPACAnalytics,
.Feature.MemeDetail,
.Feature.Setting
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ struct LevelProgressView: View {
RoundedRectangle(cornerRadius: 25, style: .circular)
.stroke(Color.Border.primary, lineWidth: 2, fill: Color.Background.brand)
.frame(width: isAnimation ? currnetlevelWidth : minimumWidth)
.animation(.easeInOut(duration: 1.5), value: isAnimation)
.animation(.easeInOut(duration: 1.2), value: isAnimation)
}
}
}
Expand All @@ -68,5 +68,5 @@ struct LevelProgressView: View {


#Preview {
LevelProgressView(level: .level3, conditionCount: 5)
LevelProgressView(level: .level3, conditionCount: 15)
}
4 changes: 2 additions & 2 deletions Projects/Features/MyPage/Sources/MyPageView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ public struct MyPageView: View {
RecentlyMemeListView(
memeDetailList: $viewModel.state.lastSeenMemeList,
memeClickHandler: { meme in
viewModel.dispatch(type: .onTappedMeme(meme: meme))
viewModel.dispatch(type: .onTappedRecentMeme(meme: meme))
}
)
SavedMemeListView(
memeDetailList: $viewModel.state.savedMemeList,
memeClickHandler: { meme in
viewModel.dispatch(type: .onTappedMeme(meme: meme))
viewModel.dispatch(type: .onTappedSavedMeme(meme: meme))
},
memeCopyHandler: { meme in
viewModel.dispatch(type: .onTappedCopyButton(meme: meme))
Expand Down
Loading
Loading