Skip to content

Instantly share code, notes, and snippets.

@st-small
Last active February 20, 2022 13:26
Show Gist options
  • Save st-small/4bdc5f582a86d244a91cd0abb808c938 to your computer and use it in GitHub Desktop.
Save st-small/4bdc5f582a86d244a91cd0abb808c938 to your computer and use it in GitHub Desktop.
AnalyticsManager
protocol AnalyticsProvider {
func sendAnalyticsEvent(named name: String, metadata: [String : Any]?)
}
import FirebaseAnalytics
struct FirebaseAnalyticsProvider: AnalyticsProvider {
func sendAnalyticsEvent(named name: String, metadata: [String : Any]?) {
Analytics.logEvent(name, parameters: metadata)
}
}
class AnalyticsManager {
private var provider: AnalyticsProvider?
static var shared = AnalyticsManager()
private init() {}
func configure(provider: AnalyticsProvider) {
self.provider = provider
}
func track(eventName: String, metadata: [String: Any]?) {
guard let provider = provider else {
print("Analytics provider not provided.")
return
}
provider.sendAnalyticsEvent(named: eventName, metadata: metadata)
}
}
// Somewhere else in the code - AppDelegate, perhaps.
AnalyticsManager.shared.configure(provider: FirebaseAnalyticsProvider())
AnalyticsManager.shared.track(eventName: "user_clicked_forgot_password",
metadata: ["userID": "aryamansharda"])
class LocalAnalyticsProvider: AnalyticsProvider {
func sendAnalyticsEvent(named name: String, metadata: [String : Any]?) {
print("\(name): \(metadata)")
}
}
// AppDelegate
#if DEBUG
AnalyticsManager.shared.configure(provider: LocalAnalyticsProvider())
#else
AnalyticsManager.shared.configure(provider: FirebaseAnalyticsProvider())
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment