Releases: Iterable/iterable-android-sdk
Release list
3.10.0
Added
IterableUnknownUserHandlernow reports unknown user criteria fetch results via two optional methods:onCriteriaReceived(JSONObject criteria)on a successful fetch andonCriteriaFetchFailed(String reason)on failure. This lets apps act (e.g. track an event or update the user) as soon as criteria are available, without racing the asynchronous criteria fetch. Both have default no-op implementations, so existing handlers are unaffected. Callbacks are delivered on the main thread and may fire on every fetch (initialization, foregrounding, and when visitor usage tracking is enabled), so implementations should handle being called repeatedly.- Notification small-icon resolution now falls back through standard conventions — the Firebase
com.google.firebase.messaging.default_notification_iconmeta-data,@drawable/notification_icon(Expo / React Native), and@drawable/ic_notification— before defaulting to the app launcher icon. This fixes white-square notification icons on Android 5.0+ for apps that configure their icon through these conventions but don't setiterable_notification_icon. - Added a
DEFERresponse toIterableInAppHandler.InAppResponse, returned fromonNewInApp(message). UnlikeSKIP(which permanently drops the message),DEFERleaves the message pending so the SDK reconsiders it on a later display pass (next foreground, sync, or newly arrived message). Use it for temporary, per-message suppression — for example while a splash screen is showing. Existing handlers returningSHOW/SKIPare unaffected. - Added
IterableInAppManager.resumeInAppDisplay()so apps can prompt the SDK to re-evaluate pending in-app messages once they become ready to display (e.g. after a splash screen is dismissed), without waiting for the next foreground/sync trigger. This is independent ofsetAutoDisplayPaused(boolean): if auto display is paused,resumeInAppDisplay()will not show anything (and logs a warning) until you also callsetAutoDisplayPaused(false). - Added
IterableApi.getInAppManagerOrNull()andIterableApi.getEmbeddedManagerOrNull(), which returnnullwhen the SDK has not been initialized instead of a no-op manager. Use these when you need to detect the uninitialized state explicitly.
Changed
IterableApi.getInAppManager()andIterableApi.getEmbeddedManager()no longer throw aRuntimeExceptionwhen called beforeIterableApi.initialize(). They now log an error and return a no-op manager (empty lists, ignored commands). To detect the uninitialized state explicitly, use the newgetInAppManagerOrNull()/getEmbeddedManagerOrNull().
Migration guide
No action required. Existing IterableInAppHandler implementations returning SHOW/SKIP are unaffected.
To suppress an in-app temporarily (e.g. during a splash screen), return the new DEFER instead of SKIP — the message stays pending and is re-offered on a later display pass:
new IterableConfig.Builder().setInAppHandler(message ->
appIsShowingSplashScreen()
? IterableInAppHandler.InAppResponse.DEFER
: IterableInAppHandler.InAppResponse.SHOW
).build();Once ready, call IterableApi.getInstance().getInAppManager().resumeInAppDisplay() to re-check pending messages immediately instead of waiting for the next foreground/sync. Note that resumeInAppDisplay() does not unpause auto display — if you previously called setAutoDisplayPaused(true), call setAutoDisplayPaused(false) to resume.
Kotlin: add a
DEFERbranch to any exhaustivewhenoverInAppResponse.
3.9.0
Added
- Added support for in-app messages in fully Jetpack Compose apps using a Dialog-based renderer (
IterableInAppDialogNotification), removing the requirement for aFragmentActivity. - New
IterableInboxToolbarView— an opt-in, reusable toolbar component for the inbox UI. Configurable via the new Kotlin sealed interfaceInboxToolbarOption:None(default) — no toolbar; behavior is unchanged from prior SDK versions.Default— title-only toolbar above the inbox list.WithBackButton— title plus a back navigation icon. The default back action callsOnBackPressedDispatcher; override it by having the host Activity or parent Fragment implementIterableInboxToolbarBackListener.Custom(layoutRes)— inflates the integrator's own toolbar layout. Views tagged with the reserved ids@id/iterable_reserved_inbox_toolbar_actionand@id/iterable_reserved_inbox_toolbar_titleare auto-wired to the SDK's back handler and title binding respectively. Both ids are optional.- Configure programmatically via
IterableInboxFragment.newInstance(...)(new 2-arg and 6-arg overloads) or viaIterableInboxActivityintent extras (TOOLBAR_OPTION/TOOLBAR_TITLE). - Requires the host activity to use a
Theme.AppCompatdescendant when the toolbar is enabled.
- Added
appAlreadyRunningfield totrackPushOpen. NewtrackPushOpen(int, int, String, boolean, JSONObject)overload sends the value through; existing overloads default tofalse.
Fixed
- Fixed a
TransactionTooLargeExceptioncrash when displaying in-app messages with oversized HTML payloads. The HTML is no longer serialized into the fragment's saved instance state; it is reloaded from storage on recreation. In-apps with missing HTML now dismiss gracefully without registering tracking events, and a warning is logged for HTML payloads exceeding the recommended size.
3.8.0
What's new
- Better control over how in-app messages interact with system bars via the new
IterableInAppDisplayModeconfig option (FORCE_EDGE_TO_EDGEdefault,FOLLOW_APP_LAYOUT,FORCE_FULLSCREEN,FORCE_RESPECT_BOUNDS). Use this to fix close buttons hidden behind the status bar in fullscreen in-apps. No action required for existing apps. - Polished embedded card views with a configurable
imageScaleType, proper 16:9 image aspect ratio, correct card sizing, button spacing, and rounded-corner image clipping.IterableEmbeddedViewConfigparameters now have sensible defaults.
Fixed
ConcurrentModificationExceptioncrash during device token registration.NoSuchMethodExceptioncrash on Android 5–10 from an unsupportedMap.of()call.
Removed
- Legacy
AES/CBC/PKCS5Paddingencryption path inIterableDataEncryptor. The SDK now usesAES/GCM/NoPaddingexclusively. Only impacted Android versions below API 19, which haven't been supported sinceminSdkVersion21.
Full Changelog: 3.7.0...3.8.0
3.7.0
Fixed
- Replaced the deprecated
AsyncTask-based push notification handling withWorkManagerfor improved reliability and compatibility with modern Android versions. No action is required. - Fixed lost event tracking and missed API calls with an auto-retry feature for JWT token failures.
- Added
onEmbeddedMessagingSyncSucceeded()andonEmbeddedMessagingSyncFailed()callbacks toIterableEmbeddedUpdateHandlerfor monitoring embedded message sync results.
Full Changelog: 3.6.6...3.7.0
3.6.6
Fixed
- Fixed push notifications killing the existing activity when opened
- Fixed in-app message crash caused by WebView creation issues
- Fixed BROADCAST_CLOSE_SYSTEM_DIALOGS permission error on Android 12+ by restricting usage to Android SDK 30 and below
3.6.5
Fixed
- Fixed IterableEmbeddedView not having an empty constructor and causing crashes
- Fixed custom actions not working in background when SDK is not initialized
- Fixed double callback problem for setEmail with auto push registration
3.6.4
Fixed
- Updated
customPayloadof In-App Messages to be@Nullable
Added
- Made
isIterableDeepLinkmethod public
3.6.3
Fixed
- Improved in-app message sizing and positioning calculations for better stability and performance, especially during device orientation changes
3.6.2
Added
- Added background initialization support to prevent ANRs during app startup. Use
IterableApi.initializeInBackground()instead ofinitialize()to run initialization on a background thread while automatically queuing API calls until ready. See README for implementation details. - Added
IterableApi.onSDKInitialized()callback method to subscribe to initialization completion from multiple places in your app. - Added
setWebViewBaseUrl()configuration option toIterableConfigto support CORS for self-hosted custom fonts and external resources in WebView-based messages (in-app, inbox, embedded messages).
3.6.1
Added
- Added edge-to-edge support for in-app messages to ensure proper display on devices with notches, cutouts, and system bars. Test your in-app messages on various devices to ensure optimal display.
Note
⚠️ Important: The system applies white insets by default, which may contrast with dark-themed apps. Marketers can control the visual appearance using the background overlay option in the Iterable UI to choose appropriate background colors that work well with their app's theme.