@@ -100,9 +100,14 @@ public class FirebaseDestination: DestinationPlugin {
100100 let name = formatFirebaseEventNames ( event. event)
101101 var parameters : [ String : Any ] ? = nil
102102 if let properties = event. properties? . dictionaryValue {
103- parameters = returnMappedFirebaseParameters ( properties)
103+ parameters = returnMappedFirebaseParameters ( properties, for : FirebaseDestination . mappedKeys )
104104 }
105-
105+
106+ if let campaign = event. context? . dictionaryValue ? [ " campaign " ] as? [ String : Any ] {
107+ let campaignParameters = returnMappedFirebaseParameters ( campaign, for: FirebaseDestination . campaignMappedKeys)
108+ parameters = ( parameters ?? [ : ] ) . merging ( campaignParameters) { ( current, _) in current }
109+ }
110+
106111 FirebaseAnalytics . Analytics. logEvent ( name, parameters: parameters)
107112 analytics? . log ( message: " Firebase logEventWithName \( name) parameters \( String ( describing: parameters) ) " )
108113 return event
@@ -149,24 +154,24 @@ extension FirebaseDestination {
149154 throw ( error)
150155 }
151156 }
152-
153- func returnMappedFirebaseParameters( _ properties: [ String : Any ] ) -> [ String : Any ] {
154-
155-
157+
158+ func returnMappedFirebaseParameters( _ properties: [ String : Any ] , for keys : [ String : String ] ) -> [ String : Any ] {
159+
160+
156161 var mappedValues = properties
157-
158- for (key, firebaseKey) in FirebaseDestination . mappedKeys {
162+
163+ for (key, firebaseKey) in keys {
159164 if var data = properties [ key] {
160165
161166 mappedValues. removeValue ( forKey: key)
162167
163168 if let castData = data as? [ String : Any ] {
164- data = returnMappedFirebaseParameters ( castData)
169+ data = returnMappedFirebaseParameters ( castData, for : keys )
165170 } else if let castArray = data as? [ Any ] {
166171 var updatedArray = [ Any] ( )
167172 for item in castArray {
168173 if let castDictionary = item as? [ String : Any ] {
169- updatedArray. append ( returnMappedFirebaseParameters ( castDictionary) )
174+ updatedArray. append ( returnMappedFirebaseParameters ( castDictionary, for : keys ) )
170175 } else {
171176 updatedArray. append ( item)
172177 }
@@ -233,6 +238,11 @@ private extension FirebaseDestination {
233238 " order_id " : FirebaseAnalytics . AnalyticsParameterTransactionID,
234239 " currency " : FirebaseAnalytics . AnalyticsParameterCurrency]
235240
241+ static let campaignMappedKeys = [ " source " : FirebaseAnalytics . AnalyticsParameterSource,
242+ " medium " : FirebaseAnalytics . AnalyticsParameterMedium,
243+ " name " : FirebaseAnalytics . AnalyticsParameterCampaign,
244+ " term " : FirebaseAnalytics . AnalyticsParameterTerm,
245+ " content " : FirebaseAnalytics . AnalyticsParameterContent]
236246}
237247
238248
0 commit comments