The markdown parsing is broken/disabled for release notes. Sorry about that, I'm chasing the source of a crash that's been bringing this website down for the last couple of days.
Added
- iOS SDK now includes a new privacy policy file indicating SDK's usage of user data
Fixed
- 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
Added
- 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](https://support.iterable.com/hc/articles/23061840746900).
Changed
- `IterableConfig` is updated with an `enableEmbeddedMessaging` flag that needs to be set to true to allow use of embedded messaging functionality
Changed
- IterableTaskRunner’s stop function now to set `running` variable as `false`
### Added
- `sendRequestWithRetries` function added as part of the `NetworkHelperclass`
- 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.
### Changed
- updates `sendRequest` in `RequestProcessorUtil` to retry the API request that resulted in a 401 response upon receipt of a new JWT
- updates `NetworkHelper` class logic to use `sendRequestWithRetries`method which wraps the original `networkSession.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.
### Added
- 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)](https://support.iterable.com/hc/articles/17572750887444), configure the SDK to use Iterable's EU-based API endpoints:
_Swift_
```swift
let config = IterableConfig()
config.dataRegion = IterableDataRegion.EU
IterableAPI.initialize(apiKey: "<YOUR_API_KEY>", launchOptions: launchOptions, config: config)
```
_Objective-C_
```objectivec
IterableConfig *config = [[IterableConfig alloc] init];
config.dataRegion = IterableDataRegion.EU;
[IterableAPI initializeWithApiKey:@"<YOUR_API_KEY>" launchOptions:launchOptions config:config];
```
### Fixed
- Offline Mode is now off by default. Offline mode components will only load when the `offlineMode` configuration for RequestHandler is set to true.
### Changed
- Offline mode configuration now persists throughout the current app session. Changes will take effect from the next app session.
### Added
- Success and Failure handlers can now be passed to following functions:
`InAppManager.remove`, `InAppManager.setRead`, `IterableAPI.setEmail` and `IterableAPI.setUserId`
### Added
- `ITBNotificationServiceExtension` has a new optional delegate in the scenario of wanting to receive and pass along push information (e.g. Firebase)
### Changed
- 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
### Fixed
- The `itbl_inapp.json` file generated from in-app messaging has been relocated to the correct spot
### Added
- Added a new function to `IterableAPI` to get the currently set authentication token
- Added a new function (`onTokenRegistrationFailed`) to the `IterableAuthDelegate` upon authentication token retrieval failure
### Changed
- Changed `setEmail` and `setUserId` to run through the login process if also sent in an authentication token (and a non-`nil` ID)
### Fixed
- Fixed instances where setting a new authentication token for a user failed
### Fixed
- Fixed so that `AuthManager` clears the previous refresh timer before setting a new one (thanks, @cranberyxl!)