Skip to content
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
27 changes: 27 additions & 0 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ let package = Package(
.package(url: "https://github.com/sindresorhus/LaunchAtLogin.git", from: "5.0.0"),
.package(url: "https://github.com/firebase/firebase-ios-sdk", from: "10.20.0"),
.package(url: "https://github.com/kean/Nuke.git", from: "12.4.0"),
.package(url: "https://github.com/airbnb/lottie-spm", from: "4.5.1")
.package(url: "https://github.com/airbnb/lottie-spm", from: "4.5.1"),
.package(url: "https://github.com/amplitude/Amplitude-Swift", from: "1.17.0")
]
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public extension TargetDependency.SPM {
static let FirebaseRemoteConfig = TargetDependency.external(name: "FirebaseRemoteConfig")
static let LaunchAtScreen = TargetDependency.external(name: "LaunchAtLogin")
static let Lottie = TargetDependency.external(name: "Lottie")
static let AmplitudeSwift = TargetDependency.external(name: "AmplitudeSwift")
}

public extension Package {
Expand Down
19 changes: 9 additions & 10 deletions Projects/App/iOS/Sources/Application/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,32 +43,32 @@ final class AppDelegate: UIResponder, UIApplicationDelegate {
session.delegate = self
session.activate()
}
TWLog.setUserProperty(property: .activeWatch, value: WCSession.default.isWatchAppInstalled ? "true" : "false")
TWLog.setUserProperty(property: .activeWatch, value: WCSession.default.isWatchAppInstalled ? true : false)

if let schoolTypeRawString = self.userDefaultsClient.getValue(.schoolType) as? String,
let schoolType = SchoolType(rawValue: schoolTypeRawString) {
TWLog.setUserProperty(property: .schoolType, value: schoolType.analyticsValue)
}

let isSkipWeekend = self.userDefaultsClient.getValue(.isSkipWeekend) as? Bool ?? false
TWLog.setUserProperty(property: .isSkipWeekend, value: "\(isSkipWeekend)")
TWLog.setUserProperty(property: .isSkipWeekend, value: isSkipWeekend)

let isCustomTimeTable = self.userDefaultsClient.getValue(.isOnModifiedTimeTable) as? Bool ?? false
TWLog.setUserProperty(property: .isCustomTimeTable, value: "\(isCustomTimeTable)")
TWLog.setUserProperty(property: .isCustomTimeTable, value: isCustomTimeTable)

let isSkipAfterDinner = self.userDefaultsClient.getValue(.isSkipAfterDinner) as? Bool ?? true
TWLog.setUserProperty(property: .isSkipAfterDinner, value: "\(isSkipAfterDinner)")
TWLog.setUserProperty(property: .isSkipAfterDinner, value: isSkipAfterDinner)

do {
let allergies = try self.localDatabaseClient.readRecords(as: AllergyLocalEntity.self)
.compactMap { AllergyType(rawValue: $0.allergy) ?? nil }

if allergies.isEmpty {
TWLog.setUserProperty(property: .allergies, value: nil)
TWLog.setUserProperty(property: .allergies, value: Optional<[String]>.none)
} else {
TWLog.setUserProperty(
property: .allergies,
value: allergies.map(\.analyticsValue).joined(separator: ",")
value: allergies.map(\.analyticsValue)
)
}

Expand Down Expand Up @@ -172,14 +172,13 @@ extension AppDelegate: WCSessionDelegate {
guard case let .success(infos) = widgetInfos, widgetCount != infos.count else { return }
self.userDefaultsClient.setValue(.widgetCount, infos.count)

TWLog.setUserProperty(property: .widgetCount, value: "\(infos.count)")
TWLog.setUserProperty(property: .widgetCount, value: infos.count)

let propertyString: String = infos
let propertyString: [String] = infos
.compactMap { (info: WidgetInfo) in
let string = WidgetUserPropertyBuiler(widgetInfo: info).buildString()
return string
}
.joined(separator: ",")

TWLog.setUserProperty(property: .widget, value: propertyString)
}
Expand All @@ -195,7 +194,7 @@ extension AppDelegate: WCSessionDelegate {

private extension AppDelegate {
func initializeAnalyticsUserID() {
if let uuid = keychainClient.getValue(.uuid) {
if let uuid = keychainClient.getValue(.uuid), !uuid.isEmpty {
TWLog.setUserID(id: uuid)
} else {
let newUUID = UUID().uuidString
Expand Down
2 changes: 2 additions & 0 deletions Projects/App/iOS/Support/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
<dict>
<key>API_KEY</key>
<string>$(API_KEY)</string>
<key>AMPLITUDE_API_KEY</key>
<string>$(AMPLITUDE_API_KEY)</string>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
Expand Down
2 changes: 2 additions & 0 deletions Projects/App/macOS/Support/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
<dict>
<key>API_KEY</key>
<string>$(API_KEY)</string>
<key>AMPLITUDE_API_KEY</key>
<string>$(AMPLITUDE_API_KEY)</string>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@ public struct AllergySettingCore: Reducer {
TWLog.event(log)

if state.selectedAllergyList.isEmpty {
TWLog.setUserProperty(property: .allergies, value: nil)
TWLog.setUserProperty(property: .allergies, value: Optional<[String]>.none)
} else {
TWLog.setUserProperty(
property: .allergies,
value: state.selectedAllergyList.map(\.analyticsValue).joined(separator: ",")
value: state.selectedAllergyList.map(\.analyticsValue)
)
}

Expand Down
8 changes: 4 additions & 4 deletions Projects/Feature/SettingsFeature/Sources/SettingsCore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -87,23 +87,23 @@ public struct SettingsCore: Reducer {

let log = IsSkipWeekendToggledEventLog(isSkipWeekend: isSkipWeekend)
TWLog.event(log)
TWLog.setUserProperty(property: .isSkipWeekend, value: "\(isSkipWeekend)")
TWLog.setUserProperty(property: .isSkipWeekend, value: isSkipWeekend)

case let .isSkipAfterDinnerChanged(isSkipAfterDinner):
state.isSkipAfterDinner = isSkipAfterDinner
userDefaultsClient.setValue(.isSkipAfterDinner, isSkipAfterDinner)

let log = IsSkipAfterDinnerToggledEventLog(isSkipAfterDinner: isSkipAfterDinner)
TWLog.event(log)
TWLog.setUserProperty(property: .isSkipAfterDinner, value: "\(isSkipAfterDinner)")
TWLog.setUserProperty(property: .isSkipAfterDinner, value: isSkipAfterDinner)

case let .isOnModifiedTimeTableChagned(isOnModifiedTimeTable):
state.isOnModifiedTimeTable = isOnModifiedTimeTable
userDefaultsClient.setValue(.isOnModifiedTimeTable, isOnModifiedTimeTable)

let log = IsOnModifiedTimeTableToggledEventLog(isOnModifiedTimeTable: isOnModifiedTimeTable)
TWLog.event(log)
TWLog.setUserProperty(property: .isCustomTimeTable, value: "\(isOnModifiedTimeTable)")
TWLog.setUserProperty(property: .isCustomTimeTable, value: isOnModifiedTimeTable)

case .schoolBlockButtonDidTap:
state.schoolSettingCore = .init()
Expand Down Expand Up @@ -177,7 +177,7 @@ public struct SettingsCore: Reducer {

case .alert(.presented(.githubIssueButtonDidTap)),
.confirmationDialog(.presented(.githubIssueButtonDidTap)):
guard let url = URL(string: "https://github.com/baekteun/TodayWhat-new/issues") else { break }
guard let url = URL(string: "https://github.com/todaywhat/TodayWhat-iOS/issues") else { break }
UIApplication.shared.open(url)

let log = InquireTypeSelectedEventLog(inquireType: .github)
Expand Down
3 changes: 2 additions & 1 deletion Projects/Shared/TWLog/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ let project = Project.module(
name: ModulePaths.Shared.TWLog.rawValue,
targets: [
.implements(module: .shared(.TWLog), product: .framework, dependencies: [
.shared(target: .FirebaseWrapper)
.shared(target: .FirebaseWrapper),
.SPM.AmplitudeSwift
])
]
)
46 changes: 42 additions & 4 deletions Projects/Shared/TWLog/Sources/TWLog.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import AmplitudeSwift
import FirebaseAnalytics
import Foundation
import OSLog
Expand All @@ -16,6 +17,25 @@ fileprivate extension OSLog {
* - error: 런타임 중 나타난 에러를 위한 level
*/
public enum TWLog {
nonisolated(unsafe) private static let amplitude: Amplitude = {
guard let apiKey = Bundle.main.object(forInfoDictionaryKey: "AMPLITUDE_API_KEY") as? String else {
return Amplitude(configuration: Configuration(apiKey: "AMPLITUDE_API_KEY"))
}
Comment thread
baekteun marked this conversation as resolved.

#if PROD
return Amplitude(
configuration: Configuration(apiKey: apiKey)
)
#else
return Amplitude(
configuration: Configuration(
apiKey: apiKey,
logLevel: .debug
)
)
#endif
}()
Comment thread
baekteun marked this conversation as resolved.

fileprivate enum Level {
case debug
case event
Expand All @@ -42,17 +62,34 @@ public enum TWLog {
public extension TWLog {
static func setUserID(id: String) {
Analytics.setUserID(id)
amplitude.setUserId(userId: id)

TWLog.log("Set UserID : \(id)", level: .event)
}

static func setUserProperty(key: String, value: String?) {
Analytics.setUserProperty(value, forName: key)
static func setUserProperty(key: String, value: Any) {
let isNil: Bool = {
let mirror = Mirror(reflecting: value)
if mirror.displayStyle == .optional {
return mirror.children.isEmpty
}
return false
}()

let identify = Identify()
if isNil {
Analytics.setUserProperty(nil, forName: key)
identify.unset(property: key)
} else {
Analytics.setUserProperty(String(describing: value), forName: key)
identify.set(property: key, value: value)
}
amplitude.identify(identify: identify)
Comment thread
baekteun marked this conversation as resolved.

TWLog.log("Set UserProperty : [\(key) = \(value ?? "nil")]", level: .event)
TWLog.log("Set UserProperty : [\(key) = \(isNil ? "nil" : "\(value)")]", level: .event)
}

static func setUserProperty(property: TWUserProperty, value: String?) {
static func setUserProperty(property: TWUserProperty, value: Any) {
Self.setUserProperty(key: property.rawValue, value: value)
}

Expand All @@ -64,6 +101,7 @@ public extension TWLog {
#if PROD
Analytics.logEvent(eventLog.name, parameters: eventLog.params)
#endif
amplitude.track(eventType: eventLog.name, eventProperties: eventLog.params)
TWLog.log("Logged \(eventLog.name)\n\(eventLog.params)", level: .event)
}

Expand Down
Loading