From 31112279ba744e0f98d4f8cd35bf23e8663069dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Ferr=C3=A3o?= Date: Tue, 13 Oct 2026 06:53:17 +0100 Subject: [PATCH] feat(SDK-794): expose IterableConfig.enableUnknownUserActivation Wire the UUA opt-in flag through iOS and Android Serialization with default false. --- CHANGELOG.md | 6 ++++++ .../java/com/iterable/reactnative/Serialization.java | 5 +++++ ios/RNIterableAPI/Serialization.swift | 4 ++++ src/core/classes/Iterable.test.ts | 9 +++++++++ src/core/classes/IterableConfig.ts | 10 ++++++++++ 5 files changed, 34 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0673d32c..3888d1535 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## Unreleased + +### Updates + +- Added `IterableConfig.enableUnknownUserActivation` (default `false`) to opt in to Unknown User Activation on the native SDK (SDK-794). Visitor consent via `Iterable.setVisitorUsageTracked` is also required before the native SDK stores unknown-user events. + ## 3.2.1 ### Fixes diff --git a/android/src/main/java/com/iterable/reactnative/Serialization.java b/android/src/main/java/com/iterable/reactnative/Serialization.java index 97aa52f49..10a4e3080 100644 --- a/android/src/main/java/com/iterable/reactnative/Serialization.java +++ b/android/src/main/java/com/iterable/reactnative/Serialization.java @@ -250,6 +250,11 @@ static IterableConfig.Builder getConfigFromReadableMap(ReadableMap iterableConte configBuilder.setEnableEmbeddedMessaging(iterableContextJSON.optBoolean("enableEmbeddedMessaging")); } + if (iterableContextJSON.has("enableUnknownUserActivation")) { + configBuilder.setEnableUnknownUserActivation( + iterableContextJSON.optBoolean("enableUnknownUserActivation")); + } + if (iterableContextJSON.has("retryPolicy")) { JSONObject retryPolicyJson = iterableContextJSON.getJSONObject("retryPolicy"); int maxRetry = retryPolicyJson.getInt("maxRetry"); diff --git a/ios/RNIterableAPI/Serialization.swift b/ios/RNIterableAPI/Serialization.swift index fee4c49b6..5b5f7293d 100644 --- a/ios/RNIterableAPI/Serialization.swift +++ b/ios/RNIterableAPI/Serialization.swift @@ -87,6 +87,10 @@ extension IterableConfig { config.enableEmbeddedMessaging = enableEmbeddedMessaging } + if let enableUnknownUserActivation = dict["enableUnknownUserActivation"] as? Bool { + config.enableUnknownUserActivation = enableUnknownUserActivation + } + if let dataRegion = dict["dataRegion"] as? NSNumber { switch dataRegion { case 0: diff --git a/src/core/classes/Iterable.test.ts b/src/core/classes/Iterable.test.ts index baccc3e41..f3cd0c844 100644 --- a/src/core/classes/Iterable.test.ts +++ b/src/core/classes/Iterable.test.ts @@ -326,6 +326,7 @@ describe('Iterable', () => { expect(config.customActionHandler).toBe(undefined); expect(config.dataRegion).toBe(IterableDataRegion.US); expect(config.enableEmbeddedMessaging).toBe(false); + expect(config.enableUnknownUserActivation).toBe(false); expect(config.encryptionEnforced).toBe(false); expect(config.expiringAuthTokenRefreshPeriod).toBe(60.0); expect(config.inAppDisplayInterval).toBe(30.0); @@ -345,6 +346,7 @@ describe('Iterable', () => { expect(configDict.customActionHandlerPresent).toBe(false); expect(configDict.dataRegion).toBe(IterableDataRegion.US); expect(configDict.enableEmbeddedMessaging).toBe(false); + expect(configDict.enableUnknownUserActivation).toBe(false); expect(configDict.encryptionEnforced).toBe(false); expect(configDict.expiringAuthTokenRefreshPeriod).toBe(60.0); expect(configDict.inAppDisplayInterval).toBe(30.0); @@ -365,6 +367,13 @@ describe('Iterable', () => { expect(configDict.androidWakeDelayMs).toBe(1500); expect(configDict.authCallbackTimeoutMs).toBe(2500); }); + + it('should include enableUnknownUserActivation in toDict() when set to true', () => { + const config = new IterableConfig(); + config.enableUnknownUserActivation = true; + const configDict = config.toDict(); + expect(configDict.enableUnknownUserActivation).toBe(true); + }); }); describe('urlHandler', () => { diff --git a/src/core/classes/IterableConfig.ts b/src/core/classes/IterableConfig.ts index b4de2fb41..d115213df 100644 --- a/src/core/classes/IterableConfig.ts +++ b/src/core/classes/IterableConfig.ts @@ -391,6 +391,15 @@ export class IterableConfig { */ authCallbackTimeoutMs = 6000; + /** + * When `true`, the native SDK may store and process events for unidentified + * (unknown) users. Defaults to `false`. + * + * Visitor consent via `Iterable.setVisitorUsageTracked` is also required + * before the native SDK stores unknown-user events or runs unknown-user flows. + */ + enableUnknownUserActivation = false; + /** * Should the SDK enable and use embedded messaging? * @@ -484,6 +493,7 @@ export class IterableConfig { pushPlatform: this.pushPlatform, encryptionEnforced: this.encryptionEnforced, retryPolicy: this.retryPolicy, + enableUnknownUserActivation: this.enableUnknownUserActivation, enableEmbeddedMessaging: this.enableEmbeddedMessaging, androidWakeDelayMs: this.androidWakeDelayMs, authCallbackTimeoutMs: this.authCallbackTimeoutMs,