@@ -3,47 +3,52 @@ import FirebaseAnalytics
33import FirebaseCrashlytics
44import Logging
55
6+ @available ( * , deprecated, renamed: " GAnalytics " )
7+ public typealias GAnalyticsV2 = GAnalytics
8+
69/// GAnalytics
710///
811/// An abstraction class for bringing Google Analytics (Firebase and Crashlytics) into the app from the Firebase package.
912/// To provide user-specific insights for logging app metrics and performance.
10- @available ( * , deprecated, renamed: " GAnalyticsV2 " , message: " Please consider moving to GAnalyticsV2, this type will be replaced shortly " )
1113public struct GAnalytics {
12- private let app : AnalyticsApp . Type
13- private let analytics : AnalyticsLogger . Type
14+ static var analyticsApp : AnalyticsApp . Type = FirebaseApp . self
15+ public let analyticsPreferenceStore : AnalyticsPreferenceStore
16+ private let analyticsLogger : AnalyticsLogger . Type
1417 private let crashLogger : CrashLogger
15- private let preferenceStore : AnalyticsPreferenceStore
1618
1719 /// Additional parameters for the application
1820 public var additionalParameters = [ String: Any] ( )
1921
20- init ( app: AnalyticsApp . Type ,
21- analytics: AnalyticsLogger . Type ,
22- crashLogger: CrashLogger ,
23- preferenceStore: AnalyticsPreferenceStore ) {
24- self . app = app
25- self . analytics = analytics
22+ init ( analyticsPreferenceStore: AnalyticsPreferenceStore ,
23+ analyticsLogger: AnalyticsLogger . Type ,
24+ crashLogger: CrashLogger ) {
25+ self . analyticsPreferenceStore = analyticsPreferenceStore
26+ self . analyticsLogger = analyticsLogger
2627 self . crashLogger = crashLogger
27- self . preferenceStore = preferenceStore
28+
29+ crashLogger. setCrashlyticsCollectionEnabled ( true )
2830 }
2931
30- public init ( ) {
31- self . init ( app: FirebaseApp . self,
32- analytics: Analytics . self,
33- crashLogger: Crashlytics . crashlytics ( ) ,
34- preferenceStore: UserDefaultsPreferenceStore ( ) )
32+ public init ( analyticsPreferenceStore: AnalyticsPreferenceStore ) {
33+ self . init ( analyticsPreferenceStore: analyticsPreferenceStore,
34+ analyticsLogger: Analytics . self,
35+ crashLogger: Crashlytics . crashlytics ( ) )
3536 }
3637
3738 /// Initialises the Firebase instance when launching the app.
38- public func configure( ) {
39- app. configure ( )
39+ public static func configure( ) {
40+ analyticsApp. configure ( )
41+ }
42+
43+ /// Activates subscription to preference store events and updates based on existing preference.
44+ public func activate( ) {
4045 subscribeToPreferenceStore ( )
41- updateAnalyticsPreference ( preferenceStore . hasAcceptedAnalytics)
46+ updateAnalyticsPreference ( analyticsPreferenceStore . hasAcceptedAnalytics)
4247 }
4348
4449 private func subscribeToPreferenceStore( ) {
4550 Task {
46- for await value in preferenceStore . stream ( ) {
51+ for await value in analyticsPreferenceStore . stream ( ) {
4752 updateAnalyticsPreference ( value)
4853 }
4954 }
@@ -75,51 +80,46 @@ extension GAnalytics: AnalyticsService {
7580 return newCopy
7681 }
7782
78- /// Tracks screens adding screen tracking parameters in Firebase package.
79- public func trackScreen( _ screen: LoggableScreen ,
80- parameters params: [ String : Any ] = [ : ] ) {
81- var parameters = mergeAdditionalParameters ( params)
82-
83- parameters [ AnalyticsParameterScreenName] = screen. name
84- parameters [ AnalyticsParameterScreenClass] = screen. name
85-
86- analytics. logEvent ( AnalyticsEventScreenView,
87- parameters: parameters)
88- }
89-
90- public func trackScreen( _ screen: any LoggableScreenV2 ,
83+ public func trackScreen( _ screen: any LoggableScreen ,
9184 parameters params: [ String : Any ] ) {
9285 var parameters = mergeAdditionalParameters ( params)
9386
9487 parameters [ AnalyticsParameterScreenName] = screen. name
9588 parameters [ AnalyticsParameterScreenClass] = screen. type. description
9689
97- analytics . logEvent ( AnalyticsEventScreenView,
98- parameters: parameters)
90+ analyticsLogger . logEvent ( AnalyticsEventScreenView,
91+ parameters: parameters)
9992 }
10093
10194 /// Logs events accepting the event name and parameters in Firebase package.
10295 public func logEvent( _ event: LoggableEvent , parameters params: [ String : Any ] ) {
10396 let parameters = mergeAdditionalParameters ( params)
104- analytics . logEvent ( event. name, parameters: parameters)
97+ analyticsLogger . logEvent ( event. name, parameters: parameters)
10598 }
10699
107100 /// Logs crashes accepting an error in Firebase package.
108101 public func logCrash( _ error: NSError ) {
109102 crashLogger. record ( error: error, userInfo: nil )
110103 }
111104
105+ public func logCrash( _ crash: Error ) {
106+ let errorUserInfo = ( crash as? CustomNSError ) ? . errorUserInfo ?? [ : ]
107+
108+ let paramsToLog = additionalParameters. merging ( errorUserInfo) { lhs, _ in
109+ lhs
110+ }
111+
112+ crashLogger. record ( error: crash, userInfo: paramsToLog)
113+ }
114+
112115 /// Granting analytics and crashlytics permissions in Firebase package.
113- public func grantAnalyticsPermission( ) {
114- analytics. setAnalyticsCollectionEnabled ( true )
115- crashLogger. setCrashlyticsCollectionEnabled ( true )
116+ func grantAnalyticsPermission( ) {
117+ analyticsLogger. setAnalyticsCollectionEnabled ( true )
116118 }
117119
118120 /// Denying analytics and crashlytics permissions in Firebase package.
119- public func denyAnalyticsPermission( ) {
120- analytics. setAnalyticsCollectionEnabled ( false )
121- analytics. resetAnalyticsData ( )
122-
123- crashLogger. setCrashlyticsCollectionEnabled ( false )
121+ func denyAnalyticsPermission( ) {
122+ analyticsLogger. setAnalyticsCollectionEnabled ( false )
123+ analyticsLogger. resetAnalyticsData ( )
124124 }
125125}
0 commit comments