Skip to content

Instantly share code, notes, and snippets.

@aryamansharda
Created February 10, 2022 07:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aryamansharda/c0b5399de9fde061e9d46b61887be527 to your computer and use it in GitHub Desktop.
Save aryamansharda/c0b5399de9fde061e9d46b61887be527 to your computer and use it in GitHub Desktop.
AnalyticsManager
// 1
protocol AnalyticsProvider {
func sendAnalyticsEvent(named name: String, metadata: [String : Any]?)
}
// 2
import FirebaseAnalytics
struct FirebaseAnalyticsProvider: AnalyticsProvider {
func sendAnalyticsEvent(named name: String, metadata: [String : Any]?) {
Analytics.logEvent(name, parameters: metadata)
}
}
// 3
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())
// 4
AnalyticsManager.shared.track(eventName: "user_clicked_forgot_password",
metadata: ["userID": "aryamansharda"])
// 5
class LocalAnalyticsProvider: AnalyticsProvider {
func sendAnalyticsEvent(named name: String, metadata: [String : Any]?) {
print("\(name): \(metadata)")
}
}
// 6
// 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