diff --git a/Package.resolved b/Package.resolved index d911ac7..0582739 100644 --- a/Package.resolved +++ b/Package.resolved @@ -167,7 +167,7 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/mixpanel/mixpanel-swift-common.git", "state" : { - "revision" : "2c7bba7436d33fd7d950b4ea5f198cf3ca4c04a8", + "revision" : "ffd168d972a1bea7e86104f253a3e105c69217e5", "version" : "1.0.1" } }, diff --git a/Sources/UDFAnalytics/Analytics.swift b/Sources/UDFAnalytics/Analytics.swift index fc216a1..03ae3a2 100644 --- a/Sources/UDFAnalytics/Analytics.swift +++ b/Sources/UDFAnalytics/Analytics.swift @@ -35,7 +35,7 @@ public protocol Analytics { func setName(for screen: Screen, screenClass: String, with: [String: Any]?) func setUserProperties(_ userInfo: [String: Any], userId: String?) - func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String) + func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String, additionalParams: [String: Any]?) func setupTracking(with status: ATTrackingManager.AuthorizationStatus) func applicationDidBecomeActive() @@ -46,4 +46,9 @@ public extension Analytics { func setName(for screen: Screen, screenClass: String) { setName(for: screen, screenClass: screenClass, with: nil) } + + func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String) { + logRevenue(productId: productId, productTitle: productTitle, productItem: productItem, value: value, currency: currency, additionalParams: nil) + } + } diff --git a/Sources/UDFAnalytics/AnalyticsComposite.swift b/Sources/UDFAnalytics/AnalyticsComposite.swift index b1a2b73..4d89fcd 100644 --- a/Sources/UDFAnalytics/AnalyticsComposite.swift +++ b/Sources/UDFAnalytics/AnalyticsComposite.swift @@ -68,9 +68,9 @@ public extension AnalyticsComposite { components.forEach { $0.setUserProperties(userInfo, userId: userId) } } - func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String) { + func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String, additionalParams: [String: Any]?) { components.forEach { - $0.logRevenue(productId: productId, productTitle: productTitle, productItem: productItem, value: value, currency: currency) + $0.logRevenue(productId: productId, productTitle: productTitle, productItem: productItem, value: value, currency: currency, additionalParams: additionalParams) } } diff --git a/Sources/UDFAnalyticsAmplitude/AnalyticsAmplitude.swift b/Sources/UDFAnalyticsAmplitude/AnalyticsAmplitude.swift index 8cd1ca1..99d9bb0 100644 --- a/Sources/UDFAnalyticsAmplitude/AnalyticsAmplitude.swift +++ b/Sources/UDFAnalyticsAmplitude/AnalyticsAmplitude.swift @@ -53,7 +53,7 @@ public struct AnalyticsAmplitude: Analytics where Event amplitude.identity.userProperties = userInfo } - public func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String) { + public func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String, additionalParams: [String: Any]?) { let revenue = Revenue() revenue.productId = productId @@ -62,6 +62,12 @@ public struct AnalyticsAmplitude: Analytics where Event params.merge(productItem.params) { current, _ in current } } + if let additionalParams { + additionalParams.forEach { tuple in + params[tuple.key] = tuple.value + } + } + revenue.properties = params revenue.price = value.doubleValue revenue.currency = currency diff --git a/Sources/UDFAnalyticsAppsFlyer/AnalyticsAppsFlyer.swift b/Sources/UDFAnalyticsAppsFlyer/AnalyticsAppsFlyer.swift index 608b417..6b27fc3 100644 --- a/Sources/UDFAnalyticsAppsFlyer/AnalyticsAppsFlyer.swift +++ b/Sources/UDFAnalyticsAppsFlyer/AnalyticsAppsFlyer.swift @@ -80,7 +80,7 @@ public struct AnalyticsAppsFlyer: UDFAnalytics.Analytic appsFlyer.customData = userInfo } - public func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String) { + public func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String, additionalParams: [String: Any]?) { var parameters: [String: Any] = [ AFEventParamContentId: productId, AFEventParamContentType: productTitle, @@ -93,6 +93,13 @@ public struct AnalyticsAppsFlyer: UDFAnalytics.Analytic parameters[tuple.key] = tuple.value } } + + if let additionalParams { + additionalParams.forEach { tuple in + parameters[tuple.key] = tuple.value + } + } + appsFlyer.logEvent(AFEventPurchase, withValues: parameters) } diff --git a/Sources/UDFAnalyticsFacebook/AnalyticsFacebook.swift b/Sources/UDFAnalyticsFacebook/AnalyticsFacebook.swift index ed615a8..024e69f 100644 --- a/Sources/UDFAnalyticsFacebook/AnalyticsFacebook.swift +++ b/Sources/UDFAnalyticsFacebook/AnalyticsFacebook.swift @@ -97,14 +97,23 @@ public struct AnalyticsFacebook: UDFAnalytics.Analytics } } - public func logRevenue(productId: String, productTitle: String, productItem: UDFAnalytics.RevenueProduct?, value: NSNumber, currency: String) { + public func logRevenue(productId: String, productTitle: String, productItem: UDFAnalytics.RevenueProduct?, value: NSNumber, currency: String, additionalParams: [String: Any]?) { + + var parameters: [AppEvents.ParameterName: Any] = [ + AppEvents.ParameterName.contentID: productId, + AppEvents.ParameterName.contentType: "product", + ] + + if let additionalParams { + additionalParams.forEach { tuple in + parameters[.init(rawValue: tuple.key)] = tuple.value + } + } + facebook.logPurchase( amount: Double(truncating: value), currency: currency, - parameters: [ - AppEvents.ParameterName.contentID: productId, - AppEvents.ParameterName.contentType: productTitle - ] + parameters: parameters ) } diff --git a/Sources/UDFAnalyticsFirebase/AnalyticsFirebase.swift b/Sources/UDFAnalyticsFirebase/AnalyticsFirebase.swift index 64354c6..3eb133b 100644 --- a/Sources/UDFAnalyticsFirebase/AnalyticsFirebase.swift +++ b/Sources/UDFAnalyticsFirebase/AnalyticsFirebase.swift @@ -53,7 +53,7 @@ public struct AnalyticsFirebase: UDFAnalytics.Analytics } } - public func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String) { + public func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String, additionalParams: [String: Any]?) { var item: [String: Any] = [ AnalyticsParameterItemID: productId, AnalyticsParameterItemName: productTitle @@ -65,12 +65,18 @@ public struct AnalyticsFirebase: UDFAnalytics.Analytics } } - let parameters: [String: Any] = [ + var parameters: [String: Any] = [ AnalyticsParameterValue: value, AnalyticsParameterCurrency: currency, AnalyticsParameterItems: [item] ] + if let additionalParams { + additionalParams.forEach { tuple in + parameters[tuple.key] = tuple.value + } + } + FAnalytics.logEvent(AnalyticsEventPurchase, parameters: parameters) } diff --git a/Sources/UDFAnalyticsMixpanel/AnalyticsMixpanel.swift b/Sources/UDFAnalyticsMixpanel/AnalyticsMixpanel.swift index 48734d5..9ee4e4a 100644 --- a/Sources/UDFAnalyticsMixpanel/AnalyticsMixpanel.swift +++ b/Sources/UDFAnalyticsMixpanel/AnalyticsMixpanel.swift @@ -63,11 +63,21 @@ public struct AnalyticsMixpanel: UDFAnalytics.Analytics } } - public func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String) { + public func logRevenue(productId: String, productTitle: String, productItem: RevenueProduct?, value: NSNumber, currency: String, additionalParams: [String: Any]?) { + var params: [String: Any] = [:] + if let productItem { - mixpanel.people.trackCharge(amount: value.doubleValue, properties: toMixpanelProperties(productItem.params)) - } else { + params.merge(productItem.params) { current, _ in current } + } + + if let additionalParams { + params.merge(additionalParams) { current, _ in current } + } + + if params.isEmpty { mixpanel.people.trackCharge(amount: value.doubleValue) + } else { + mixpanel.people.trackCharge(amount: value.doubleValue, properties: toMixpanelProperties(params)) } }