From 239deb2b91964dde80f53edde20bfad481ef451e Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Wed, 12 Feb 2025 10:49:06 +0100 Subject: [PATCH] =?UTF-8?q?RES-32=20Ajouter=20la=20possibilit=C3=A9=20d?= =?UTF-8?q?=C3=A9sactiver=20des=20traqueurs=20sp=C3=A9cifiques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Generated/Analytics+GenAllScript.swift | 115 ++++++++++++++++-- SampleFiles/Tags/sampleTags.yml | 1 - SampleFiles/genAllRessources.sh | 2 +- .../Generator/AnalyticsGenerator.swift | 68 ++++++++--- .../Generator/FirebaseGenerator.swift | 9 ++ .../Analytics/Generator/MatomoGenerator.swift | 13 +- 6 files changed, 176 insertions(+), 32 deletions(-) diff --git a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift index db0bd0d..b26a508 100644 --- a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift +++ b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift @@ -1,5 +1,6 @@ // Generated by ResgenSwift.Analytics 1.2 +import MatomoTracker import FirebaseAnalytics // MARK: - Protocol @@ -10,12 +11,81 @@ protocol AnalyticsManagerProtocol { path: String, params: [String: Any]? ) + func logEvent( name: String, action: String, category: String, params: [String: Any]? ) + + func setEnable(_ enable: Bool) +} + +// MARK: - Matomo + +class MatomoAnalyticsManager: AnalyticsManagerProtocol { + + // MARK: - Properties + + private var tracker: MatomoTracker + + // MARK: - Init + + init(siteId: String, url: String) { + debugPrint("[Matomo service] Server URL: \(url)") + debugPrint("[Matomo service] Site ID: \(siteId)") + tracker = MatomoTracker( + siteId: siteId, + baseURL: URL(string: url)! + ) + + #if DEBUG + tracker.dispatchInterval = 5 + #endif + + #if DEBUG + tracker.logger = DefaultLogger(minLevel: .verbose) + #endif + + debugPrint("[Matomo service] Configured with content base: \(tracker.contentBase?.absoluteString ?? "-")") + debugPrint("[Matomo service] Opt out: \(tracker.isOptedOut)") + } + + // MARK: - Methods + + func logScreen( + name: String, + path: String, + params: [String: Any]? + ) { + guard let trackerUrl = tracker.contentBase?.absoluteString else { return } + + let urlString = URL(string: "\(trackerUrl)" + "/" + "\(path)" + "iOS") + tracker.track( + view: [name], + url: urlString + ) + } + + func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) { + tracker.track( + eventWithCategory: category, + action: action, + name: name, + number: nil, + url: nil + ) + } + + func setEnable(_ enable: Bool) { + tracker.isOptedOut = !enable + } } // MARK: - Firebase @@ -87,6 +157,9 @@ class FirebaseAnalyticsManager: AnalyticsManagerProtocol { parameters: parameters ) } + func setEnable(_ enable: Bool) { + Analytics.setAnalyticsCollectionEnabled(enable) + } } // MARK: - Manager @@ -96,18 +169,42 @@ class AnalyticsManager { // MARK: - Properties - var managers: [AnalyticsManagerProtocol] = [] + var managers: [TargetType: AnalyticsManagerProtocol] = [] - private var isEnabled: Bool = true + private var isEnabled: Bool { + if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" { + false + } else { + true + } + } // MARK: - Methods - func setAnalyticsEnabled(_ enable: Bool) { - isEnabled = enable + private func setAnalytics(enable: Bool) { + managers.forEach { (key, value) in + if analytics.contains(where: { type in + type == key + }) { + value.setEnable(enable) + } + } } - func configure() { - managers.append(FirebaseAnalyticsManager()) + func enableAnalytics(_ analytics: [TargetType] = TargetType.allCases) { + setAnalytics(enable: true) + } + + func disableAnalytics(_ analytics: [TargetType] = TargetType.allCases) { + setAnalytics(enable: false) + } + + func configure(siteId: String, url: String) { + managers[TrackerType.matomo] = MatomoAnalyticsManager( + siteId: siteId, + url: url + ) + managers[TrackerType.firebase] = FirebaseAnalyticsManager() } private func logScreen( @@ -117,7 +214,7 @@ class AnalyticsManager { ) { guard isEnabled else { return } - managers.forEach { manager in + managers.values.forEach { manager in manager.logScreen( name: name, path: path, @@ -134,7 +231,7 @@ class AnalyticsManager { ) { guard isEnabled else { return } - managers.forEach { manager in + managers.values.forEach { manager in manager.logEvent( name: name, action: action, @@ -146,7 +243,7 @@ class AnalyticsManager { // MARK: - section_one - static func logScreenS1DefOne() { + static func logScreenS1DefOne(title: String) { AnalyticsManager.shared.logScreen( name: "s1 def one \(title)", path: "s1_def_one/\(title)", diff --git a/SampleFiles/Tags/sampleTags.yml b/SampleFiles/Tags/sampleTags.yml index 05852d4..1b40b76 100644 --- a/SampleFiles/Tags/sampleTags.yml +++ b/SampleFiles/Tags/sampleTags.yml @@ -9,7 +9,6 @@ categories: parameters: - name: title type: String - value: try test replaceIn: name,path events: diff --git a/SampleFiles/genAllRessources.sh b/SampleFiles/genAllRessources.sh index c67596c..44c6e7d 100755 --- a/SampleFiles/genAllRessources.sh +++ b/SampleFiles/genAllRessources.sh @@ -54,7 +54,7 @@ FORCE_FLAG="$1" # Analytics swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \ - --target "firebase" \ + --target "firebase matomo" \ --extension-output-path "./Tags/Generated" \ --extension-name "Analytics" \ --extension-suffix "GenAllScript" \ diff --git a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift index 31c865e..f20c26e 100644 --- a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift @@ -59,14 +59,18 @@ class AnalyticsGenerator { \(Self.getImport()) \(Self.getAnalyticsProtocol()) + + \(Self.getTrackerTypeEnum()) + // MARK: - Manager class AnalyticsManager { + static var shared = AnalyticsManager() // MARK: - Properties - var managers: [AnalyticsManagerProtocol] = [] + var managers: [TrackerType: AnalyticsManagerProtocol] = [:] \(Self.getEnabledContent()) @@ -76,22 +80,49 @@ class AnalyticsGenerator { """ } + private static func getTrackerTypeEnum() -> String { + var result: [String] = [] + TrackerType.allCases.forEach { type in + result.append(" case \(type)") + } + + return """ + // MARK: - Traker Type + + enum TrackerType: CaseIterable { + \(result.joined(separator: "\n")) + } + """ + } + private static func getEnabledContent() -> String { """ private var isEnabled: Bool { - if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" { - false - } else { - _isEnabled + if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" { + false + } else { + true + } } - } - - private var _isEnabled: Bool = true // MARK: - Methods - func setAnalyticsEnabled(_ enable: Bool) { - _isEnabled = enable + private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) { + managers.forEach { (key, value) in + if analytics.contains(where: { type in + type == key + }) { + value.setEnable(enable) + } + } + } + + func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) { + setAnalytics(enable: true, analytics) + } + + func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) { + setAnalytics(enable: false, analytics) } """ } @@ -118,7 +149,7 @@ class AnalyticsGenerator { ) { guard isEnabled else { return } - managers.forEach { manager in + managers.values.forEach { manager in manager.logScreen( name: name, path: path, @@ -135,7 +166,7 @@ class AnalyticsGenerator { ) { guard isEnabled else { return } - managers.forEach { manager in + managers.values.forEach { manager in manager.logEvent( name: name, action: action, @@ -160,16 +191,14 @@ class AnalyticsGenerator { if targets.contains(TrackerType.matomo) { content.append(""" - managers.append( - MatomoAnalyticsManager( - siteId: siteId, - url: url - ) + managers[TrackerType.matomo] = MatomoAnalyticsManager( + siteId: siteId, + url: url ) """) } if targets.contains(TrackerType.firebase) { - content.append(" managers.append(FirebaseAnalyticsManager())") + content.append(" managers[TrackerType.firebase] = FirebaseAnalyticsManager()") } return [ @@ -190,12 +219,15 @@ class AnalyticsGenerator { path: String, params: [String: Any]? ) + func logEvent( name: String, action: String, category: String, params: [String: Any]? ) + + func setEnable(_ enable: Bool) } """ diff --git a/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift index e8a97fc..796b339 100644 --- a/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift @@ -14,6 +14,7 @@ enum FirebaseGenerator { FirebaseGenerator.header, FirebaseGenerator.logScreen, FirebaseGenerator.logEvent, + FirebaseGenerator.enable, FirebaseGenerator.footer ] .joined(separator: "\n") @@ -105,6 +106,14 @@ enum FirebaseGenerator { """ } + private static var enable: String { + """ + func setEnable(_ enable: Bool) { + Analytics.setAnalyticsCollectionEnabled(enable) + } + """ + } + private static var footer: String { """ } diff --git a/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift index cd789ca..f6f29ba 100644 --- a/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift @@ -15,6 +15,7 @@ enum MatomoGenerator { MatomoGenerator.setup, MatomoGenerator.logScreen, MatomoGenerator.logEvent, + MatomoGenerator.enable, MatomoGenerator.footer ] .joined(separator: "\n") @@ -71,7 +72,6 @@ enum MatomoGenerator { path: String, params: [String: Any]? ) { - guard !tracker.isOptedOut else { return } guard let trackerUrl = tracker.contentBase?.absoluteString else { return } let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS") @@ -92,8 +92,6 @@ enum MatomoGenerator { category: String, params: [String: Any]? ) { - guard !tracker.isOptedOut else { return } - tracker.track( eventWithCategory: category, action: action, @@ -102,6 +100,15 @@ enum MatomoGenerator { url: nil ) } + + """ + } + + private static var enable: String { + """ + func setEnable(_ enable: Bool) { + tracker.isOptedOut = !enable + } """ }