Skip to content

Instantly share code, notes, and snippets.

@seyhunak
Last active June 14, 2020 12:17
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 seyhunak/1f236d0dae2bdf44f75dce72f4597937 to your computer and use it in GitHub Desktop.
Save seyhunak/1f236d0dae2bdf44f75dce72f4597937 to your computer and use it in GitHub Desktop.
AnalyticsManager - Multiple Analytics Provider - Google, Firebase, Mixpanel, Facebook
import UIKit
import Firebase
import FirebaseAnalytics
//MARK - Analytics Service
protocol AnalyticsService {
func initialize(application: UIApplication, launchOptions: [UIApplication.LaunchOptionsKey: Any]?)
func track(event: AnalyticsEvent, parameters: [AnalyticsEventParameter : String])
var trackingEvents: [AnalyticsEvent] { get }
}
extension AnalyticsService {
var trackingEvents: [AnalyticsEvent] {
return AnalyticsEvent.all
}
}
extension AnalyticsService {
func shouldTrack(event: AnalyticsEvent) -> Bool {
return trackingEvents.contains(event)
}
}
//MARK - Analytics Manager
final class AnalyticsManager: AnalyticsService {
internal private(set) var services = [AnalyticsService]()
static let instance = AnalyticsManager()
private init() {}
func add(service: AnalyticsService) {
self.services.append(service)
}
func initialize(application: UIApplication, launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
for service in services {
service.initialize(
application: application,
launchOptions: launchOptions
)
}
}
func track(event: AnalyticsEvent, parameters: [AnalyticsEventParameter : String]) {
for service in services where service.shouldTrack(event: event) {
service.track(event: event, parameters: parameters)
}
}
}
//MARK - Firebase
final class FirebaseAnalyticsService: AnalyticsService {
private static let TOKEN = "Your token"
func initialize(application: UIApplication, launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
FirebaseApp.configure()
}
func track(event: AnalyticsEvent, parameters: [AnalyticsEventParameter : String]) {
let param = Dictionary(uniqueKeysWithValues: parameters.map {key, val in (key.rawValue, val) })
Analytics.logEvent(event.rawValue, parameters: param)
}
var trackingEvents: [AnalyticsEvent] {
return [
AnalyticsEvent.paymentPay
]
}
}
//MARK - Event
enum AnalyticsEvent: String, CaseIterable {
case paymentPay = "payment_pay"
case transferSend = "transfer_send"
case registration = "registration"
case signIn = "sign_in"
case templatePay = "template_pay"
case blockCard = "block_card"
case smsNotification = "sms_notification"
case renameCard = "rename_card"
case login = "login"
}
enum AnalyticsEventParameter: String {
case vendor = "vendor"
case type = "type"
case isBlock = "isblock"
case isOpen = "is_open"
case oldName = "old_name"
case isSuccess = "issuccess"
case failCode = "fail_code"
case amount = "amount"
case newName = "new_name"
case failResult = "failresult"
case result = "result"
case currency = "currency"
}
extension AnalyticsEvent {
static var all: [AnalyticsEvent] = {
return AnalyticsEvent.allCases.map { $0 }
}()
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let firebaseAnalyticsService: FirebaseAnalyticsService = FirebaseAnalyticsService()
let cleverTapAnalyticsService: CleverTapAnalyticsService = CleverTapAnalyticsService()
let mixpanelAnalyticsService: MixpanelAnalyticsService = MixpanelAnalyticsService()
AnalyticsManager.instance.add(service: firebaseAnalyticsService)
AnalyticsManager.instance.add(service: cleverTapAnalyticsService)
AnalyticsManager.instance.add(service: mixpanelAnalyticsService)
AnalyticsManager.instance.track(event: .paymentPay, parameters: [.amount: "10"])
if let launchOptions = launchOptions as? [UIApplicationLaunchOptionsKey : Any]? {
AnalyticsManager.instance.initialize(application: application, launchOptions: launchOptions)
}
return true
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment