Last active
June 14, 2020 12:17
-
-
Save seyhunak/1f236d0dae2bdf44f75dce72f4597937 to your computer and use it in GitHub Desktop.
AnalyticsManager - Multiple Analytics Provider - Google, Firebase, Mixpanel, Facebook
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 } | |
}() | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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