From 23bf3c3a821eed7dedb171a835801d99b2265d57 Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Thu, 7 Mar 2024 16:08:21 +0100 Subject: [PATCH 1/9] fix: Use category and action if not matomo --- .../Generated/Analytics+GenAllScript.swift | 81 ++----------------- SampleFiles/genAllRessources.sh | 2 +- .../Generator/FirebaseGenerator.swift | 7 +- .../Parser/AnalyticsFileParser.swift | 8 ++ 4 files changed, 20 insertions(+), 78 deletions(-) diff --git a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift index 3cd930c..5018618 100644 --- a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift +++ b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift @@ -1,6 +1,5 @@ // Generated by ResgenSwift.Analytics 1.2 -import MatomoTracker import FirebaseAnalytics // MARK: - Protocol @@ -15,72 +14,11 @@ protocol AnalyticsManagerProtocol { ) } -// 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) { - guard !tracker.isOptedOut else { return } - 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]? - ) { - guard !tracker.isOptedOut else { return } - - tracker.track( - eventWithCategory: category, - action: action, - name: name, - number: nil, - url: nil - ) - } -} - // MARK: - Firebase class FirebaseAnalyticsManager: AnalyticsManagerProtocol { func logScreen(name: String, path: String) { - var parameters = [ + let parameters = [ AnalyticsParameterScreenName: name as NSObject ] @@ -97,8 +35,9 @@ class FirebaseAnalyticsManager: AnalyticsManagerProtocol { params: [String: Any]? ) { var parameters: [String:NSObject] = [ + AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject, + AnalyticsParameterItemCategory: category as NSObject, "action": action as NSObject, - "category": category as NSObject, ] if let supplementaryParameters = params { @@ -114,7 +53,7 @@ class FirebaseAnalyticsManager: AnalyticsManagerProtocol { } Analytics.logEvent( - name.replacingOccurrences(of: [" "], with: "_"), + AnalyticsEventSelectContent, parameters: parameters ) } @@ -137,13 +76,7 @@ class AnalyticsManager { isEnabled = enable } - func configure(siteId: String, url: String) { - managers.append( - MatomoAnalyticsManager( - siteId: siteId, - url: url - ) - ) + func configure() { managers.append(FirebaseAnalyticsManager()) } @@ -178,7 +111,7 @@ class AnalyticsManager { func logScreenS1DefOne(title: String) { logScreen( name: "s1 def one \(title)", - path: "s1_def_one/\(title)" + path: "" ) } @@ -199,7 +132,7 @@ class AnalyticsManager { func logScreenS2DefOne() { logScreen( name: "s2 def one", - path: "s2_def_one/" + path: "" ) } } diff --git a/SampleFiles/genAllRessources.sh b/SampleFiles/genAllRessources.sh index 63c1949..4d62a1d 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 "matomo firebase" \ + --target "firebase" \ --extension-output-path "./Tags/Generated" \ --extension-name "Analytics" \ --extension-suffix "GenAllScript" diff --git a/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift index 1957156..5c54aca 100644 --- a/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift @@ -32,7 +32,7 @@ enum FirebaseGenerator { private static var logScreen: String { """ func logScreen(name: String, path: String) { - var parameters = [ + let parameters = [ AnalyticsParameterScreenName: name as NSObject ] @@ -54,8 +54,9 @@ enum FirebaseGenerator { params: [String: Any]? ) { var parameters: [String:NSObject] = [ + AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject, + AnalyticsParameterItemCategory: category as NSObject, "action": action as NSObject, - "category": category as NSObject, ] if let supplementaryParameters = params { @@ -71,7 +72,7 @@ enum FirebaseGenerator { } Analytics.logEvent( - name.replacingOccurrences(of: [" "], with: "_"), + AnalyticsEventSelectContent, parameters: parameters ) } diff --git a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift index 1137f8e..f667247 100644 --- a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift +++ b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift @@ -139,6 +139,14 @@ class AnalyticsFileParser { } definition.action = action + } else { + if let category = event.category { + definition.category = category + } + + if let action = event.action { + definition.action = action + } } return definition -- 2.39.5 From aa64ce5cf72d3b81ae6397745b7e409df5dcd806 Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Thu, 7 Mar 2024 16:31:26 +0100 Subject: [PATCH 2/9] fix: Static function --- SampleFiles/genAllRessources.sh | 3 ++- Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SampleFiles/genAllRessources.sh b/SampleFiles/genAllRessources.sh index 4d62a1d..c67596c 100755 --- a/SampleFiles/genAllRessources.sh +++ b/SampleFiles/genAllRessources.sh @@ -57,7 +57,8 @@ swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \ --target "firebase" \ --extension-output-path "./Tags/Generated" \ --extension-name "Analytics" \ - --extension-suffix "GenAllScript" + --extension-suffix "GenAllScript" \ + --static-members true #echo "\n-------------------------\n" # diff --git a/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift b/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift index 2f350cf..35b63d9 100644 --- a/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift +++ b/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift @@ -150,7 +150,7 @@ class AnalyticsDefinition { replaceIn() return """ static func \(getFuncName())\(getParameters()) { - \(getlogFunction()) + AnalyticsManager.shared.\(getlogFunction()) } """ } -- 2.39.5 From ab91c1c277ef76ed83eb287261fd4610f306c7a3 Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Fri, 8 Mar 2024 09:57:43 +0100 Subject: [PATCH 3/9] Update README.md --- README.md | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 580516f..435ac6b 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \ 6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppTags+GreatApp.swift`) 7. `--static-members` *(optional)*: generate static properties or not -> ⚠️ If extension name is not set or is `Tags`, it will generate the following typaloas `typealias Tags = String`. +> ⚠️ If extension name is not set or is `Tags`, it will generate the following typealias `typealias Tags = String`. ## Analytics @@ -141,7 +141,7 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \ Analytics will generate all you need to analyze UX with Matomo or Firebase Analytics. Input files are formatted in YAML. This command will generate a manager for each target and an AnalyticsManager. This is this one you will need to use. And it will generate a method for all tags you have declared in the YAML file. Next, you will need to use the `configure()` method of AnalyticsManager and if you want to use matomo to set up the `siteId` and the `url` of the site. ```sh -swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \ +swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/analytics.yml" \ --target "matomo firebase" \ --extension-output-path "./Analytics/Generated" \ --extension-name "AppAnalytics" \ @@ -159,7 +159,7 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \ 6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppAnalytics+GreatApp.swift`) 7. `--static-members` *(optional)*: generate static properties or not -> ⚠️ If extension name is not set or is `Analytics`, it will generate the following typaloas `typealias Analytics = String`. +> ⚠️ If extension name is not set or is `Analytics`, it will generate the following typealias `typealias Analytics = String`. ### YAML @@ -186,7 +186,7 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \ 7. `comments` *(optional)* 8. `parameters` *(optional)* - **Parameters** +**Parameters** You can use parameters in generate methods. @@ -199,6 +199,24 @@ You can use parameters in generate methods. This is section is equivalent of `%s | %d | %f | %@`. You can put the content of the parameter in *name*, *path*, *action*, *category*. You need to put `_` + `NAME OF THE PARAMETER` + `_` in the target and which target you want in the value of `replaceIn`. (name need to be in uppercase) +Example: +``` +events: + id: id_of_tag + name: _TITLE_ + tags: ios,droid + parameters: + - name: title + type: String + replaceIn: name +``` + +In this sample, we want to add the parameter `title` in the field `name`. So, we need to place `_TITLE_` in the field `name`. + +The generated method will be: +``` +logIdOfTag(title: String) +``` ## Images @@ -287,6 +305,15 @@ tags: extensionName: String? extensionSuffix: String? staticMembers: Bool? + +analytics: +- + inputFile: String + target: String + extensionOutputPath: String + extensionName: String? + extensionSuffix: String? + staticMembers: Bool? ``` ### Multiple configurations -- 2.39.5 From 922ed569590f69cdf4a8ec3a929ce735fd74d83b Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Thu, 18 Jul 2024 08:24:23 +0200 Subject: [PATCH 4/9] Add parameter defaultValue and value and add replaceIn parameter in another parameter --- .../Generated/Analytics+GenAllScript.swift | 62 +++++++++++++++---- SampleFiles/Tags/sampleTags.yml | 13 ++++ .../Generator/AnalyticsGenerator.swift | 18 +++++- .../Generator/FirebaseGenerator.swift | 36 +++++++++-- .../Analytics/Generator/MatomoGenerator.swift | 6 +- .../Analytics/Model/AnalyticsDefinition.swift | 44 +++++++++---- .../Analytics/Model/AnalyticsFile.swift | 2 + .../Analytics/Model/AnalyticsParameter.swift | 8 ++- .../Analytics/Model/ParameterType.swift | 15 +++++ .../Parser/AnalyticsFileParser.swift | 45 +++++++++++--- 10 files changed, 206 insertions(+), 43 deletions(-) create mode 100644 Sources/ResgenSwift/Analytics/Model/ParameterType.swift diff --git a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift index 5018618..7c52c33 100644 --- a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift +++ b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift @@ -5,7 +5,11 @@ import FirebaseAnalytics // MARK: - Protocol protocol AnalyticsManagerProtocol { - func logScreen(name: String, path: String) + func logScreen( + name: String, + path: String, + params: [String: Any]? + ) func logEvent( name: String, action: String, @@ -17,11 +21,27 @@ protocol AnalyticsManagerProtocol { // MARK: - Firebase class FirebaseAnalyticsManager: AnalyticsManagerProtocol { - func logScreen(name: String, path: String) { + func logScreen( + name: String, + path: String, + params: [String: Any]? + ) { let parameters = [ AnalyticsParameterScreenName: name as NSObject ] + if let supplementaryParameters = params { + for (newKey, newValue) in supplementaryParameters { + if parameters.contains(where: { (key: String, value: NSObject) in + key == newKey + }) { + continue + } + + parameters[newKey] = newValue as? NSObject + } + } + Analytics.logEvent( AnalyticsEventScreenView, parameters: parameters @@ -80,11 +100,19 @@ class AnalyticsManager { managers.append(FirebaseAnalyticsManager()) } - private func logScreen(name: String, path: String) { + private func logScreen( + name: String, + path: String, + params: [String: Any]? + ) { guard isEnabled else { return } managers.forEach { manager in - manager.logScreen(name: name, path: path) + manager.logScreen( + name: name, + path: path, + params: params + ) } } @@ -108,31 +136,39 @@ class AnalyticsManager { // MARK: - section_one - func logScreenS1DefOne(title: String) { - logScreen( + static func logScreenS1DefOne(title: String, test2: String = "test") { + AnalyticsManager.shared.logScreen( name: "s1 def one \(title)", - path: "" + path: "", + params: ["test2": test2] ) } - func logEventS1DefTwo(title: String, count: String) { - logEvent( + static func logEventS1DefTwo( + title: String, + count: String, + test2: String = "test" + ) { + AnalyticsManager.shared.logEvent( name: "s1 def two", action: "test", category: "test", params: [ "title": title, - "count": count + "count": count, + "test": "test", + "test2": test2 ] ) } // MARK: - section_two - func logScreenS2DefOne() { - logScreen( + static func logScreenS2DefOne() { + AnalyticsManager.shared.logScreen( name: "s2 def one", - path: "" + path: "", + params: nil ) } } diff --git a/SampleFiles/Tags/sampleTags.yml b/SampleFiles/Tags/sampleTags.yml index 4c91dd0..ce71f05 100644 --- a/SampleFiles/Tags/sampleTags.yml +++ b/SampleFiles/Tags/sampleTags.yml @@ -10,6 +10,13 @@ categories: - name: title type: String replaceIn: name,path + - name: test + type: String + value: test + replaceIn: name,path + - name: test2 + type: String + defaultValue: test events: - id: s1_def_two @@ -22,6 +29,12 @@ categories: type: String - name: count type: String + - name: test + type: String + value: test + - name: test2 + type: String + defaultValue: test - id: section_two screens: diff --git a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift index 02973c6..36d34c4 100644 --- a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift @@ -103,11 +103,19 @@ class AnalyticsGenerator { private static func getPrivateLogFunction() -> String { """ - private func logScreen(name: String, path: String) { + private func logScreen( + name: String, + path: String, + params: [String: Any]? + ) { guard isEnabled else { return } managers.forEach { manager in - manager.logScreen(name: name, path: path) + manager.logScreen( + name: name, + path: path, + params: params + ) } } @@ -169,7 +177,11 @@ class AnalyticsGenerator { // MARK: - Protocol protocol AnalyticsManagerProtocol { - func logScreen(name: String, path: String) + func logScreen( + name: String, + path: String, + params: [String: Any]? + ) func logEvent( name: String, action: String, diff --git a/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift index 5c54aca..e8a97fc 100644 --- a/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift @@ -31,11 +31,31 @@ enum FirebaseGenerator { private static var logScreen: String { """ - func logScreen(name: String, path: String) { - let parameters = [ + func logScreen( + name: String, + path: String, + params: [String: Any]? + ) { + var parameters = [ AnalyticsParameterScreenName: name as NSObject ] + if path.isEmpty == false { + parameters["path"] = path + "/iOS" as NSObject + } + + if let supplementaryParameters = params { + for (newKey, newValue) in supplementaryParameters { + if parameters.contains(where: { (key: String, value: NSObject) in + key == newKey + }) { + continue + } + + parameters[newKey] = newValue as? NSObject + } + } + Analytics.logEvent( AnalyticsEventScreenView, parameters: parameters @@ -54,10 +74,16 @@ enum FirebaseGenerator { params: [String: Any]? ) { var parameters: [String:NSObject] = [ - AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject, - AnalyticsParameterItemCategory: category as NSObject, - "action": action as NSObject, + AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject ] + + if category.isEmpty == false { + parameters["AnalyticsParameterItemCategory"] = category as NSObject + } + + if action.isEmpty == false { + parameters["action"] = action as NSObject + } if let supplementaryParameters = params { for (newKey, newValue) in supplementaryParameters { diff --git a/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift index 740cf95..cd789ca 100644 --- a/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift @@ -66,7 +66,11 @@ enum MatomoGenerator { private static var logScreen: String { """ - func logScreen(name: String, path: String) { + func logScreen( + name: String, + path: String, + params: [String: Any]? + ) { guard !tracker.isOptedOut else { return } guard let trackerUrl = tracker.contentBase?.absoluteString else { return } diff --git a/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift b/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift index 35b63d9..002c4b4 100644 --- a/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift +++ b/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift @@ -51,14 +51,21 @@ class AnalyticsDefinition { var params = parameters var result: String - if type == .screen { - params = params.filter { param in - !param.replaceIn.isEmpty + let paramsString = params.compactMap { parameter -> String? in + guard parameter.value.isEmpty else { return nil } + + let defaultValue: String + switch parameter.type { + case .bool: + defaultValue = "\(parameter.defaultValue.lowercased())" + case .int, .double: + defaultValue = "\(parameter.defaultValue)" + case .string: + defaultValue = "\"\(parameter.defaultValue)\"" } - } - - let paramsString = params.map { parameter in - "\(parameter.name): \(parameter.type)" + + let defaultValueString = parameter.defaultValue.isEmpty ? "" : " = \(defaultValue)" + return "\(parameter.name): \(parameter.type.rawValue)\(defaultValueString)" } if paramsString.count > 2 { @@ -84,7 +91,10 @@ class AnalyticsDefinition { case "path": path = path.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") case "category": category = category.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") case "action": action = action.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") - default: break + default: + if let param = parameters.first(where: { $0.name == rep }), param.value.isEmpty == false { + param.value = param.value.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") + } } } } @@ -99,7 +109,18 @@ class AnalyticsDefinition { } supplementaryParams.forEach { param in - params.append("\"\(param.name)\": \(param.name)") + if param.value.isEmpty { + params.append("\"\(param.name)\": \(param.name)") + } else { + switch param.type { + case .bool: + params.append("\"\(param.name)\": \(param.value.lowercased())") + case .int, .double: + params.append("\"\(param.name)\": \(param.value)") + case .string: + params.append("\"\(param.name)\": \"\(param.value)\"") + } + } } if params.count > 1 { @@ -113,14 +134,15 @@ class AnalyticsDefinition { [\(params.joined(separator: ", "))] """ } else { - result = "[:]" + result = "nil" } if type == .screen { return """ logScreen( name: "\(name)", - path: "\(path)" + path: "\(path)", + params: \(result) ) """ } else { diff --git a/Sources/ResgenSwift/Analytics/Model/AnalyticsFile.swift b/Sources/ResgenSwift/Analytics/Model/AnalyticsFile.swift index d775768..26b9122 100644 --- a/Sources/ResgenSwift/Analytics/Model/AnalyticsFile.swift +++ b/Sources/ResgenSwift/Analytics/Model/AnalyticsFile.swift @@ -41,5 +41,7 @@ struct AnalyticsDefinitionEventDTO: Codable { struct AnalyticsParameterDTO: Codable { var name: String var type: String + var value: String? + var defaultValue: String? var replaceIn: String? } diff --git a/Sources/ResgenSwift/Analytics/Model/AnalyticsParameter.swift b/Sources/ResgenSwift/Analytics/Model/AnalyticsParameter.swift index 9c659c3..048553a 100644 --- a/Sources/ResgenSwift/Analytics/Model/AnalyticsParameter.swift +++ b/Sources/ResgenSwift/Analytics/Model/AnalyticsParameter.swift @@ -9,13 +9,17 @@ import Foundation class AnalyticsParameter { var name: String - var type: String + var type: ParameterType + var value: String + var defaultValue: String var replaceIn: [String] = [] // MARK: - Init - init(name: String, type: String) { + init(name: String, type: ParameterType, value: String, defaultValue: String) { self.name = name self.type = type + self.value = value + self.defaultValue = defaultValue } } diff --git a/Sources/ResgenSwift/Analytics/Model/ParameterType.swift b/Sources/ResgenSwift/Analytics/Model/ParameterType.swift new file mode 100644 index 0000000..1f60ef9 --- /dev/null +++ b/Sources/ResgenSwift/Analytics/Model/ParameterType.swift @@ -0,0 +1,15 @@ +// +// File.swift +// +// +// Created by Loris Perret on 17/07/2024. +// + +import Foundation + +enum ParameterType: String { + case string = "String" + case int = "Int" + case double = "Double" + case bool = "Bool" +} diff --git a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift index f667247..b6ef6a6 100644 --- a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift +++ b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift @@ -30,25 +30,52 @@ class AnalyticsFileParser { } private static func getParameters(from parameters: [AnalyticsParameterDTO]) -> [AnalyticsParameter] { - parameters.map { dtoParameter in + func verify(value: String?, for type: ParameterType) { + guard let value, value.isEmpty == false else { return } + + switch type { + case .int: + if Int(value) == nil { + let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)") + print(error.description) + Analytics.exit(withError: error) + } + case .bool: + if Bool(value.lowercased()) == nil { + let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)") + print(error.description) + Analytics.exit(withError: error) + } + case .double: + if Double(value) == nil { + let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)") + print(error.description) + Analytics.exit(withError: error) + } + case .string: + break + } + } + + return parameters.map { dtoParameter in // Type let type = dtoParameter.type.uppercasedFirst() - guard - type == "String" || - type == "Int" || - type == "Double" || - type == "Bool" - else { + guard let typeEnum = ParameterType(rawValue: type) else { let error = AnalyticsError.invalidParameter("type of \(dtoParameter.name)") print(error.description) Analytics.exit(withError: error) } + + verify(value: dtoParameter.value, for: typeEnum) + verify(value: dtoParameter.defaultValue, for: typeEnum) let parameter = AnalyticsParameter( name: dtoParameter.name, - type: type + type: typeEnum, + value: dtoParameter.value ?? "", + defaultValue: dtoParameter.defaultValue ?? "" ) if let replaceIn = dtoParameter.replaceIn { @@ -103,6 +130,8 @@ class AnalyticsFileParser { Analytics.exit(withError: error) } + definition.path = path + } else if let path = screen.path { definition.path = path } -- 2.39.5 From df173406d4924fdb69493edeed78970b4505df51 Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Thu, 18 Jul 2024 11:36:11 +0200 Subject: [PATCH 5/9] Update README.md --- README.md | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 435ac6b..3b85ede 100644 --- a/README.md +++ b/README.md @@ -192,12 +192,41 @@ You can use parameters in generate methods. 1. `name`: name of the parameter 2. `type`: type of the parameter (Int, String, Bool, Double) +3. `value`: value of the parameter +4. `defaultValue`: defaultValue of the parameter 3. `replaceIn` *(optional)* +**Value** + +If you want to send another parameter with a static value. For example, you want to send to which screen the event is triggered. +You can add the parameter 'screenName' for example and its 'value' is 'Home'. With this, you do not need to specify the value in the function call. + +**DefaultValue** + +If you want ta add a parameter in the call of the function but you want to make it optionnal with a default value you need to use this property. + +Example: +``` +events: + id: id_of_tag + name: _TITLE_ + tags: ios,droid + parameters: + - name: title + type: String + defaultValue: someTitle +``` + +The generated method will be: +``` +logIdOfTag(title: String = "someTitle") +``` + **Replace in** This is section is equivalent of `%s | %d | %f | %@`. You can put the content of the parameter in *name*, *path*, *action*, *category*. -You need to put `_` + `NAME OF THE PARAMETER` + `_` in the target and which target you want in the value of `replaceIn`. (name need to be in uppercase) +You need to put `_` + `NAME OF THE PARAMETER` + `_` in the target and which target you want in the value of `replaceIn`. (name need to be in uppercase). +You can't use `value`and `replaceIn`in thge same time. Example: ``` @@ -218,6 +247,23 @@ The generated method will be: logIdOfTag(title: String) ``` +You can also want to replace a parameter in an other parameter. You can do this with the `replaceIn` property. The condition is that the parameter which will use the `replaceIn`need to have the `value`property + +Example: +``` +events: + id: id_of_tag + name: title + tags: ios,droid + parameters: + - name: something + type: String + value: test _TEXT_ + - name: text + type: String + replaceIn: something +``` + ## Images Images generator will generate images assets along with extensions to access those images easily. -- 2.39.5 From 6ea31a8030c270d638c09f36179c4ddc8f531d5c Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Thu, 18 Jul 2024 11:31:23 +0200 Subject: [PATCH 6/9] Fix some error when value and replaceIn --- .../Generated/Analytics+GenAllScript.swift | 26 +++++++++++++------ SampleFiles/Tags/sampleTags.yml | 8 +----- .../Analytics/Model/AnalyticsDefinition.swift | 3 +-- .../Parser/AnalyticsFileParser.swift | 6 +++++ 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift index 7c52c33..db0bd0d 100644 --- a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift +++ b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift @@ -26,10 +26,14 @@ class FirebaseAnalyticsManager: AnalyticsManagerProtocol { path: String, params: [String: Any]? ) { - let parameters = [ + var parameters = [ AnalyticsParameterScreenName: name as NSObject ] + if path.isEmpty == false { + parameters["path"] = path + "/iOS" as NSObject + } + if let supplementaryParameters = params { for (newKey, newValue) in supplementaryParameters { if parameters.contains(where: { (key: String, value: NSObject) in @@ -55,10 +59,16 @@ class FirebaseAnalyticsManager: AnalyticsManagerProtocol { params: [String: Any]? ) { var parameters: [String:NSObject] = [ - AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject, - AnalyticsParameterItemCategory: category as NSObject, - "action": action as NSObject, + AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject ] + + if category.isEmpty == false { + parameters["AnalyticsParameterItemCategory"] = category as NSObject + } + + if action.isEmpty == false { + parameters["action"] = action as NSObject + } if let supplementaryParameters = params { for (newKey, newValue) in supplementaryParameters { @@ -136,11 +146,11 @@ class AnalyticsManager { // MARK: - section_one - static func logScreenS1DefOne(title: String, test2: String = "test") { + static func logScreenS1DefOne() { AnalyticsManager.shared.logScreen( name: "s1 def one \(title)", - path: "", - params: ["test2": test2] + path: "s1_def_one/\(title)", + params: nil ) } @@ -167,7 +177,7 @@ class AnalyticsManager { static func logScreenS2DefOne() { AnalyticsManager.shared.logScreen( name: "s2 def one", - path: "", + path: "s2_def_one/", params: nil ) } diff --git a/SampleFiles/Tags/sampleTags.yml b/SampleFiles/Tags/sampleTags.yml index ce71f05..05852d4 100644 --- a/SampleFiles/Tags/sampleTags.yml +++ b/SampleFiles/Tags/sampleTags.yml @@ -9,14 +9,8 @@ categories: parameters: - name: title type: String + value: try test replaceIn: name,path - - name: test - type: String - value: test - replaceIn: name,path - - name: test2 - type: String - defaultValue: test events: - id: s1_def_two diff --git a/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift b/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift index 002c4b4..f014543 100644 --- a/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift +++ b/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift @@ -48,10 +48,9 @@ class AnalyticsDefinition { } private func getParameters() -> String { - var params = parameters var result: String - let paramsString = params.compactMap { parameter -> String? in + let paramsString = parameters.compactMap { parameter -> String? in guard parameter.value.isEmpty else { return nil } let defaultValue: String diff --git a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift index b6ef6a6..2d893a7 100644 --- a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift +++ b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift @@ -68,6 +68,12 @@ class AnalyticsFileParser { Analytics.exit(withError: error) } + if dtoParameter.value != nil, dtoParameter.replaceIn != nil { + let error = AnalyticsError.invalidParameter("you can't set 'value' and 'replaceIn' for \(dtoParameter.name)") + print(error.description) + Analytics.exit(withError: error) + } + verify(value: dtoParameter.value, for: typeEnum) verify(value: dtoParameter.defaultValue, for: typeEnum) -- 2.39.5 From 2ec4ebcc663adef26a8e30337c2cc8adeeb49313 Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Mon, 4 Nov 2024 14:00:27 +0100 Subject: [PATCH 7/9] Fix plugin swiftlint --- Package.resolved | 62 ++++-------------------------------------------- Package.swift | 6 +++-- 2 files changed, 8 insertions(+), 60 deletions(-) diff --git a/Package.resolved b/Package.resolved index 824db60..c83ac83 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,32 +1,5 @@ { "pins" : [ - { - "identity" : "collectionconcurrencykit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/JohnSundell/CollectionConcurrencyKit.git", - "state" : { - "revision" : "b4f23e24b5a1bff301efc5e70871083ca029ff95", - "version" : "0.2.0" - } - }, - { - "identity" : "cryptoswift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/krzyzanowskim/CryptoSwift.git", - "state" : { - "revision" : "c9c3df6ab812de32bae61fc0cd1bf6d45170ebf0", - "version" : "1.8.2" - } - }, - { - "identity" : "sourcekitten", - "kind" : "remoteSourceControl", - "location" : "https://github.com/jpsim/SourceKitten.git", - "state" : { - "revision" : "b6dc09ee51dfb0c66e042d2328c017483a1a5d56", - "version" : "0.34.1" - } - }, { "identity" : "swift-argument-parser", "kind" : "remoteSourceControl", @@ -37,39 +10,12 @@ } }, { - "identity" : "swift-syntax", + "identity" : "swiftlintplugin", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-syntax.git", + "location" : "https://github.com/lukepistrol/SwiftLintPlugin", "state" : { - "revision" : "6ad4ea24b01559dde0773e3d091f1b9e36175036", - "version" : "509.0.2" - } - }, - { - "identity" : "swiftlint", - "kind" : "remoteSourceControl", - "location" : "https://github.com/realm/SwiftLint.git", - "state" : { - "revision" : "f17a4f9dfb6a6afb0408426354e4180daaf49cee", - "version" : "0.54.0" - } - }, - { - "identity" : "swiftytexttable", - "kind" : "remoteSourceControl", - "location" : "https://github.com/scottrhoyt/SwiftyTextTable.git", - "state" : { - "revision" : "c6df6cf533d120716bff38f8ff9885e1ce2a4ac3", - "version" : "0.9.0" - } - }, - { - "identity" : "swxmlhash", - "kind" : "remoteSourceControl", - "location" : "https://github.com/drmohundro/SWXMLHash.git", - "state" : { - "revision" : "a853604c9e9a83ad9954c7e3d2a565273982471f", - "version" : "7.0.2" + "revision" : "5a65f4074975f811da666dfe31a19850950b1ea4", + "version" : "0.56.2" } }, { diff --git a/Package.swift b/Package.swift index f9cc54c..ab38332 100644 --- a/Package.swift +++ b/Package.swift @@ -10,7 +10,7 @@ let package = Package( // Dependencies declare other packages that this package depends on. .package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"), .package(url: "https://github.com/jpsim/Yams.git", from: "5.0.1"), - .package(url: "https://github.com/realm/SwiftLint.git", .upToNextMajor(from: "0.54.0")), + .package(url: "https://github.com/lukepistrol/SwiftLintPlugin", exact: "0.56.2"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. @@ -22,7 +22,9 @@ let package = Package( .product(name: "ArgumentParser", package: "swift-argument-parser"), "Yams" ], - plugins: [.plugin(name: "SwiftLintPlugin", package: "SwiftLint")] + plugins: [ + .plugin(name: "SwiftLint", package: "SwiftLintPlugin") + ] ), // Helper targets -- 2.39.5 From 9a05ce29b836930b0dcf983abe086ecbd0ad3d95 Mon Sep 17 00:00:00 2001 From: Quentin Bandera Date: Tue, 17 Dec 2024 16:30:22 +0100 Subject: [PATCH 8/9] Disable tag for previews --- .../Analytics/Generator/AnalyticsGenerator.swift | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift index 36d34c4..31c865e 100644 --- a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift @@ -78,12 +78,20 @@ class AnalyticsGenerator { private static func getEnabledContent() -> String { """ - private var isEnabled: Bool = true + private var isEnabled: Bool { + if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" { + false + } else { + _isEnabled + } + } + + private var _isEnabled: Bool = true // MARK: - Methods func setAnalyticsEnabled(_ enable: Bool) { - isEnabled = enable + _isEnabled = enable } """ } -- 2.39.5 From 239deb2b91964dde80f53edde20bfad481ef451e Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Wed, 12 Feb 2025 10:49:06 +0100 Subject: [PATCH 9/9] =?UTF-8?q?RES-32=20Ajouter=20la=20possibilit=C3=A9=20?= =?UTF-8?q?d=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 + } """ } -- 2.39.5