From d03e737d090e9bb1b5df63f144612a4c27707e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Ferr=C3=A3o?= Date: Sat, 10 Oct 2026 11:22:07 +0100 Subject: [PATCH 1/2] feat(SDK-554): expose IterableConfig.enableForegroundCriteriaFetch Wire through iOS and Android Serialization for UUA foreground criteria fetch. --- CHANGELOG.md | 6 ++++++ .../java/com/iterable/reactnative/Serialization.java | 4 ++++ ios/RNIterableAPI/Serialization.swift | 4 ++++ src/core/classes/Iterable.test.ts | 3 +++ src/core/classes/IterableConfig.ts | 9 +++++++++ 5 files changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 771a9fca4..3f04ac24a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## Unreleased + +### Updates + +- Added `IterableConfig.enableForegroundCriteriaFetch` (default `true`) to control whether the SDK fetches unknown-user targeting criteria when the app enters the foreground (SDK-554). + ## 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..9467990b1 100644 --- a/android/src/main/java/com/iterable/reactnative/Serialization.java +++ b/android/src/main/java/com/iterable/reactnative/Serialization.java @@ -246,6 +246,10 @@ static IterableConfig.Builder getConfigFromReadableMap(ReadableMap iterableConte configBuilder.setDataRegion(iterableDataRegion); } + if (iterableContextJSON.has("enableForegroundCriteriaFetch")) { + configBuilder.setEnableForegroundCriteriaFetch(iterableContextJSON.optBoolean("enableForegroundCriteriaFetch")); + } + if (iterableContextJSON.has("enableEmbeddedMessaging")) { configBuilder.setEnableEmbeddedMessaging(iterableContextJSON.optBoolean("enableEmbeddedMessaging")); } diff --git a/ios/RNIterableAPI/Serialization.swift b/ios/RNIterableAPI/Serialization.swift index fee4c49b6..33bd2b5a5 100644 --- a/ios/RNIterableAPI/Serialization.swift +++ b/ios/RNIterableAPI/Serialization.swift @@ -83,6 +83,10 @@ extension IterableConfig { config.useInMemoryStorageForInApps = useInMemoryStorageForInApp } + if let enableForegroundCriteriaFetch = dict["enableForegroundCriteriaFetch"] as? Bool { + config.enableForegroundCriteriaFetch = enableForegroundCriteriaFetch + } + if let enableEmbeddedMessaging = dict["enableEmbeddedMessaging"] as? Bool { config.enableEmbeddedMessaging = enableEmbeddedMessaging } diff --git a/src/core/classes/Iterable.test.ts b/src/core/classes/Iterable.test.ts index baccc3e41..f8b6d0295 100644 --- a/src/core/classes/Iterable.test.ts +++ b/src/core/classes/Iterable.test.ts @@ -325,6 +325,7 @@ describe('Iterable', () => { expect(config.checkForDeferredDeeplink).toBe(false); expect(config.customActionHandler).toBe(undefined); expect(config.dataRegion).toBe(IterableDataRegion.US); + expect(config.enableForegroundCriteriaFetch).toBe(true); expect(config.enableEmbeddedMessaging).toBe(false); expect(config.encryptionEnforced).toBe(false); expect(config.expiringAuthTokenRefreshPeriod).toBe(60.0); @@ -344,6 +345,7 @@ describe('Iterable', () => { expect(configDict.autoPushRegistration).toBe(true); expect(configDict.customActionHandlerPresent).toBe(false); expect(configDict.dataRegion).toBe(IterableDataRegion.US); + expect(configDict.enableForegroundCriteriaFetch).toBe(true); expect(configDict.enableEmbeddedMessaging).toBe(false); expect(configDict.encryptionEnforced).toBe(false); expect(configDict.expiringAuthTokenRefreshPeriod).toBe(60.0); @@ -1249,6 +1251,7 @@ describe('Iterable', () => { describe('embeddedManager', () => { it('should be disabled by default', () => { const config = new IterableConfig(); + expect(config.enableForegroundCriteriaFetch).toBe(true); expect(config.enableEmbeddedMessaging).toBe(false); expect(Iterable.embeddedManager.isEnabled).toBe(false); }); diff --git a/src/core/classes/IterableConfig.ts b/src/core/classes/IterableConfig.ts index b4de2fb41..5dcf64e04 100644 --- a/src/core/classes/IterableConfig.ts +++ b/src/core/classes/IterableConfig.ts @@ -391,6 +391,14 @@ export class IterableConfig { */ authCallbackTimeoutMs = 6000; + /** + * When `true` (the default), the SDK fetches unknown-user (anonymous) targeting + * criteria when the app enters the foreground. + * + * Set to `false` to disable that foreground fetch. + */ + enableForegroundCriteriaFetch = true; + /** * Should the SDK enable and use embedded messaging? * @@ -484,6 +492,7 @@ export class IterableConfig { pushPlatform: this.pushPlatform, encryptionEnforced: this.encryptionEnforced, retryPolicy: this.retryPolicy, + enableForegroundCriteriaFetch: this.enableForegroundCriteriaFetch, enableEmbeddedMessaging: this.enableEmbeddedMessaging, androidWakeDelayMs: this.androidWakeDelayMs, authCallbackTimeoutMs: this.authCallbackTimeoutMs, From 75272c61765852bed7306e8adb9fce84de013dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Ferr=C3=A3o?= Date: Sat, 10 Oct 2026 11:38:58 +0100 Subject: [PATCH 2/2] test(SDK-554): tighten IterableConfig serialization coverage Cover toDict() when enableForegroundCriteriaFetch is false. Remove duplicate default assert from embeddedManager tests. --- src/core/classes/Iterable.test.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/classes/Iterable.test.ts b/src/core/classes/Iterable.test.ts index f8b6d0295..12ff2b787 100644 --- a/src/core/classes/Iterable.test.ts +++ b/src/core/classes/Iterable.test.ts @@ -367,6 +367,13 @@ describe('Iterable', () => { expect(configDict.androidWakeDelayMs).toBe(1500); expect(configDict.authCallbackTimeoutMs).toBe(2500); }); + + it('should include enableForegroundCriteriaFetch in toDict() when set to false', () => { + const config = new IterableConfig(); + config.enableForegroundCriteriaFetch = false; + const configDict = config.toDict(); + expect(configDict.enableForegroundCriteriaFetch).toBe(false); + }); }); describe('urlHandler', () => { @@ -1251,7 +1258,6 @@ describe('Iterable', () => { describe('embeddedManager', () => { it('should be disabled by default', () => { const config = new IterableConfig(); - expect(config.enableForegroundCriteriaFetch).toBe(true); expect(config.enableEmbeddedMessaging).toBe(false); expect(Iterable.embeddedManager.isEnabled).toBe(false); });