From 0e4d3c4a200e0fac6a8c6c0d2fd5e9c6f3666d33 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Thu, 21 Nov 2024 06:29:43 +0600 Subject: [PATCH 01/23] vuid optional make empty string --- .../OptimizelyClient+Decide.swift | 2 +- Sources/Optimizely/OptimizelyClient.swift | 18 +++++++++--------- Sources/Optimizely/VuidManager.swift | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift b/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift index c49d8e40..9a577f99 100644 --- a/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift +++ b/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift @@ -36,7 +36,7 @@ extension OptimizelyClient { /// - Parameter attributes: A map of attribute names to current user attribute values. /// - Returns: An OptimizelyUserContext associated with this OptimizelyClient public func createUserContext(attributes: [String: Any]? = nil) -> OptimizelyUserContext? { - guard enableVuid, let vuid = self.vuid else { + guard enableVuid else { logger.e("Vuid is not enabled or invalid VUID. User context not created.") return nil } diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 49953611..241aec1e 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -118,14 +118,14 @@ open class OptimizelyClient: NSObject { self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) - if let _vuid = self.vuidManager.vuid { - try? sendOdpEvent(type: Constants.ODP.eventType, - action: "client_initialized", - identifiers: [ - Constants.ODP.keyForVuid: _vuid - ], - data: [:]) - } + + try? sendOdpEvent(type: Constants.ODP.eventType, + action: "client_initialized", + identifiers: [ + Constants.ODP.keyForVuid: self.vuid + ], + data: [:]) + logger.d("SDK Version: \(version)") @@ -984,7 +984,7 @@ extension OptimizelyClient { } /// the device vuid (read only) - public var vuid: String? { + public var vuid: String { return self.vuidManager.vuid } diff --git a/Sources/Optimizely/VuidManager.swift b/Sources/Optimizely/VuidManager.swift index 6ffcb45a..0eb41c72 100644 --- a/Sources/Optimizely/VuidManager.swift +++ b/Sources/Optimizely/VuidManager.swift @@ -52,12 +52,12 @@ public class VuidManager { // MARK: - VUID Store extension VuidManager { - public var vuid: String? { + public var vuid: String { if self.enable { return _vuid } else { logger.w("VUID is not enabled.") - return nil + return "" } } From de1b40f911603273e583c89ffc0d9ba59178d7f2 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Thu, 21 Nov 2024 06:55:26 +0600 Subject: [PATCH 02/23] vuid enable check added --- Sources/Optimizely/OptimizelyClient.swift | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 241aec1e..708b6594 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -90,7 +90,7 @@ open class OptimizelyClient: NSObject { self.sdkKey = sdkKey self.sdkSettings = settings ?? OptimizelySdkSettings() self.defaultDecideOptions = defaultDecideOptions ?? [] - + super.init() self.vuidManager = VuidManager.shared self.vuidManager.configure(enable: self.sdkSettings.enableVuid) @@ -118,15 +118,15 @@ open class OptimizelyClient: NSObject { self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) - - try? sendOdpEvent(type: Constants.ODP.eventType, - action: "client_initialized", - identifiers: [ - Constants.ODP.keyForVuid: self.vuid - ], - data: [:]) - - + if self.enableVuid { + try? sendOdpEvent(type: Constants.ODP.eventType, + action: "client_initialized", + identifiers: [ + Constants.ODP.keyForVuid: self.vuid + ], + data: [:]) + + } logger.d("SDK Version: \(version)") } From 2c2f3be433a0343333926d19e0a7c75077372bd0 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Thu, 21 Nov 2024 07:24:41 +0600 Subject: [PATCH 03/23] fix: valid vuid added --- Sources/ODP/OdpEventManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/ODP/OdpEventManager.swift b/Sources/ODP/OdpEventManager.swift index 9f22323d..85d3b8cd 100644 --- a/Sources/ODP/OdpEventManager.swift +++ b/Sources/ODP/OdpEventManager.swift @@ -60,7 +60,7 @@ open class OdpEventManager { func identifyUser(vuid: String?, userId: String?) { var identifiers = [String: String]() - if let _vuid = vuid { + if let _vuid = vuid, VuidManager.isVuid(_vuid) { identifiers[Constants.ODP.keyForVuid] = _vuid } if let userId = userId { From 8c616833354878c8ebeeb8dc3f19a14714add40e Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Thu, 21 Nov 2024 07:59:33 +0600 Subject: [PATCH 04/23] fix: intialize event send by odpmanager --- Sources/ODP/OdpManager.swift | 3 +++ Sources/Optimizely/OptimizelyClient.swift | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index 40ba6ad3..f5f49a7b 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -61,6 +61,9 @@ public class OdpManager { self.odpConfig = OdpConfig() self.segmentManager.odpConfig = odpConfig self.eventManager.odpConfig = odpConfig + if let vuid = vuid, VuidManager.isVuid(vuid) { + self.eventManager.sendInitializedEvent(vuid: vuid) + } } func fetchQualifiedSegments(userId: String, diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 708b6594..20281c17 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -96,11 +96,11 @@ open class OptimizelyClient: NSObject { self.vuidManager.configure(enable: self.sdkSettings.enableVuid) self.odpManager = odpManager ?? OdpManager(sdkKey: sdkKey, disable: sdkSettings.disableOdp, + vuid: VuidManager.shared.vuid, cacheSize: sdkSettings.segmentsCacheSize, cacheTimeoutInSecs: sdkSettings.segmentsCacheTimeoutInSecs, timeoutForSegmentFetchInSecs: sdkSettings.timeoutForSegmentFetchInSecs, timeoutForEventDispatchInSecs: sdkSettings.timeoutForOdpEventInSecs) - self.odpManager.vuid = vuidManager.vuid let userProfileService = userProfileService ?? DefaultUserProfileService() let logger = logger ?? DefaultLogger() type(of: logger).logLevel = defaultLogLevel ?? .info @@ -118,15 +118,15 @@ open class OptimizelyClient: NSObject { self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) - if self.enableVuid { - try? sendOdpEvent(type: Constants.ODP.eventType, - action: "client_initialized", - identifiers: [ - Constants.ODP.keyForVuid: self.vuid - ], - data: [:]) - - } +// if self.enableVuid { +// try? sendOdpEvent(type: Constants.ODP.eventType, +// action: "client_initialized", +// identifiers: [ +// Constants.ODP.keyForVuid: self.vuid +// ], +// data: [:]) +// +// } logger.d("SDK Version: \(version)") } From 330814a1e8eb8cb051130c78d4ac75de74ef36ee Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Thu, 21 Nov 2024 08:32:50 +0600 Subject: [PATCH 05/23] clean up --- Sources/ODP/OdpManager.swift | 8 +++----- Sources/Optimizely/OptimizelyClient.swift | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index f5f49a7b..8e6254be 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -57,13 +57,11 @@ public class OdpManager { cacheTimeoutInSecs: cacheTimeoutInSecs, resourceTimeoutInSecs: timeoutForSegmentFetchInSecs) self.eventManager = eventManager ?? OdpEventManager(sdkKey: sdkKey, - resourceTimeoutInSecs: timeoutForEventDispatchInSecs) + resourceTimeoutInSecs: timeoutForEventDispatchInSecs) + self.odpConfig = OdpConfig() self.segmentManager.odpConfig = odpConfig self.eventManager.odpConfig = odpConfig - if let vuid = vuid, VuidManager.isVuid(vuid) { - self.eventManager.sendInitializedEvent(vuid: vuid) - } } func fetchQualifiedSegments(userId: String, @@ -122,7 +120,7 @@ public class OdpManager { var identifiersUpdated = identifiers - if identifiers[Constants.ODP.keyForVuid] == nil, let _vuid = vuid { + if identifiers[Constants.ODP.keyForVuid] == nil, let _vuid = vuid, VuidManager.isVuid(_vuid) { identifiersUpdated[Constants.ODP.keyForVuid] = _vuid } diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 20281c17..3f002197 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -96,11 +96,11 @@ open class OptimizelyClient: NSObject { self.vuidManager.configure(enable: self.sdkSettings.enableVuid) self.odpManager = odpManager ?? OdpManager(sdkKey: sdkKey, disable: sdkSettings.disableOdp, - vuid: VuidManager.shared.vuid, cacheSize: sdkSettings.segmentsCacheSize, cacheTimeoutInSecs: sdkSettings.segmentsCacheTimeoutInSecs, timeoutForSegmentFetchInSecs: sdkSettings.timeoutForSegmentFetchInSecs, timeoutForEventDispatchInSecs: sdkSettings.timeoutForOdpEventInSecs) + self.odpManager.vuid = self.vuidManager.vuid let userProfileService = userProfileService ?? DefaultUserProfileService() let logger = logger ?? DefaultLogger() type(of: logger).logLevel = defaultLogLevel ?? .info @@ -118,15 +118,15 @@ open class OptimizelyClient: NSObject { self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) -// if self.enableVuid { -// try? sendOdpEvent(type: Constants.ODP.eventType, -// action: "client_initialized", -// identifiers: [ -// Constants.ODP.keyForVuid: self.vuid -// ], -// data: [:]) -// -// } + if self.enableVuid { + try? sendOdpEvent(type: Constants.ODP.eventType, + action: "client_initialized", + identifiers: [ + Constants.ODP.keyForVuid: self.vuid + ], + data: [:]) + + } logger.d("SDK Version: \(version)") } From 63014ddb55ad212065399e77ea01ef0cd5c345b7 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Thu, 21 Nov 2024 09:27:01 +0600 Subject: [PATCH 06/23] clean up --- Sources/Optimizely+Decide/OptimizelyUserContext.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/Optimizely+Decide/OptimizelyUserContext.swift b/Sources/Optimizely+Decide/OptimizelyUserContext.swift index e21c16d6..5dec0add 100644 --- a/Sources/Optimizely+Decide/OptimizelyUserContext.swift +++ b/Sources/Optimizely+Decide/OptimizelyUserContext.swift @@ -85,10 +85,11 @@ public class OptimizelyUserContext { self.atomicForcedDecisions = AtomicProperty(property: nil, lock: lock) self.atomicQualifiedSegments = AtomicProperty(property: nil, lock: lock) if identify { + self.optimizely?.identifyUserToOdp(userId: userId) // async call so event building overhead is not blocking context creation - lock.async { - self.optimizely?.identifyUserToOdp(userId: userId) - } +// lock.async { +// self.optimizely?.identifyUserToOdp(userId: userId) +// } } } From 974324b225d62672d260305d413925db1256e858 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Thu, 21 Nov 2024 18:31:22 +0600 Subject: [PATCH 07/23] vuid manager thread safe added --- .../OptimizelyUserContext.swift | 7 +++--- Sources/Optimizely/VuidManager.swift | 23 +++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Sources/Optimizely+Decide/OptimizelyUserContext.swift b/Sources/Optimizely+Decide/OptimizelyUserContext.swift index 5dec0add..e21c16d6 100644 --- a/Sources/Optimizely+Decide/OptimizelyUserContext.swift +++ b/Sources/Optimizely+Decide/OptimizelyUserContext.swift @@ -85,11 +85,10 @@ public class OptimizelyUserContext { self.atomicForcedDecisions = AtomicProperty(property: nil, lock: lock) self.atomicQualifiedSegments = AtomicProperty(property: nil, lock: lock) if identify { - self.optimizely?.identifyUserToOdp(userId: userId) // async call so event building overhead is not blocking context creation -// lock.async { -// self.optimizely?.identifyUserToOdp(userId: userId) -// } + lock.async { + self.optimizely?.identifyUserToOdp(userId: userId) + } } } diff --git a/Sources/Optimizely/VuidManager.swift b/Sources/Optimizely/VuidManager.swift index 0eb41c72..d848d597 100644 --- a/Sources/Optimizely/VuidManager.swift +++ b/Sources/Optimizely/VuidManager.swift @@ -20,17 +20,19 @@ public class VuidManager { private var _vuid: String = "" private(set) var enable: Bool = false let logger = OPTLoggerFactory.getLogger() - + let lock = DispatchQueue(label: "vuid-manager") // a single vuid should be shared for all SDK instances public static let shared = VuidManager() public func configure(enable: Bool) { - self.enable = enable - if enable { - self._vuid = load() - } else { - self.remove() - self._vuid = "" + lock.async { + self.enable = enable + if enable { + self._vuid = self.load() + } else { + self.remove() + self._vuid = "" + } } } @@ -53,11 +55,8 @@ public class VuidManager { extension VuidManager { public var vuid: String { - if self.enable { - return _vuid - } else { - logger.w("VUID is not enabled.") - return "" + lock.sync { + return self._vuid } } From f455e4576c3a089af1075a34b0e43195f38118b4 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Fri, 22 Nov 2024 21:54:51 +0600 Subject: [PATCH 08/23] vuid check remove --- Sources/Optimizely+Decide/OptimizelyClient+Decide.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift b/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift index 9a577f99..85a8e7bb 100644 --- a/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift +++ b/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift @@ -36,10 +36,10 @@ extension OptimizelyClient { /// - Parameter attributes: A map of attribute names to current user attribute values. /// - Returns: An OptimizelyUserContext associated with this OptimizelyClient public func createUserContext(attributes: [String: Any]? = nil) -> OptimizelyUserContext? { - guard enableVuid else { - logger.e("Vuid is not enabled or invalid VUID. User context not created.") - return nil - } +// guard enableVuid else { +// logger.e("Vuid is not enabled or invalid VUID. User context not created.") +// return nil +// } return OptimizelyUserContext(optimizely: self, userId: vuid, attributes: attributes) } From 65fde6306b50b7fe58102075bff1bc6ce8d508f6 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Fri, 22 Nov 2024 22:29:47 +0600 Subject: [PATCH 09/23] fix vuid --- Sources/ODP/OdpEventManager.swift | 9 +++------ Sources/ODP/OdpManager.swift | 10 ++++++---- .../Optimizely+Decide/OptimizelyClient+Decide.swift | 8 ++++---- Sources/Optimizely/OptimizelyClient.swift | 6 +++--- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Sources/ODP/OdpEventManager.swift b/Sources/ODP/OdpEventManager.swift index 85d3b8cd..f58a6750 100644 --- a/Sources/ODP/OdpEventManager.swift +++ b/Sources/ODP/OdpEventManager.swift @@ -58,11 +58,8 @@ open class OdpEventManager { data: [:]) } - func identifyUser(vuid: String?, userId: String?) { - var identifiers = [String: String]() - if let _vuid = vuid, VuidManager.isVuid(_vuid) { - identifiers[Constants.ODP.keyForVuid] = _vuid - } + func identifyUser(vuid: String, userId: String?) { + var identifiers = [Constants.ODP.keyForVuid: vuid] if let userId = userId { identifiers[Constants.ODP.keyForUserId] = userId } @@ -72,7 +69,7 @@ open class OdpEventManager { identifiers: identifiers, data: [:]) } - + func sendEvent(type: String, action: String, identifiers: [String: String], data: [String: Any?]) { let event = OdpEvent(type: type, action: action, diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index 8e6254be..02fab2d0 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -91,14 +91,16 @@ public class OdpManager { logger.d("ODP identify event is not dispatched (ODP not integrated).") return } - + + var vuid = VuidManager.shared.vuid + var fsUserId: String? = userId if VuidManager.isVuid(userId) { // overwrite if userId is vuid (when userContext is created with vuid) - eventManager.identifyUser(vuid: userId, userId: nil) - } else { - eventManager.identifyUser(vuid: self.vuid, userId: userId) + vuid = userId + fsUserId = nil } + eventManager.identifyUser(vuid: vuid, userId: fsUserId) } /// Send an event to the ODP server. diff --git a/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift b/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift index 85a8e7bb..eda0d38a 100644 --- a/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift +++ b/Sources/Optimizely+Decide/OptimizelyClient+Decide.swift @@ -36,10 +36,10 @@ extension OptimizelyClient { /// - Parameter attributes: A map of attribute names to current user attribute values. /// - Returns: An OptimizelyUserContext associated with this OptimizelyClient public func createUserContext(attributes: [String: Any]? = nil) -> OptimizelyUserContext? { -// guard enableVuid else { -// logger.e("Vuid is not enabled or invalid VUID. User context not created.") -// return nil -// } + guard let vuid = self.vuid else { + logger.e("Vuid is not enabled or invalid VUID. User context not created.") + return nil + } return OptimizelyUserContext(optimizely: self, userId: vuid, attributes: attributes) } diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 3f002197..e45c9434 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -118,11 +118,11 @@ open class OptimizelyClient: NSObject { self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) - if self.enableVuid { + if vuidManager.enable { try? sendOdpEvent(type: Constants.ODP.eventType, action: "client_initialized", identifiers: [ - Constants.ODP.keyForVuid: self.vuid + Constants.ODP.keyForVuid: vuidManager.vuid ], data: [:]) @@ -984,7 +984,7 @@ extension OptimizelyClient { } /// the device vuid (read only) - public var vuid: String { + public var vuid: String? { return self.vuidManager.vuid } From 1f0b770849dd6d8366022fa14aaf59990925adc9 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Fri, 22 Nov 2024 22:31:47 +0600 Subject: [PATCH 10/23] fix: unit test --- Tests/OptimizelyTests-Common/VuidManagerTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/OptimizelyTests-Common/VuidManagerTests.swift b/Tests/OptimizelyTests-Common/VuidManagerTests.swift index 35bb653b..c3fabf4b 100644 --- a/Tests/OptimizelyTests-Common/VuidManagerTests.swift +++ b/Tests/OptimizelyTests-Common/VuidManagerTests.swift @@ -52,8 +52,8 @@ class VuidManagerTests: XCTestCase { let vuid2 = manager.vuid XCTAssertTrue(vuid1 == vuid2) - XCTAssert(VuidManager.isVuid(vuid1!)) - XCTAssert(VuidManager.isVuid(vuid2!)) + XCTAssert(VuidManager.isVuid(vuid1)) + XCTAssert(VuidManager.isVuid(vuid2)) UserDefaults.standard.removeObject(forKey: "optimizely-vuid") From 3a4be02260456dff53a429c1b426af958d022cad Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Fri, 22 Nov 2024 23:07:12 +0600 Subject: [PATCH 11/23] fix: vuid as client property --- Sources/ODP/OdpEventManager.swift | 9 ++++-- Sources/ODP/OdpManager.swift | 10 +++---- Sources/Optimizely/OptimizelyClient.swift | 34 +++++++++++++---------- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Sources/ODP/OdpEventManager.swift b/Sources/ODP/OdpEventManager.swift index f58a6750..85d3b8cd 100644 --- a/Sources/ODP/OdpEventManager.swift +++ b/Sources/ODP/OdpEventManager.swift @@ -58,8 +58,11 @@ open class OdpEventManager { data: [:]) } - func identifyUser(vuid: String, userId: String?) { - var identifiers = [Constants.ODP.keyForVuid: vuid] + func identifyUser(vuid: String?, userId: String?) { + var identifiers = [String: String]() + if let _vuid = vuid, VuidManager.isVuid(_vuid) { + identifiers[Constants.ODP.keyForVuid] = _vuid + } if let userId = userId { identifiers[Constants.ODP.keyForUserId] = userId } @@ -69,7 +72,7 @@ open class OdpEventManager { identifiers: identifiers, data: [:]) } - + func sendEvent(type: String, action: String, identifiers: [String: String], data: [String: Any?]) { let event = OdpEvent(type: type, action: action, diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index 02fab2d0..8e6254be 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -91,16 +91,14 @@ public class OdpManager { logger.d("ODP identify event is not dispatched (ODP not integrated).") return } - - var vuid = VuidManager.shared.vuid - var fsUserId: String? = userId + if VuidManager.isVuid(userId) { // overwrite if userId is vuid (when userContext is created with vuid) - vuid = userId - fsUserId = nil + eventManager.identifyUser(vuid: userId, userId: nil) + } else { + eventManager.identifyUser(vuid: self.vuid, userId: userId) } - eventManager.identifyUser(vuid: vuid, userId: fsUserId) } /// Send an event to the ODP server. diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index e45c9434..e106a897 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -60,7 +60,8 @@ open class OptimizelyClient: NSObject { var decisionService: OPTDecisionService! public var notificationCenter: OPTNotificationCenter? public var odpManager: OdpManager! - private var vuidManager: VuidManager! +// private var vuidManager: VuidManager! + public var vuid: String? let sdkSettings: OptimizelySdkSettings // MARK: - Public interfaces @@ -92,15 +93,18 @@ open class OptimizelyClient: NSObject { self.defaultDecideOptions = defaultDecideOptions ?? [] super.init() - self.vuidManager = VuidManager.shared - self.vuidManager.configure(enable: self.sdkSettings.enableVuid) + VuidManager.shared.configure(enable: self.sdkSettings.enableVuid) + if VuidManager.shared.enable { + self.vuid = VuidManager.shared.vuid + } + self.odpManager = odpManager ?? OdpManager(sdkKey: sdkKey, disable: sdkSettings.disableOdp, cacheSize: sdkSettings.segmentsCacheSize, cacheTimeoutInSecs: sdkSettings.segmentsCacheTimeoutInSecs, timeoutForSegmentFetchInSecs: sdkSettings.timeoutForSegmentFetchInSecs, timeoutForEventDispatchInSecs: sdkSettings.timeoutForOdpEventInSecs) - self.odpManager.vuid = self.vuidManager.vuid + let userProfileService = userProfileService ?? DefaultUserProfileService() let logger = logger ?? DefaultLogger() type(of: logger).logLevel = defaultLogLevel ?? .info @@ -118,11 +122,11 @@ open class OptimizelyClient: NSObject { self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) - if vuidManager.enable { + if let _vuid = vuid { try? sendOdpEvent(type: Constants.ODP.eventType, action: "client_initialized", identifiers: [ - Constants.ODP.keyForVuid: vuidManager.vuid + Constants.ODP.keyForVuid: _vuid ], data: [:]) @@ -983,15 +987,15 @@ extension OptimizelyClient { data: data) } - /// the device vuid (read only) - public var vuid: String? { - return self.vuidManager.vuid - } - - public var enableVuid: Bool { - return self.vuidManager.enable - } - +// /// the device vuid (read only) +// public var vuid: String? { +// return self.vuidManager.vuid +// } +// +// public var enableVuid: Bool { +// return self.vuidManager.enable +// } +// func identifyUserToOdp(userId: String) { odpManager.identifyUser(userId: userId) } From 5a4f529e26549268fb8d359284c4a5c90f5145ec Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Fri, 22 Nov 2024 23:35:41 +0600 Subject: [PATCH 12/23] fix: vuid assigned to odpmanager --- Sources/Optimizely/OptimizelyClient.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index e106a897..fbdf0d19 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -94,9 +94,7 @@ open class OptimizelyClient: NSObject { super.init() VuidManager.shared.configure(enable: self.sdkSettings.enableVuid) - if VuidManager.shared.enable { - self.vuid = VuidManager.shared.vuid - } + self.vuid = VuidManager.shared.vuid self.odpManager = odpManager ?? OdpManager(sdkKey: sdkKey, disable: sdkSettings.disableOdp, @@ -104,7 +102,7 @@ open class OptimizelyClient: NSObject { cacheTimeoutInSecs: sdkSettings.segmentsCacheTimeoutInSecs, timeoutForSegmentFetchInSecs: sdkSettings.timeoutForSegmentFetchInSecs, timeoutForEventDispatchInSecs: sdkSettings.timeoutForOdpEventInSecs) - + self.odpManager.vuid = self.vuid let userProfileService = userProfileService ?? DefaultUserProfileService() let logger = logger ?? DefaultLogger() type(of: logger).logLevel = defaultLogLevel ?? .info From eb6920051badd1bef3e709fc87dd6f5e52503c17 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Fri, 22 Nov 2024 23:36:50 +0600 Subject: [PATCH 13/23] clean up --- Sources/Optimizely/OptimizelyClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index fbdf0d19..1bb16861 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -98,11 +98,11 @@ open class OptimizelyClient: NSObject { self.odpManager = odpManager ?? OdpManager(sdkKey: sdkKey, disable: sdkSettings.disableOdp, + vuid: self.vuid, cacheSize: sdkSettings.segmentsCacheSize, cacheTimeoutInSecs: sdkSettings.segmentsCacheTimeoutInSecs, timeoutForSegmentFetchInSecs: sdkSettings.timeoutForSegmentFetchInSecs, timeoutForEventDispatchInSecs: sdkSettings.timeoutForOdpEventInSecs) - self.odpManager.vuid = self.vuid let userProfileService = userProfileService ?? DefaultUserProfileService() let logger = logger ?? DefaultLogger() type(of: logger).logLevel = defaultLogLevel ?? .info From 209ab181672f23bf8da257d701e7b09180381752 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Fri, 22 Nov 2024 23:54:20 +0600 Subject: [PATCH 14/23] clean up --- Sources/Optimizely/OptimizelyClient.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 1bb16861..d4fd59d6 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -94,6 +94,9 @@ open class OptimizelyClient: NSObject { super.init() VuidManager.shared.configure(enable: self.sdkSettings.enableVuid) + if self.sdkSettings.enableVuid { + self.vuid = VuidManager.shared.vuid + } self.vuid = VuidManager.shared.vuid self.odpManager = odpManager ?? OdpManager(sdkKey: sdkKey, From 4fb5b449fa495b2d98c35a9d102a719ea60e7483 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Sat, 23 Nov 2024 06:10:40 +0600 Subject: [PATCH 15/23] clean up --- Sources/Optimizely/OptimizelyClient.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index d4fd59d6..0dfc9ca2 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -97,7 +97,6 @@ open class OptimizelyClient: NSObject { if self.sdkSettings.enableVuid { self.vuid = VuidManager.shared.vuid } - self.vuid = VuidManager.shared.vuid self.odpManager = odpManager ?? OdpManager(sdkKey: sdkKey, disable: sdkSettings.disableOdp, From 593c2093bdd86a80de7fcd88bb9dd5e5f4cc9f96 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Sat, 23 Nov 2024 06:42:42 +0600 Subject: [PATCH 16/23] clean up --- Sources/ODP/OdpManager.swift | 9 ++++++++- Sources/Optimizely/OptimizelyClient.swift | 21 ++------------------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index 8e6254be..32e35e0f 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -81,6 +81,13 @@ public class OdpManager { completionHandler: completionHandler) } + func sendInitializedEvent() { + guard let vuid = self.vuid else { + return + } + eventManager?.sendInitializedEvent(vuid: vuid) + } + func identifyUser(userId: String) { guard enabled else { logger.d("ODP identify event is not dispatched (ODP disabled).") @@ -120,7 +127,7 @@ public class OdpManager { var identifiersUpdated = identifiers - if identifiers[Constants.ODP.keyForVuid] == nil, let _vuid = vuid, VuidManager.isVuid(_vuid) { + if identifiers[Constants.ODP.keyForVuid] == nil, let _vuid = vuid { identifiersUpdated[Constants.ODP.keyForVuid] = _vuid } diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 0dfc9ca2..fdd3fa5a 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -121,17 +121,9 @@ open class OptimizelyClient: NSObject { self.datafileHandler = HandlerRegistryService.shared.injectDatafileHandler(sdkKey: self.sdkKey) self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) - - if let _vuid = vuid { - try? sendOdpEvent(type: Constants.ODP.eventType, - action: "client_initialized", - identifiers: [ - Constants.ODP.keyForVuid: _vuid - ], - data: [:]) - + if vuid != nil { + self.odpManager.sendInitialEvent() } - logger.d("SDK Version: \(version)") } @@ -987,15 +979,6 @@ extension OptimizelyClient { data: data) } -// /// the device vuid (read only) -// public var vuid: String? { -// return self.vuidManager.vuid -// } -// -// public var enableVuid: Bool { -// return self.vuidManager.enable -// } -// func identifyUserToOdp(userId: String) { odpManager.identifyUser(userId: userId) } From 1afb1bb62975b7aab7c163a2ff720fa1f89dc6f1 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Sat, 23 Nov 2024 06:51:36 +0600 Subject: [PATCH 17/23] clean up --- Sources/Optimizely/OptimizelyClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index fdd3fa5a..a59ea0b0 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -122,7 +122,7 @@ open class OptimizelyClient: NSObject { self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) if vuid != nil { - self.odpManager.sendInitialEvent() + self.odpManager.sendInitializedEvent() } logger.d("SDK Version: \(version)") } From 31ca5504943ebb3fc20a449d08c5a3b3f65f96f5 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Sat, 23 Nov 2024 07:09:12 +0600 Subject: [PATCH 18/23] clean up --- Sources/ODP/OdpManager.swift | 2 +- Sources/Optimizely/VuidManager.swift | 23 ++++++++++--------- .../OptimizelyClientTests_ODP.swift | 3 +-- .../VuidManagerTests.swift | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index 32e35e0f..ca0f1f18 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -127,7 +127,7 @@ public class OdpManager { var identifiersUpdated = identifiers - if identifiers[Constants.ODP.keyForVuid] == nil, let _vuid = vuid { + if identifiers[Constants.ODP.keyForVuid] == nil, let _vuid = vuid, VuidManager.isVuid(_vuid) { identifiersUpdated[Constants.ODP.keyForVuid] = _vuid } diff --git a/Sources/Optimizely/VuidManager.swift b/Sources/Optimizely/VuidManager.swift index d848d597..2431b226 100644 --- a/Sources/Optimizely/VuidManager.swift +++ b/Sources/Optimizely/VuidManager.swift @@ -25,14 +25,12 @@ public class VuidManager { public static let shared = VuidManager() public func configure(enable: Bool) { - lock.async { - self.enable = enable - if enable { - self._vuid = self.load() - } else { - self.remove() - self._vuid = "" - } + self.enable = enable + if enable { + self._vuid = self.load() + } else { + self.remove() + self._vuid = "" } } @@ -54,9 +52,12 @@ public class VuidManager { // MARK: - VUID Store extension VuidManager { - public var vuid: String { - lock.sync { - return self._vuid + public var vuid: String? { + if self.enable { + return _vuid + } else { + logger.w("VUID is not enabled.") + return nil } } diff --git a/Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift b/Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift index 22600e79..9299eb11 100644 --- a/Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift +++ b/Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift @@ -190,13 +190,12 @@ class OptimizelyClientTests_ODP: XCTestCase { func testVuidEnabled() { let settings = OptimizelySdkSettings(enableVuid: true) optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, settings: settings) - XCTAssertTrue(optimizely.enableVuid) + XCTAssertNotNil(optimizely.vuid) XCTAssert(optimizely.vuid!.starts(with: "vuid_")) } func testVuidDiabled() { // Default client vuid diabled - XCTAssertFalse(optimizely.enableVuid) XCTAssertNil(optimizely.vuid) } diff --git a/Tests/OptimizelyTests-Common/VuidManagerTests.swift b/Tests/OptimizelyTests-Common/VuidManagerTests.swift index c3fabf4b..35bb653b 100644 --- a/Tests/OptimizelyTests-Common/VuidManagerTests.swift +++ b/Tests/OptimizelyTests-Common/VuidManagerTests.swift @@ -52,8 +52,8 @@ class VuidManagerTests: XCTestCase { let vuid2 = manager.vuid XCTAssertTrue(vuid1 == vuid2) - XCTAssert(VuidManager.isVuid(vuid1)) - XCTAssert(VuidManager.isVuid(vuid2)) + XCTAssert(VuidManager.isVuid(vuid1!)) + XCTAssert(VuidManager.isVuid(vuid2!)) UserDefaults.standard.removeObject(forKey: "optimizely-vuid") From 89d2b7bc05c5617ece8c76f65c70c1b83737becd Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Sat, 23 Nov 2024 07:25:55 +0600 Subject: [PATCH 19/23] clean up --- Sources/ODP/OdpEventManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/ODP/OdpEventManager.swift b/Sources/ODP/OdpEventManager.swift index 85d3b8cd..9f22323d 100644 --- a/Sources/ODP/OdpEventManager.swift +++ b/Sources/ODP/OdpEventManager.swift @@ -60,7 +60,7 @@ open class OdpEventManager { func identifyUser(vuid: String?, userId: String?) { var identifiers = [String: String]() - if let _vuid = vuid, VuidManager.isVuid(_vuid) { + if let _vuid = vuid { identifiers[Constants.ODP.keyForVuid] = _vuid } if let userId = userId { From eb7e292c2946ebcd62b22f36b08735564bb8e1d2 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Sat, 23 Nov 2024 07:48:24 +0600 Subject: [PATCH 20/23] clean up --- Sources/ODP/OdpManager.swift | 2 +- Sources/Optimizely/OptimizelyClient.swift | 1 + Sources/Optimizely/VuidManager.swift | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index ca0f1f18..32e35e0f 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -127,7 +127,7 @@ public class OdpManager { var identifiersUpdated = identifiers - if identifiers[Constants.ODP.keyForVuid] == nil, let _vuid = vuid, VuidManager.isVuid(_vuid) { + if identifiers[Constants.ODP.keyForVuid] == nil, let _vuid = vuid { identifiersUpdated[Constants.ODP.keyForVuid] = _vuid } diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index a59ea0b0..c591cafb 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -122,6 +122,7 @@ open class OptimizelyClient: NSObject { self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) if vuid != nil { + self.odpManager.vuid = vuid self.odpManager.sendInitializedEvent() } logger.d("SDK Version: \(version)") diff --git a/Sources/Optimizely/VuidManager.swift b/Sources/Optimizely/VuidManager.swift index 2431b226..f895ee42 100644 --- a/Sources/Optimizely/VuidManager.swift +++ b/Sources/Optimizely/VuidManager.swift @@ -20,7 +20,6 @@ public class VuidManager { private var _vuid: String = "" private(set) var enable: Bool = false let logger = OPTLoggerFactory.getLogger() - let lock = DispatchQueue(label: "vuid-manager") // a single vuid should be shared for all SDK instances public static let shared = VuidManager() From d206a3baf0331c91df3dfbf496e8e5ea6cfe4a01 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Sat, 23 Nov 2024 08:14:28 +0600 Subject: [PATCH 21/23] clean up --- Sources/ODP/OdpManager.swift | 7 ------- Sources/Optimizely/OptimizelyClient.swift | 13 +++++++++---- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index 32e35e0f..a307e0c8 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -81,13 +81,6 @@ public class OdpManager { completionHandler: completionHandler) } - func sendInitializedEvent() { - guard let vuid = self.vuid else { - return - } - eventManager?.sendInitializedEvent(vuid: vuid) - } - func identifyUser(userId: String) { guard enabled else { logger.d("ODP identify event is not dispatched (ODP disabled).") diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index c591cafb..27c4f367 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -100,7 +100,6 @@ open class OptimizelyClient: NSObject { self.odpManager = odpManager ?? OdpManager(sdkKey: sdkKey, disable: sdkSettings.disableOdp, - vuid: self.vuid, cacheSize: sdkSettings.segmentsCacheSize, cacheTimeoutInSecs: sdkSettings.segmentsCacheTimeoutInSecs, timeoutForSegmentFetchInSecs: sdkSettings.timeoutForSegmentFetchInSecs, @@ -121,9 +120,15 @@ open class OptimizelyClient: NSObject { self.datafileHandler = HandlerRegistryService.shared.injectDatafileHandler(sdkKey: self.sdkKey) self.decisionService = HandlerRegistryService.shared.injectDecisionService(sdkKey: self.sdkKey) self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) - if vuid != nil { - self.odpManager.vuid = vuid - self.odpManager.sendInitializedEvent() + if let _vuid = vuid { + self.odpManager.vuid = _vuid + try? sendOdpEvent(type: Constants.ODP.eventType, + action: "client_initialized", + identifiers: [ + Constants.ODP.keyForVuid: _vuid + ], + data: [:]) + } logger.d("SDK Version: \(version)") } From 2066d0f3761f31f206d7c069ca8821259cfb993e Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Mon, 25 Nov 2024 16:49:13 +0600 Subject: [PATCH 22/23] clean up --- Sources/Optimizely/OptimizelyClient.swift | 1 - Sources/Optimizely/VuidManager.swift | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 27c4f367..4b9d300f 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -60,7 +60,6 @@ open class OptimizelyClient: NSObject { var decisionService: OPTDecisionService! public var notificationCenter: OPTNotificationCenter? public var odpManager: OdpManager! -// private var vuidManager: VuidManager! public var vuid: String? let sdkSettings: OptimizelySdkSettings diff --git a/Sources/Optimizely/VuidManager.swift b/Sources/Optimizely/VuidManager.swift index f895ee42..47c22348 100644 --- a/Sources/Optimizely/VuidManager.swift +++ b/Sources/Optimizely/VuidManager.swift @@ -26,7 +26,7 @@ public class VuidManager { public func configure(enable: Bool) { self.enable = enable if enable { - self._vuid = self.load() + self._vuid = load() } else { self.remove() self._vuid = "" From 509d3ac9ef86b3c49d02c9ad1bb92c2bbc3b4a48 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam Date: Mon, 25 Nov 2024 18:24:41 +0600 Subject: [PATCH 23/23] vuid_optln: add test cases --- Sources/ODP/OdpManager.swift | 6 ++++++ Sources/Optimizely/OptimizelyClient.swift | 12 +++++------ .../OptimizelyClientTests_ODP.swift | 21 ++++++++++++++++--- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Sources/ODP/OdpManager.swift b/Sources/ODP/OdpManager.swift index a307e0c8..a69242b2 100644 --- a/Sources/ODP/OdpManager.swift +++ b/Sources/ODP/OdpManager.swift @@ -81,6 +81,12 @@ public class OdpManager { completionHandler: completionHandler) } + func sendInitializedEvent(vuid: String) throws { + guard enabled else { throw OptimizelyError.odpNotEnabled } + guard odpConfig.eventQueueingAllowed else { throw OptimizelyError.odpNotIntegrated } + eventManager.sendInitializedEvent(vuid: vuid) + } + func identifyUser(userId: String) { guard enabled else { logger.d("ODP identify event is not dispatched (ODP disabled).") diff --git a/Sources/Optimizely/OptimizelyClient.swift b/Sources/Optimizely/OptimizelyClient.swift index 4b9d300f..b99c9393 100644 --- a/Sources/Optimizely/OptimizelyClient.swift +++ b/Sources/Optimizely/OptimizelyClient.swift @@ -121,13 +121,7 @@ open class OptimizelyClient: NSObject { self.notificationCenter = HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey) if let _vuid = vuid { self.odpManager.vuid = _vuid - try? sendOdpEvent(type: Constants.ODP.eventType, - action: "client_initialized", - identifiers: [ - Constants.ODP.keyForVuid: _vuid - ], - data: [:]) - + sendInitializedEvent(vuid: _vuid) } logger.d("SDK Version: \(version)") } @@ -984,6 +978,10 @@ extension OptimizelyClient { data: data) } + func sendInitializedEvent(vuid: String) { + try? odpManager.sendInitializedEvent(vuid: vuid) + } + func identifyUserToOdp(userId: String) { odpManager.identifyUser(userId: userId) } diff --git a/Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift b/Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift index 9299eb11..882aa717 100644 --- a/Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift +++ b/Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift @@ -194,9 +194,24 @@ class OptimizelyClientTests_ODP: XCTestCase { XCTAssert(optimizely.vuid!.starts(with: "vuid_")) } - func testVuidDiabled() { - // Default client vuid diabled - XCTAssertNil(optimizely.vuid) + func test_register_vuid_autometically_when_enabled() { + let settings = OptimizelySdkSettings(enableVuid: true) + optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, settings: settings) + let eventManager = optimizely.odpManager.eventManager! + let evt = eventManager.eventQueue.getFirstItem()! + + XCTAssertEqual("fullstack", evt.type) + XCTAssertEqual("client_initialized", evt.action) + XCTAssertEqual(["vuid": optimizely.vuid], evt.identifiers) + XCTAssertNotNil(optimizely.vuid) + } + + func test_vuid_does_not_register_autometically_when_enabled_but_odp_disabled() { + let settings = OptimizelySdkSettings(disableOdp: true, enableVuid: true) + optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, settings: settings) + XCTAssertNotNil(optimizely.vuid) + let eventManager = optimizely.odpManager.eventManager + XCTAssertNil(eventManager) } // MARK: - OdpConfig Update