All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
- New
IterableInAppDisplayModeenum to control how in-app messages interact with system bars. Configure viaIterableConfig.Builder.setInAppDisplayMode():FORCE_EDGE_TO_EDGE(default) — draws in-app content behind system bars with transparent status and navigation bars. This preserves the previous SDK behavior.FOLLOW_APP_LAYOUT— matches the host app's system bar configuration automatically.FORCE_FULLSCREEN— hides the status bar entirely for all in-app messages.FORCE_RESPECT_BOUNDS— ensures in-app content never overlaps system bars, keeping UI elements like the close button always accessible.
- Added
imageScaleTypetoIterableEmbeddedViewConfigto allow configuring how the image is scaled within the 16:9 container for embedded message views. - Added default values to all
IterableEmbeddedViewConfigconstructor parameters for easier configuration.
- Fixed
IterableEmbeddedViewcard layout rendering issues: image now displays at a 16:9 aspect ratio instead of collapsing to zero height, card container no longer expands to fill the parent, missing end margin on the card is now applied, bottom spacing on buttons is no longer cut off, and the image properly clips to the card's rounded corners. - Fixed
ConcurrentModificationExceptioncrash during device token registration caused by concurrent access todeviceAttributes. - Fixed possible
NoSuchMethodExceptioncrash on Android 5-10 caused by usingMap.of()which is unavailable on those versions
No action required for most apps. The default FORCE_EDGE_TO_EDGE preserves the existing behavior where in-app content draws behind system bars.
If the close button in your fullscreen in-app messages is obscured by the status bar, you can fix it by choosing one of these modes:
// Automatically match the host app's system bar configuration
IterableConfig config = new IterableConfig.Builder()
.setInAppDisplayMode(IterableInAppDisplayMode.FOLLOW_APP_LAYOUT)
.build();// Ensure in-app content never goes behind system bars
IterableConfig config = new IterableConfig.Builder()
.setInAppDisplayMode(IterableInAppDisplayMode.FORCE_RESPECT_BOUNDS)
.build();- Removed insecure
AES/CBC/PKCS5Paddingencryption fromIterableDataEncryptor. The SDK now exclusively usesAES/GCM/NoPadding. The legacy CBC algorithm was only used on Android versions below KitKat (API 19), which have been unsupported sinceminSdkVersionwas raised to 21.
- 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.
- Fixed push notifications killing the existing activity when opened
- Fixed in-app message crash caused by WebView creation issues
- Fixed
BROADCAST_CLOSE_SYSTEM_DIALOGSpermission error on Android 12+ by restricting usage to Android SDK 30 and below
- 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
- Updated
customPayloadof In-App Messages to be@Nullable
- Made
isIterableDeepLinkmethod public
- Improved in-app message sizing and positioning calculations for better stability and performance, especially during device orientation changes
- 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).
- 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.
⚠️ 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.
- Introduces support for Unknown user activation: a feature that allows marketers to convert valuable visitors into customers. With this feature, the SDK can:
- Fetch unknown user profile creation criteria from your Iterable project, and then automatically create Iterable user profiles for unknown users who meet these criteria.
- Save information about a visitor's previous interactions with your application to their unknown user profile, after it's created.
- Display personalized messages for unknown users (in-app, push, and embedded messages).
- Merge unknown user profiles into an existing, known user profiles (when needed).
IterableConfigis updated with anenableUnknownUserActivationflag that needs to be set to true to allow use of the unknown user activation functionality- Unknown user activation is currently in public beta. If you'd like to learn more about it or discuss using it, talk to your Iterable customer success manager (who can also provide detailed documentation).
- To learn more, read Unknown User Activation: Developer Docs.
- Added offline support for disable push API requests, allowing requests to be queued and processed when network connectivity is restored
- Fixed KeyStoreException crash on Nexus 5 devices by adding proper error handling for SecretKeyEntry operations
- Added graceful fallback to plaintext storage when encryption initialization fails
- Fixed JWT token refresh issues when app is in background, ensuring reliable token refresh in all app states
- Fixed inbox metadata null check issues to prevent crashes in inbox display
- Migrated embedded message OOTB views to use Material Design buttons for better UI consistency
- Updated sample app Gradle configuration to use newer versions for better compatibility
- Added consent logging functionality for unknown user activation feature
- Enhanced unknown user activation with improved criteria fetching and user ID generation logic
- Fixed unknown user activation to ensure criteria is fetched on foregrounding the app by default
- Fixed unknown user ID generation to only occur once when multiple track calls are made
- Fixed consent timestamp handling when consent is revoked
- Fixed auth token refresh when app is in background, ensuring reliable token refresh in all app states.
- SDK now retries
trackPushOpencall when JWT is missing, expired or invalid, ensuring reliable push tracking after token acquisition.
EmbeddedSessionManagermethods are now public (previously library-scoped)
- Added timeout for crypto operations to prevent ANRs.
The Iterable SDK provides an option to disable encryption for keychain storage. By default, encryption is enabled to securely store sensitive user data.
To disable keychain encryption, set the keychainEncryption parameter to false when initializing the SDK:
IterableConfig config = new IterableConfig.Builder()
.setKeychainEncryption(false) // Disable encryption for keychain storage
.build();
IterableApi.initialize(context, apiKey, config);- Thanks to @MGaetan89 for modernizing the test infrastructure by replacing deprecated Robolectric APIs with AndroidX Test alternatives and removing unnecessary dependencies.
- Fixed issue where text container shrinks when buttons are not present for the embedded OOTB views.
- Fixed issue where crashes are occurring due to conflicts in deep link handling
- Fixed data storage failures by adding plain text fallback when encryption fails.
- Added support for providing a list of placement ids to sync only certain placement ids.
- support for pre-release automation
- This release includes fixes for the Unknown user activation private beta:
- Criteria is now fetched on foregrounding the app by default. This feature can be turned off setting enableForegroundCriteriaFetch flag to false.
- Unknown user ids are only generated once when multiple track calls are made.
- Unknown user activation is currently in private beta. If you'd like to learn more about it or discuss using it, talk to your Iterable customer success manager (who can also provide detailed documentation).
- Added
mobileFrameworkInfoconfiguration option toIterableConfigto identify the mobile framework (Flutter, React Native, or Native) being used with the SDK. - Support for push notifications with text input. Pending intent is now mutable when buttons are of text input type.
- Fixed notification tracking bug that prevents SDK from receiving push notifications when system notification settings are turned off.
- Fixed logic issue where notifications were being disabled even when auto push registration was turned off
- Support for JSON-only in-app messages, JSON-only messages are now handled by the
onNewInApphandler and consumed after retrieval - Enhanced notification state tracking to align with system notification permissions changes
- Fixed Crash while initializing IterableSDK on some devices (Unsupported IV Length).
-
- Added
IterableDecryptionFailureHandlerinterface to handle decryption failures of PII information.
- Added
- Removed
encryptionEnforcedparameter fromIterableConfigas data is now always encoded for security
- Migrated from EncryptedSharedPreferences to regular SharedPreferences to prevent ANRs while EncryptedSharedPreferences was created on the main thread. We are now using our own encryption library to encrypt PII information before storing it in SharedPreferences.
- In-Apps are now robust with animation, resolving flickering and animation issues observed on Pixel 6 Pro with API 35.
- Fixed an issue where AuthManager was not reset correctly when logging out a user.
- Fixed
ConcurrentModificationExceptionleading to crashes during application launches. - Addressed a text truncation issue in Embedded Message templates for applications targeting Android 14 and Android 15.
- Improved InboxActivity compatibility with edge-to-edge layouts, ensuring seamless handling of notches and display cutouts.
- This release includes initial support for Unknown user activation, a feature that allows marketers to convert valuable visitors into customers. With this feature, the SDK can:
- Fetch unknown user profile creation criteria from your Iterable project, and then automatically create Iterable user profiles for unknown users who meet these criteria.
- Save information about a visitor's previous interactions with your application to their unknown user profile, after it's created.
- Display personalized messages for unknown users (in-app, push, and embedded messages).
- Merge unknown user profiles into an existing, known user profiles (when needed).
- Unknown user activation is currently in private beta. If you'd like to learn more about it or discuss using it, talk to your Iterable customer success manager (who can also provide detailed documentation).
- Fixed an issue where the SDK would crash if the
IterableInAppMessageobject was null when consuming an in-app message.
- SDK now provides more insight into JWT refresh failures, so you can take appropriate action in your application code. With this update, when a JWT refresh fails (for any of various reasons), the SDK calls
onAuthFailureon theIterableAuthHandlerinstance you can provide to the SDK at initialization. For more information, see the documentation for Iterable's Android SDK. - The IterableAuthHandler's
onTokenRegistrationFailed(Throwable object)has been replaced withonAuthFailure(Throwable object)which will be called when JWT token refresh fails.
- Introducing a new method
setAuthRetryPolicyinIterableConfigto set the retry policy for JWT token refresh. - You can now use method -
pauseAuthRetries(boolean pauseRetry)to pause or resume the JWT token refresh retries. trackPurchasemethod now acceptsattributionInfoparameter to track purchase with attribution information.
- Embedded manager listeners are active only if feature is enabled
- Embedded manager syncs messages as soon as user logs in
- Fixed a bug to prevent app crashes due to malformed authTokens
- Fixes a bug where push notifications opens would lead to app crashes
- Fixes a bug where crashes would occur due to SDK not being initialized
- Updates Glide library in embedded message OOTB views to version 4.16.0
- introduces support for embedded messaging: an eligibility–based, personalized messages sent from Iterable to your mobile and web apps, which can display them inline, using native interface components.
- To display embedded messages, you can use customizable, out-of-the-box components provided by the SDK (cards, notifications, banners), or you can build fully custom components of your own design.
- To learn more, read Embedded Messages with Iterable's iOS SDK.
IterableConfigis updated with anenableEmbeddedMessagingflag that needs to be set to true to allow use of embedded messaging functionality
- when JWT is invalid,
IterableAuthManageris updated to fetch and store a new JWT token locally IterableRequestTasknow has a retry mechanism that fetches a new JWT token and retries the request if JWT is invalid- retries are capped at a max of 5
- SDK now handles
nullscenarios preventing crashes whenIterableEncryptedSharedPreferencecreation fails. - Updated crypto library to version 1.1.0-alpha06. 1.1.0-alpha05 solves a race condition during creation process.
This release allows you to use projects hosted on Iterable's EU data center. If your project is hosted on Iterable's European data center (EUDC), configure the SDK to use Iterable's EU-based API endpoints:
Java
IterableConfig config = new IterableConfig.Builder()
// ... other configuration options ...
.setDataRegion(IterableDataRegion.EU)
.build();
IterableApi.initialize(context, "<YOUR_API_KEY>", config);Kotlin
val configBuilder = IterableConfig.Builder()
// ... other configuration options ...
.setDataRegion(IterableDataRegion.EU)
.build();
IterableApi.initialize(context, "<YOUR_API_KEY>", config);- Addressed React Native SDK push notification deep linking issues where the app would restart instead of resuming the last activity upon being backgrounded.
- Resolves an additional push notification problem wherein the customActionHandler and urlHandler were not being invoked in specific scenarios, as documented in issue #470. (Credit to @tnortman-jabra for the report and the fix)
IterableInAppManager.setReadnow acceptsIterableHelper.FailureHandler failureHandler
- Fixes an issue where
IterableInAppManager.removeMessagecaused build failure in React Native SDK pointing to legacy method calls. - Fixes an issue where custom action handlers were not invoked when tapping on push notification when the app is in background.
IterableInAppManager.setReadnow acceptsIterableHelper.SuccessHandler successHandler.IterableApi.inAppConsumenow acceptsIterableHelper.SuccessHandler successHandlerandIterableHelper.FailureHandler failureHandler.
setEmailandsetUserIdnow acceptsIterableHelper.SuccessHandler successHandlerandIterableHelper.FailureHandler failureHandler.
- OTT devices (FireTV) will now register as
OTTdevice instead ofAndroidunder user's devices.
-
Custom push notification sounds! To play a custom sound for a push notification, add a sound file to your app's
res/rawfolder and specify that same filename when setting up a template in Iterable.Some important notes about custom sounds and notification channels:
- Android API level 26 introduced notification channels. Every notification must be assigned to a channel.
- Each custom sound you add to an Iterable template creates a new Android notification channel. The notification channel's name matches the filename of the sound (without its extension).
- To ensure sensible notification channel names for end users, give friendly names to your sound files. For example, a custom sound file with name
Paid.mp3creates a notification channel calledPaid. The end user can see this notification channel name in their device's notification channel settings. - Be sure to place the corresponding sound file in your app's
res/rawdirectory.
-
To help you access a user's
emailaddress,userId, andauthToken, the SDK now provides convenience methods:getEmail(),getUserId(), andgetAuthToken().
-
Updated the Security library and improved
EncryptedSharedPreferenceshandling.To work around a known Android issue that can cause crashes when creating
EncryptedSharedPreferences, we've upgradedandroidx.security.cryptofrom version1.0.0to1.1.0-alpha04. WhenEncryptedSharedPreferencescannot be created, the SDK now usesSharedPreferences(unencrypted).If your app requires encryption, you can prevent this fallback to
SharedPreferencesby setting theencryptionEnforcedconfiguration flag totrue. However, if you enable this flag andEncryptedSharedPreferencescannot be created, an exception will be thrown. -
Improved JWT token management. This change addresses an issue where
nullvalues could prevent the refresh of a JWT token.
-
Fixed an issue which could prevent in-app messages from respecting the Position value selected when setting up the template (top / center / bottom / full).
-
Fixed crashes that sometimes happened during in-app message animations.
This release includes support for encrypting some data at rest, and an option to store in-app messages in memory.
In Android apps with minSdkVersion 23 or higher (Android 6.0)
Iterable's Android SDK now encrypts the following fields when storing them at
rest:
email— The user's email address.userId— The user's ID.authToken— The JWT used to authenticate the user with Iterable's API.
(Note that Iterable's Android SDK does not store the last push payload at rest—before or after this update.)
For more information about this encryption in Android, examine the source code
for Iterable's Android SDK: IterableKeychain.
This release also allows you to have your Android apps (regardless of minSdkVersion)
store in-app messages in memory, rather than in an unencrypted local file.
However, an unencrypted local file is still the default option.
To store in-app messages in memory, set the setUseInMemoryStorageForInApps(true)
SDK configuration option (defaults to false):
Java
IterableConfig.Builder configBuilder = new IterableConfig.Builder()
// ... other configuration options ...
.setUseInMemoryStorageForInApps(true);
IterableApi.initialize(context, "<YOUR_API_KEY>", config);Kotlin
val configBuilder = IterableConfig.Builder()
// ... other configuration options ...
.setUseInMemoryStorageForInApps(true);
IterableApi.initialize(context, "<YOUR_API_KEY>", configBuilder.build());When users upgrade to a version of your Android app that uses this version of
the SDK (or higher), and you've set this configuration option to true, the
local file used for in-app message storage (if it already exists) is deleted
However, no data is lost.
If your app targets API level 23 or higher, this is a standard SDK upgrade, with no special instructions.
If your app targets an API level less than 23, you'll need to make the following changes to your project (which allow your app to build, even though it won't encrypt data):
- In
AndroidManifest.xml, add<uses-sdk tools:overrideLibrary="androidx.security" /> - In your app's
app/build.gradle:- Add
multiDexEnabled trueto thedefaultobject, underandroid. - Add
implementation androidx.multidex:multidex:2.0.1to thedependencies.
- Add
- Added new methods for
setEmail,setUserIdandupdateEmailwhich acceptsauthToken, providing more ways to passauthTokento SDK - Added two interface methods -
onTokenRegistrationSuccessfulandonTokenRegistrationFailed. Override these methods to see if authToken was successfully received by the SDK.
setAuthTokenmethod is now public allowing additional way to provideauthTokento SDK.
- Removed collection of advertising ID.
- Fixed an issue where
disableDevicewould get called with no device token.
- This release makes offline events processing available to all Iterable customers who'd like to use it — just ask your customer success manager to enable it for your account. Offline events processing saves a local copy of events triggered in your app while the device is offline (up to 1000 events). When a connection is re-established and your app is in the foreground, the events will be sent to Iterable. For more information, read Offline events processing.
- Fixed an issue where configurations would not be loaded.
configinIterableApiis now accessed through sharedInstance.
- Fixed in-apps disappearing due to the functionality of loading HTML changing in Android SDK version 29+.
- Fixed in-app layouts always showing up in the
topformat.
- Notification Badging/Dots can be explicitly enabled or disabled in AndroidManifest by setting
iterable_notification_badgingvalue totrueorfalse. Read More.
- Fixed device registration failure users in JWT enabled projects.
- Fixed an issue where app would hide from app switcher when external links are deep linked from push notification.
- Fixed a regression with pending intents losing immutability that was causing issues on Android 12. (Thanks to @scaires)
- Notification Trampoline restriction is now handled by the SDK allowing push notification to work seamlessly on Android 12+.
- Prevented in-app messages from executing JavaScript code included in their HTML templates.
- Prevented web views from accessing local files.
-
Changed two static methods on the
IterableApiclass,handleAppLinkandgetAndTrackDeepLink, to instance methods. To call these methods, grab an instance of theIterableApiclass by callingIterableApi.getInstance(). For example,IterableApi.getInstance().handleAppLink(...).⚠ WARNING This is a breaking change. You'll need to update your code.
-
Added the
allowedProtocolsfield to theIterableConfigclass.Use this array to declare the specific URL protocols that the SDK can expect to see on incoming links (and that it should therefore handle). Doing this will prevent the SDK from opening links that use unexpected URL protocols.
For example, this code allows the SDK to handle
httpandcustomlinks:Java
IterableConfig.Builder configBuilder = new IterableConfig.Builder() .setAllowedProtocols(new String[]{"http", "custom"}); IterableApi.initialize(context, "<YOUR_API_KEY>", config);
Kotlin
val configBuilder = IterableConfig.Builder() .setAllowedProtocols(arrayOf("http","custom")) IterableApi.initialize(context, "<YOUR_API_KEY>", configBuilder.build());
Iterable's Android SDK handles
https,action,itbl, anditerablelinks, regardless of the contents of this array. However, you must explicitly declare any other types of URL protocols you'd like the SDK to handle (otherwise, the SDK won't open them in the web browser or as deep links).
- Auth keys and API keys will no more be logged in Android Logcat for security reasons.
- Crash on closing system dialog is now addressed for Android 12+.
- Fixed an issue where push notifications retained data from previously sent notifications.
- When syncing in-app queues, new messages that already have
readset totruewill not spawn anInAppDeliveryevent.
- Added
android:exportedattribute to activities as required in Android 12. - Pending intents now specify its mutability as required in Android 12. (Thanks to @sidcpatel!)
- Push notifications will now have timestamps on devices with SDK 17 and above.
updateCarthas been added to the SDKdataFieldshave been added as a field toCommerceItem
- Devices with Android 11 should now be able to open browser when performing open url actions instead of landing on the app.
- Added a new static method -
setContexttoIterableAPI. Use this method in your ReactNative project to pass context to IterableSDK from Application -onCreatemethod.
-
The following properties have been added to the
CommerceItemclass:sku- The item's SKUdescription- A description of the itemurl- A URL associated with the itemimageUrl- A URL that points to an image of the itemcategories- Categories associated with the item
Set these values on
CommerceItemobjects passed to theIterableApi.trackPurchasemethod.
-
To resolve a breaking change introduced in Firebase Cloud Messaging version 22.0.0, version 3.3.1 of Iterable's Android SDK bumps the minimum required version of its Firebase Android dependency to 20.3.0.
If upgrading to version 3.3.1 causes your app to crash on launch, or your build to fail, add the following lines to your app's
build.gradlefile:android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } ... } -
Updated minimum version for
firebase-messagingto 20.3.0 to useFirebaseMessaging.getToken()instead of deprecatedFirebaseInstanceId.getToken(). -
Notifications will now show timestamp.
- Offline events processing - This feature saves a local copy of events triggered in your app while the device is offline (up to 1000 events). When a connection is re-established and your app is in the foreground, the events will be sent to Iterable. This feature is off by default, and we're rolling it out on a customer-by-customer basis. After you start using this version of the SDK, we'll send you a message before we enable the feature on your account (unfortunately, we can't give you an exact timeline for when this will happen). If you have any questions, talk to your Iterable customer success manager.
- Removed
legacyGCMSenderIdfromIterableConfig. - Removed deprecated functions
spawnInAppNotificationand redirectedgetInAppMessagesto be called fromIterableInAppManager.
- Updated minimum version for
firebase-messagingto 19.0.0. - Added dependency on Kotlin standard library.
- Non-silent inbox messages will now properly account for the read state.
- In-app message prioritization - Ordering the display of in-app messages based on a priority you select in Iterable when creating in-app campaigns
-
Support for the display of a custom message (title and body) in an empty mobile inbox. For more details, see Customizing Mobile Inbox on Android
-
Support for syncing in-app message read state across multiple devices:
- When the SDK fetches in-app messages from Iterable, it examines each message's
readfield to determine if it has already been read. - The SDK's default implementation no longer automatically displays in-app messages that have already been seen on another device (even if those messages were not configured to go directly to the inbox).
If you'd like to try out these beta features, talk with your Iterable customer success manager.
- When the SDK fetches in-app messages from Iterable, it examines each message's
- Support for the display of a custom message (title and body) in an empty mobile inbox. For more details, see Customizing Mobile Inbox on Android
- Support for syncing in-app message read state across multiple devices:
- When the SDK fetches in-app messages from Iterable, it examines each message's
readfield to determine if it has already been read. - The SDK's default implementation no longer automatically displays in-app messages that have already been seen on another device (even if those messages were not configured to go directly to the inbox).
- When the SDK fetches in-app messages from Iterable, it examines each message's
- Changed the timeout for GET calls (
/inApp/getMessagesin particular) from 3 to 10 seconds.
- Fixed a crash that would sometimes happen when dismissing an in-app message while the app is in background.
-
This beta SDK release includes support for two new Iterable features (both of which are in beta):
- Offline events processing - Capturing engagement events when a device is offline and sending them to Iterable when a network connection is reestablished
- In-app message prioritization - Ordering the display of in-app messages based on a priority you select in Iterable when creating in-app campaigns
If you'd like to try out these beta features, talk with your Iterable customer success manager.
- Fixed Firebase check to work without a Firebase database URL in
google-services.jsonthat may not be present in some recently created Firebase projects.
- Added support for delayed initialization of the SDK. While we still recommend calling
IterableApi.initializeinApplication#onCreate, apps initializing the Iterable SDK later should now work properly with push actions and background push notifications without issues.
- Fixed
IllegalStateExceptioncrash inIterableInAppFragmentHTMLNotificationby adding safety checks before dismissing the in-app dialog. - Fixed a crash in the in-app dialog that could occur in some cases when the device is rotated while the in-app dialog is beginning to load.
- Fixed a crash in
IterablePushActionReceiverwhenextrasarenull. This was only happening in automated analysis tools and not in production, but was nevertheless showing up in crash reports.
- Added support for in-app animations. Select the checkbox to use preset animations when creating a template to see this feature in action.
- Added support to set custom color and transparency for in-app background.
- Fixed an issue where closing an in-app could crash the app if the message gets deleted from another logged in device while it is being displayed.
- The method
getExpiresAtinIterableInAppMessageis now public.
- Added authentication support.
- Added a new method -
setAutoDisplayPausedtoInAppManager. This method pauses the display of in-app messages and can be used to prevent interruptions in certain areas of your app.
- Changed
messageIdargument to be non-null intrackPushOpen.
- Fixed an issue where the in-app message queue wasn't being refreshed on app launch.
- Removed warning messages from logs when using string resources for notification channel name.
app_namewas removed from published strings and replaced with plain string values in test manifests.disableTokennow disables all devices with the current device token whenemailanduserIdare not set.
- Fixed an issue where in-app click events were not being registered after displaying an in-app message.
- Fixed NullPointerExceptions in
IterableInAppFragmentHTMLNotificationthat could occur in some cases when the activity is destroyed and recreated. - Fixed an issue where in-app messages were not getting cleared upon logout.
- Added support for new parameters -
mergeNestedObjectinupdateUsermethod. - Added public methods -
setDeviceAttributeandremoveDeviceAttributeto support additional device attributes.
- Method tracing now logs only in VERBOSE log level.
IterableInAppMessagenow stores thecampaignIdit belongs to. (Thanks to @nkotula!)
- The SDK now uses
DialogFragmentto show in-app messages. In-app messages are more stable than before and resilient to device configuration changes like device rotation.
- Fixed an ArrayIndexOutOfBoundsException in IterableRequest which is thrown from inside HttpUrlConnection/OkHttp module in certain Android firmwares
- Added support for new parameters -
subscribedMessageTypeIDs,campaignId,templateIdinupdateSubscriptionsmethod.
-
Changes since beta:
- Added support for various ways to customize the default interface for a mobile inbox
- Added a sample project that demonstrates how to customize the default interface for a mobile inbox
- Added tracking for inbox sessions (when the inbox is visible in the app) and inbox message impressions (when a individual message's item is visible in the mobile inbox message list)
- Removed all old initialization methods starting with
sharedInstanceWithApiKey - Removed
sendPushmethods (these API methods can't be called from mobile apps) - Removed all deprecated methods with extra parameters for push registration:
void registerDeviceToken(String token)is the only one available now for token registrationvoid disablePush()is the only one available for disabling the current push token- Platform is always FCM, and push integration name is taken from
IterableConfig
- The SDK now depends on AndroidX libraries. Migrate your app to use AndroidX before using version 3.2.0 or higher of the SDK.
- When
pushIntegrationNameis not set onIterableConfig, the SDK now defaults it to the app's package name. If you've set up your push integration with the new Mobile Apps UI, you don't have to specifypushIntegrationNamein the SDK anymore.
- Added a new static method to
IterableFirebaseMessagingService:isGhostPush. Use this method to determine whether a Firebase message is an Iterable ghost push or silent push message.
- Fixed the height of full-screen in-app messages to make sure they're not clipped by the Android navigation bar.
- The SDK doesn't log an error message anymore when a custom notification channel name is not set.
- Automatic push registration is now only done if the app is running in foreground
- Push notifications now also display image thumbnails when collapsed
- Connection timeout for GET requests is now 3 seconds, to match other request timeouts
Api-Keyheader is now also used for GET requests
- Fixed possible exceptions when an in-app message is not on the screen when it's being resized
- Fixed a NullPointerException that could occur in some cases when trying to get Advertising ID
- Removed FirebaseInstanceIDService dependency to support newer versions of
firebase-messaginglibrary. This bumps the minimum required version offirebase-messagingto 17.4.0.
- Fixed deserialization of in-app messages stored with beta versions of the SDK
- SDK platform and version is now sent with every API request via headers
Api-Keyheader name is now used for the API key instead ofapi_key, for consistency with HTTP header naming conventions
- Fixed an issue that could cause the SDK not to persist in-app message properties (processed/consumed)
- Fixed a NullPointerException that could occur in IterableActivityMonitor if it was initialized after application start
BREAKING CHANGES
The in-app messaging implementation has been significantly improved:
- The SDK now maintains a local queue and keep it in sync with the server-side queue automatically
- Iterable servers now notify apps via silent push messages whenever the in-app message queue is updated
- In-app messages are shown by default whenever they arrive
Check the In-app messages documentation for more details.
Please refer to the Migration guide if you've been using in-app messages in your app and updating a newer version of the SDK.
-
BREAKING CHANGE: Added
IterableContextargument toIterableCustomActionHandlerThe new method signature is:
boolean handleIterableCustomAction(IterableAction action, IterableActionContext actionContext)
actionContextcan be used to determine where the call is calling from - push message, in-app message, or a deep link. -
The SDK now sets
notificationsEnabledflag on the device to indicate whether notifications are enabled for the app -
Changes to in-app links:
action://URL scheme is now reserved for app-specific custom actions. When a user clicks on a link withhref=action://myCustomAction, the SDK callsIterableCustomActionHandler.handleIterableCustomActionwith action type set tomyCustomAction.iterable://URL scheme is now reserved for actions handled by the SDK (i.e. future versions of the SDK may defineiterable://deleteas an action to delete the in-app message)itbl://links will keep working as custom actions (similar toaction://URLs) for backwards compatibility, butitbl://namespace is deprecated in favor ofaction://.- Migration: if you've been using
itbl://links in the past, please update your templates withaction://instead
-
Connect timeout for deeplink resolution is now 3 seconds
spawnInAppNotificationhas been removed. Please refer to the in-app migration guide (above)
- Fixed the URL parameter in
inAppClickevent
- The SDK now passes
preferUserIdflag to create a user by userId if it does not exist when using userId to identify the user - Incresed the deep link timeout to 3 seconds
- Fixed InAppClick event parameter to properly track the URL that was clicked
- Fixed a NullPointerException when an in-app message was being shown while the app was in background
- Added an option to specify notification channel name via manifest metadata (
iterable_notification_channel_name) - Added support for color resource references in
iterable_notification_colormanifest metadata parameter
updateEmailcan now be used if the user is identified with userId- Connection timeout is now 3 seconds
- Fixed a NullPointerException when the app has a plain-text label in
AndroidManifest.xmlinstead of a string resource reference
- Added
updateEmailmethod with success & failure callbacks
- Added public methods to
IterableFirebaseMessagingServiceandIterableFirebaseInstanceIDServicethat can be called from a customFirebaseMessagingServicesubclass
- Added a new field to
IterableConfig-logLevel- to specify the log level for Iterable SDK log messages
- The SDK now uses
preferUserIdflag to create a user by userId instead of the deprecatedcreateUserForUserIdAPI
- The SDK now catches any RuntimeExceptions that may sometimes happen when calling
getAdvertisingIdInfo registerDeviceTokenanddisableTokennow use the email/userId that was set at the time of the call, to handle login/logout correctly
- Added support for user registration with userId. The SDK will now create a new user for userId if it does not exist before registering the device on the user's profile.
- Added new device fields (Iterable SDK version, app version, app package name) to
registerDeviceTokencall - Deferred Deep Linking support
- Fixed a NullPointerException when an in-app was resized after being dismissed
- The SDK now registers the token when a new email/userId is set and disables the old device if email/userId was previously set and then changed. This can be disabled by setting
autoPushRegistrationtofalseinIterableConfig.
- Fixed a NullPointerException when SDK isn't initialized in Application#onCreate and the app is opened from a push notification
Released on 2018-08-10
- The new email is now persisted when
updateEmailis called - SDK now ensures that only one in-app message can be shown at a time
Released on 2018-07-30
- Full FCM support
- Added support for push action buttons
- Added a new SDK initialization method that takes
IterableConfigobject with configuration options - User ID/email is now decoupled from SDK initialization. It can be changed by calling
setEmailorsetUserIdon theIterableApiinstance. - The SDK now stores attribution data within 24 hours of opening the app from a push notififcation or from an App Link in an email
- Added two handlers:
IterableUrlHandlerandIterableCustomActionHandlerthat can be used to customize URL and custom action handling for push notifications - Added
getPayloadData()method to retrieve the entire notification payload for the notification that opened the app (thanks @steelbrain)
- Removed GCM support
- Old initialization methods (
sharedInstanceWithApiKey) are now deprecated - Old
registerForPushandregisterDeviceTokenmethods are now deprecated
- If you're using GCM, update your Android app to Firebase Cloud Messaging
- Replace
IterableAPI.sharedInstanceWithApiKey(...)with the following:
IterableConfig config = new IterableConfig.Builder()
.setPushIntegrationName("myPushIntegration")
.setUrlHandler(this) // If you want to handle URLs coming from push notifications
.build();
IterableApi.initialize(context, "YOUR API KEY", config);- Call
registerForPush()to retrieve the push token and register the device. - User email/userId is now persisted, so you'll only need to call
setEmailorsetUserIdwhen the user logs in or logs out. - The SDK now tracks push opens automatically, as long as the SDK is initialized in
Application'sonCreate. See README for instructions. Once it is set up, remove all direct calls totrackPushOpen.
Released on 2018-03-31
- Updated requests to not send when there is an exception while constructing the JSON request body.
- Fixed the reference to internal fields in NotificationCompat.Builder for buildVersion 27.
Released on 2018-03-07
- Fixed the load sequence for retrieving a notification image.
Released on 2018-01-22
- Added non-empty data body for notification rendering.
- Added default channel id support.
Released on 2017-11-30
- Fixed error in IterablePushRegistration when
getDeviceTokenreturns an empty PushRegistrationObject.
Released on 2017-11-20
- Added the
updateSubscriptionsfunction to create to modify channel, list, and message subscription preferences.
Released on 2017-11-03
- Added support for html based in-app notifications.
Released on 2017-10-20
- Fixed payload path for image url.
Released on 2017-07-28
- Added support for android image notifications.
- Fixed load error for empty image url.
Released on 2017-07-19
- Fixed in-app button clicks without an action defined.
Released on 2017-07-19
- Added the in-app consume logic to automatically remove the notification from list of in-app notifications.
- Fixed the payloadfor trackInAppClick to contain the userId.
Released on 2017-06-09
- Added full support for newly created Firebase applications
- Added new functionality for
registerForPushwhich takes in the optional pushServicePlatformIterableConstants.MESSAGING_PLATFORM_GOOGLE(GCM)IterableConstants. MESSAGING_PLATFORM_FIREBASE(FCM)
IterableFirebaseInstanceIDServicehandles firebase token registrations automatically on install.- Added in default tracked device values for
registerDeviceToken
- Changed IterablePushRegistrationGCM to IterablePushRegistration so the registration class is not GCM specific.
- Changed the disable logic to no longer enable the deviceToken prior to disabling.
Released on 2017-02-23
- fixed uploaded pom file
Released on 2017-02-22
- Added support for Android deeplink tracking
getAndTrackDeeplinktracks a click and returns the destination url.
Released on 2017-01-09
- Updated the PendingIntent request code to use the messageId instead of the current timestamp.
Released on 2017-01-09
- fixed overwritten pushnotification metadata on subsequent notifications
Released on 2016-12-28
- added support for In-App Notifications with different views layouts
- Full screen
- Bottom
- Center
- Top
- includes tracking for In-App opens and clicks
- includes support for GET requests
Released on 2016-10-13
- Added ability to send data by userId