All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
- Fixed deeplink re-routing issue where delegate would only return
false
value. Thanks to @scottasoutherland :)
- Fixed an issue where push notification were not being delivered in iOS 18 beta Sandbox builds.
- Introduced a new configuration option,
RetryPolicy
, in IterableConfig to set the retry policy for JWT token refresh. - Added the method
pauseAuthRetries(_ pauseRetry: Bool)
to allow pausing the SDK from requesting JWT tokens from the app.
- Updated the method
onTokenRegistrationFailed(_ reason: String?)
toonAuthFailure(_ authFailure: AuthFailure)
. The newAuthFailure
object provides more detailed information about JWT failures.
- SDK is now compatible with Xcode 16 beta 2
- Deprecated support for iOS 10 and iOS 11.
- The Privacy Manifest has been relocated to the resources folder within the SDK. This adjustment facilitates the inclusion of the SDK's privacy manifest in the generation process.
- Resolved a bug where a scheduled authentication token refresh would occur even if the user had logged out in the interim.
- Improved the Out Of The Box (OOTB) Embedded CardView image content view by setting it to aspect fill. This change ensures a consistent appearance across web, iOS, and Android platforms.
- iOS SDK now includes a new privacy policy file indicating SDK's usage of user data
- Fixed an issue where AuthManager's onTokenRequested would get called without user logged in
- Updates logic for notificationsEnabled flag to be more inclusive in case of failures for fetching the current settings
- 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.
IterableConfig
is updated with anenableEmbeddedMessaging
flag that needs to be set to true to allow use of embedded messaging functionality
- Resolved push open tracking issue when the app is running in the background.
sendRequestWithRetries
function added as part of theNetworkHelperclass
- For an API request that results in a 500-level error response, the SDK now executes up to five retries. Before each of the final three attempts, there is a two-second delay.
- updates
sendRequest
inRequestProcessorUtil
to retry the API request that resulted in a 401 response upon receipt of a new JWT - updates
NetworkHelper
class logic to usesendRequestWithRetries
method which wraps the originalnetworkSession.makeRequest
- When an API request fails with a 401 because of an invalid JWT token, the SDK now immediately requests a new JWT token for the signed-in user.
- 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:
Swift
let config = IterableConfig()
config.dataRegion = IterableDataRegion.EU
IterableAPI.initialize(apiKey: "<YOUR_API_KEY>", launchOptions: launchOptions, config: config)
Objective-C
IterableConfig *config = [[IterableConfig alloc] init];
config.dataRegion = IterableDataRegion.EU;
[IterableAPI initializeWithApiKey:@"<YOUR_API_KEY>" launchOptions:launchOptions config:config];
- Offline Mode is now off by default. Offline mode components will only load when the
offlineMode
configuration for RequestHandler is set to true.
- Offline mode configuration now persists throughout the current app session. Changes will take effect from the next app session.
- Success and Failure handlers can now be passed to following functions:
InAppManager.remove
,InAppManager.setRead
,IterableAPI.setEmail
andIterableAPI.setUserId
ITBNotificationServiceExtension
has a new optional delegate in the scenario of wanting to receive and pass along push information (e.g. Firebase)
- The behavior of
lastPushPayload
now matches that of the Android SDK in being purely in memory and will now not count the payload of a silent push
- The
itbl_inapp.json
file generated from in-app messaging has been relocated to the correct spot
- Added a new function to
IterableAPI
to get the currently set authentication token - Added a new function (
onTokenRegistrationFailed
) to theIterableAuthDelegate
upon authentication token retrieval failure
- Changed
setEmail
andsetUserId
to run through the login process if also sent in an authentication token (and a non-nil
ID)
- Fixed instances where setting a new authentication token for a user failed
- Fixed so that
AuthManager
clears the previous refresh timer before setting a new one (thanks, @cranberyxl!)
- Fixed instances where
config.inAppDisplayInterval
would not set custom interval set via react native layer.
Version version 6.4.9 of Iterable's iOS SDK makes it possible to 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 useInMemoryStorageForInApps
to true:
Swift
let config = IterableConfig()
config.useInMemoryStorageForInApps = true
IterableAPI.initialize(apiKey: "<YOUR_API_KEY>", launchOptions: launchOptions, config: config)
Objective-C
IterableConfig *config = [[IterableConfig alloc] init];
config.useInMemoryStorageForInApps = YES;
[IterableAPI initializeWithApiKey:@"<YOUR_API_KEY>" launchOptions:launchOptions config:config];
When users upgrade to a version of your iOS app that uses this version of the SDK (or higher), and you've enabled this option, the local file used for in-app message storage (if it already exists) is deleted. However, no data is lost.
Starting with this release, as a privacy enhancement, Iterable’s iOS SDK encrypts the following data when storing it 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.lastPushPayload
— The JSON payload that came along with the last push notification received by the app.
(Note that Iterable's iOS SDK does not store in-app messages at rest—before or after this update.)
When a user upgrades to a version of your app that uses this version of the SDK (or higher), the fields shown above are encrypted. No data that's already stored is lost.
For more information about the encryption described above, examine the SDK source code:
- Added
setEmail
andsetUserId
as publicly accessible functions, which will set the identity of the SDK to attribute to events. The optional second parameter will take in a JWT if you already have one at the time of this call (as opposed to throughIterableAuthDelegate
).
- Added Objective-C access to
IterableInboxViewController
andIterableInboxNavigationViewController
- 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.
- Core data issues.
- Retry request on JWT token obtained.
- Core data multithreading issue.
- Update email with JWT token.
- Added support for apps built using Mac Catalyst.
- Fixed a couple of problems related to Swift Package Manager and the creation of release builds and simulator artifacts.
- Fixed a problem with the SDK’s Carthage integration.
- Fixed a problem that prevented the SDK from properly tracking inbox sessions when a mobile inbox is displayed in
popup
mode. - In-app delete events are now correctly associated with inbox session IDs.
- Fixed some problems in a script that generates XCFramework binaries.
- Fix archiving issue. There was an issue when archiving for projects with deployment target set to iOS 10. This release fixes the issue.
- Prevents in-app messages from executing JavaScript code included in their HTML templates.
- Removed support for iOS 9.
- Added the
allowedProtocols
field on theIterableConfig
class.- 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). This will help prevent the app from opening unexpected links that use arbitrary URLprotocols.
- Iterable's iOS SDK will always handle
https
links (in push notifications, in-app messages, etc.), regardless of the contents of this array. However, you must explicitly specify any non-https
URL protocols you'd also like the SDK to handle. - If you don't set up this array, your app will only handle
https
links. If it receives other kinds of links (for example, usinghttp
or custom URL protocols), it won't open them (as deep links or in the browser). - For example, to allow the SDK to handle
http://
,tel://
, andcustom://
links, set theallowedProtocols
field, on theIterableConfig
object you pass to the SDK'sinitialize
method, to["http", "tel", "config"]
.
- When syncing in-app queues, new messages that already have
read
set totrue
will not spawn anInAppDelivery
event - Fixed the alignment of the no messages title on the inbox empty state
- Wrapped various app extension unsafe classes for Xcode 13 compatibility
- Added ability to not show the unread count badge
- CocoaPods targets adding this SDK do not require
use_frameworks!
anymore
- Inline comments will not show anymore warnings in Objective-C projects
updateCart
has been added to the SDKdataFields
have been added as a field toCommerceItem
- The following calls that were previously marked as deprecated have been removed:
IterableAPI.track(inAppOpen messageId: String)
IterableAPI.track(inAppClick messageId: String, buttonURL: String)
IterableAPI.inAppConsume(messageId: String)
IterableAPI.getAndTrack(deeplink webpageURL: URL, callbackBlock: @escaping ITEActionBlock)
IterableAPI.showSystemNotification(withTitle title: String, body: String, button: String?, callbackBlock: ITEActionBlock?)
IterableAPI.showSystemNotification(withTitle title: String, body: String, buttonLeft: String?, buttonRight: String?, callbackBlock: ITEActionBlock?)
-
The following properties have been added to the
CommerceItem
class:sku
- The item's SKUitemDescription
- 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
CommerceItem
objects passed to theIterableAPI.trackPurchase
method.
- The notification service extension has been re-architected for better reliability
- 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.
- This beta is rebuilt from version 6.2.22
- A health monitor now checks to make sure offline events don't get written when there are already a maximum amount of events in the database, or if an error is returned from the database
- In-app message prioritization - Ordering the display of in-app messages based on a priority you select in Iterable when creating in-app campaigns
- The authentication flow, with JWT, now does the proper order of operations to avoid a false negative when setting the user (with
setEmail
orsetUser
) - The empty inbox message will now properly wraparound
- An inbox message that has its read state changed will now only animate the unread dot
- Removed deferred deep linking related code as a cautionary measure for iOS 14.5 policy updates - note: we still keep the system generated UUID
- Removed deferred deep linking feature
- This beta is rebuilt from version 6.2.21
- 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
read
field 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 you view a message, the SDK calls
POST /api/events/trackInAppOpen
to create aninAppOpen
event on the user's Iterable profile. Previous versions of the SDK made this same API call, but the call now also causes Iterable to set the message'sread
field totrue
. - Previous versions of the SDK will correctly sync a message's read / unread indicator for the default implementation of a mobile inbox. However, these older SDK versions will not automatically suppress messages that have already been seen on another device (as this version of the SDK will).
- 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 iOS
- Added callback for initialize method that is used by our React Native SDK.
- Fixed how we look up
Resources
folder for Cocoapods.
- Added callback to initialize method needed for React Native. This change should have no effect for iOS SDK.
- 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.
- When using the inbox feature in popup mode, the method of modal transition can now be specified through
popupModalPresentationStyle
- Users who were already set to the SDK will now always request a JWT (if enabled) whenever a user is set to the SDK
- Added a call to get in-app messages after a JWT retrieval when setting the user to the Iterable SDK instance
- Fixed passing along deep links from the React Native SDK initialization
- SDK initialization fix for React Native. Push notifications and deep links were not working for React Native when app is not in memory.
- Removed specific plist files from the SPM targets to stop unnecessary warnings
- Added in-app animations
- Fixed non-inbox in-apps showing up in the inbox if multiple were about to be shown
- Made
IterablePushNotificationMetadata
struct public. - Optimized auth token refresh.
- Use
systemBackground
color for iOS 14.
- Added authentication support
- Added authentication support
- Xcode 12 and iOS 14 support.
- Fixed minor warnings.
- An option to pause automatic in-app displaying has been added. To pause, set
IterableAPI.inAppManager.isAutoDisplayPaused
totrue
(default:false
).
- In rare instances
regiserDeviceToken
API can cause crash. This should fix it.
- In-app messages now get "pre-loaded" with a timer (or until the in-app loads) to mitigate seeing the loading of the message
- The JSON payload is now checked to be a valid JSON object before serialization
- Some classes that were intended for internal framework usage only have been assigned proper permission levels (thanks, made2k!)
- The root view controller is now correctly found on projects that are newly created in iOS 13
nil
is properly returned when deep linking encounters an error
- Added internal
deviceAttributes
field for compatibility
- This SDK release is based off of 6.2.4, as 6.2.5 had some framework specific code that we don't believe has any user impact, but out of caution, is omitted from this release, and has the noted fixes below.
- Action buttons now show properly when a mediaURL isn't specified
- The
trackEvent
event is now named accordingly - Fixed the
campaignId
data type within our SDK (thanks, nkotula!)
- Fixed the
campaignId
data type within our SDK (thanks, nkotula!)
- Properly attribute the source of in app closes
IterableInAppManagerProtocol
has been givengetMessage(withId id: String)
(Objective-C:@objc(getMessageWithId:)
)
- For Objective-C apps,
IterableLogDelegate.log
has had a typo fixed; the new signature is@objc(log:message:)
- For Objective-C apps,
IterableAPI.updateSubscriptions
has had a typo fixed; the new signature is@objc(updateSubscriptions:unsubscribedChannelIds:unsubscribedMessageTypeIds:subscribedMessageTypeIds:campaignId:templateId:)
- Moved podspec
resources
toresource_bundles
to avoid name collisions for static libraries (thanks, iletch!) - Give
LogLevel
an Objective-C specific name (IterableLogLevel
) (thanks, osawhoop!)
- Made class extensions internal rather than public to avoid collisions (thanks, RolandasRazma!)
- Moved Mobile Inbox support to GA (no longer in beta), and:
- 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)
- Added support for Swift Package Manager
Please see each method's source code documentation for details.
IterableAPI.track(inAppOpen messageId: String)
IterableAPI.track(inAppClick messageId: String, buttonURL: String)
- Fixed in-apps where display types that were not
fullScreen
were not displaying properly or becoming unresponsive.
- Fixed the function signature of the
updateSubscriptions
call (thanks, Conor!) - Fixed
NoneLogDelegate
not being usable forIterableConfig.logDelegate
(thanks, katebertelsen!)
- Converted a log message variable to be interpreted as an UTF8 String (thanks, chunkyguy!)
- Enabled
BUILD_LIBRARY_FOR_DISTRIBUTION
for better compatibility across development environments
IterableAPI.spawnInAppNotification(_:)
- In-app messages are automatically shown by SDK now. Please check our migration guide.
IterableAPI.get(inAppMessages:)
- Use
IterableAPI.inAppManager.getMessages()
instead
- Use
- There is no need to set
IterableConfig.pushIntegrationName
for new projects.
Please see method documentation for details about how to replace them.
IterableAPI.inAppConsume(messageId:)
IterableAPI.showSystemNotification(..)
IterableAPI.getAndTrack(deeplink:callbackBlock:)
- Fixed a bug in token to hex conversion code.
- Use
WKWebView
instead of deprecated classUIWebView
. - Migrated all Objective-C code to Swift.
- Inbox
- Brand new inbox functionality. Please see documentation for more details.
- In this version we have changed the way we use in-app notifications. In-app messages are now being sent asynchronously and your code can control the order and time in which an in-app notification will be shown. There is no need to poll for new in-app messages. Please refer to the in-app messages section of README file for how to use in-app messages. If you are already using in-app messages, please refer to migration guide section of README file.
- Url scheme
iterable://
is reserved for Iterable internal actions. In an earlier beta version, the reserved url scheme wasitbl://
but we are not using that now.itbl://
scheme is only there for backward compatibility and should not be used. - Url scheme
action://
is for user custom actions.
- Increase number of in-app messages fetched from the server to 100.
- Support for
action://your-custom-action-name
URL scheme for calling custom actions- For example, to have
IterableCustomActionDelegate
call a custombuyCoffee
action when a user taps on an in-app message's Buy button.
- For example, to have
- Support for reserved
itbl://sdk-custom-action
scheme for SDK internal actions.- URL scheme
itbl://sdk-custom-action
is reserved for internal SDK actions. Do not use it for custom actions. - For example, future versions of the SDK may allow buttons to call href
itbl://delete
to delete an in-app message.
- URL scheme
- Carthage support with Xcode 10.2
- Xcode 10.2 Warnings
- URL Query parameters encoding bug
- We have improved the in-app messaging implementation significantly.
- 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.
- It should be straightforward to migrate to the new implementation. There are, however, some breaking changes. Please see migration guide for more details.
spawnInAppNotification
call is removed. Please refer to migration guide mentioned above.
- You can now use
updateEmail
if the user is identified with eitheremail
oruserId
. Earlier you could only callupdateEmail
if the user was identified byemail
. - The SDK now sets
notificationsEnabled
flag on the device to indicate whether notifications are enabled for your app.
- nothing yet
- Carthage support with Xcode 10.2
- More refactoring and tests.
- Now we do not call createUserForUserId when registering device. This is handled on the server side.
destinationUrl
was not being returned correctly from the SDK when using custom schemes for inApp messages.
- Call createUserForUserId when registering a device with userId
- Refactoring and tests.
- You can now set
logHandler
in IterableConfig. - Now you don't have to call
IterableAPI.registerToken
on login/logout.
- Don't show in-app message if one is already showing.
- Fixed issue that affects clients who are upgrading from Objective C Iterable SDK to Swift SDK. If you have attribution info stored in the previous Objective C SDK, it was not being deserialized in Swift SDK.