Skip to content

Commit fbc5197

Browse files
authored
Merge branch 'master' into chore/update-readme
2 parents db242c5 + 778d0a9 commit fbc5197

66 files changed

Lines changed: 4438 additions & 348 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/bcit-integration-test-deep-linking.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ jobs:
8080
./scripts/setup-local-environment.sh \
8181
"${{ secrets.BCIT_TEST_PROJECT_ID }}" \
8282
"${{ secrets.BCIT_ITERABLE_SERVER_KEY }}" \
83-
"${{ secrets.BCIT_ITERABLE_API_KEY }}"
83+
"${{ secrets.BCIT_ITERABLE_API_KEY }}" \
84+
"${{ secrets.BCIT_JWT_API_KEY }}" \
85+
"${{ secrets.BCIT_JWT_SECRET }}"
8486
8587
- name: Validate Setup
8688
working-directory: tests/business-critical-integration

.github/workflows/bcit-integration-test-embedded-messages.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ jobs:
8080
./scripts/setup-local-environment.sh \
8181
"${{ secrets.BCIT_TEST_PROJECT_ID }}" \
8282
"${{ secrets.BCIT_ITERABLE_SERVER_KEY }}" \
83-
"${{ secrets.BCIT_ITERABLE_API_KEY }}"
83+
"${{ secrets.BCIT_ITERABLE_API_KEY }}" \
84+
"${{ secrets.BCIT_JWT_API_KEY }}" \
85+
"${{ secrets.BCIT_JWT_SECRET }}"
8486
8587
- name: Validate Setup
8688
working-directory: tests/business-critical-integration

.github/workflows/bcit-integration-test-in-app.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ jobs:
7676
./scripts/setup-local-environment.sh \
7777
"${{ secrets.BCIT_TEST_PROJECT_ID }}" \
7878
"${{ secrets.BCIT_ITERABLE_SERVER_KEY }}" \
79-
"${{ secrets.BCIT_ITERABLE_API_KEY }}"
79+
"${{ secrets.BCIT_ITERABLE_API_KEY }}" \
80+
"${{ secrets.BCIT_JWT_API_KEY }}" \
81+
"${{ secrets.BCIT_JWT_SECRET }}"
8082
8183
- name: Validate Setup
8284
working-directory: tests/business-critical-integration

.github/workflows/bcit-integration-test-push-notification.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ jobs:
7676
./scripts/setup-local-environment.sh \
7777
"${{ secrets.BCIT_TEST_PROJECT_ID }}" \
7878
"${{ secrets.BCIT_ITERABLE_SERVER_KEY }}" \
79-
"${{ secrets.BCIT_ITERABLE_API_KEY }}"
79+
"${{ secrets.BCIT_ITERABLE_API_KEY }}" \
80+
"${{ secrets.BCIT_JWT_API_KEY }}" \
81+
"${{ secrets.BCIT_JWT_SECRET }}"
8082
8183
- name: Validate Setup
8284
working-directory: tests/business-critical-integration

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file.
44
This project adheres to [Semantic Versioning](http://semver.org/).
55
## [Unreleased]
66

7+
## [6.7.1]
8+
### Fixed
9+
- Fixed the `enableUnknownUserActivation` default value to `false`
10+
11+
## [6.7.0]
12+
13+
### Added
14+
- Added `IterableAPI.lastAuthTokenState` property to expose JWT auth token validity as an `AuthTokenValidityState` enum (`.unknown`, `.valid`, `.invalid`).
15+
- Auto-retry for JWT 401 failures during offline event processing — the SDK now pauses, refreshes the token, and retries the failed task automatically.
16+
17+
### Fixed
18+
- Fixed in-app messages not displaying during sync cooldown periods when using `inAppDisplayDelegate`.
19+
- Improved offline retry logic to distinguish transient failures (5xx, network errors, 429) from permanent client errors (4xx).
20+
- Added network connectivity debounce (3-second window) to prevent rapid pause/resume cycles in the offline task runner.
21+
22+
### Removed
23+
- Removed deprecated `trackEmbeddedDismiss` and `trackEmbeddedImpression` methods and their underlying API endpoints.
24+
725
## [6.6.7]
826
### Fixed
927
- Fixed module export for CocoaPods, enabling Obj-C/C++ compatibility

Iterable-iOS-AppExtensions.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Pod::Spec.new do |s|
22
s.name = "Iterable-iOS-AppExtensions"
33
s.module_name = "IterableAppExtensions"
4-
s.version = "6.6.7"
4+
s.version = "6.7.1"
55
s.summary = "App Extensions for Iterable SDK"
66

77
s.description = <<-DESC

Iterable-iOS-SDK.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Pod::Spec.new do |s|
22
s.name = "Iterable-iOS-SDK"
33
s.module_name = "IterableSDK"
4-
s.version = "6.6.7"
4+
s.version = "6.7.1"
55
s.summary = "Iterable's official SDK for iOS"
66

77
s.description = <<-DESC

swift-sdk.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@
187187
8AAA8BC32D07310600DF8220 /* IterableInboxViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AAA8BA52D07310600DF8220 /* IterableInboxViewController.swift */; };
188188
8AAA8BC42D07310600DF8220 /* IterableAppIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AAA8B992D07310600DF8220 /* IterableAppIntegration.swift */; };
189189
8AAA8BCD2D07310600DF8220 /* RetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AAA8B252D07310600DF8220 /* RetryPolicy.swift */; };
190+
9313470310D6B94EBF01743D /* AuthTokenValidityState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54D3BD1417B5702B16498AFF /* AuthTokenValidityState.swift */; };
190191
8AAA8BD32D07310600DF8220 /* IterableEmbeddedManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AAA8B282D07310600DF8220 /* IterableEmbeddedManagerProtocol.swift */; };
191192
8AAA8BD52D07310600DF8220 /* AuthFailure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AAA8B2D2D07310600DF8220 /* AuthFailure.swift */; };
192193
8AAA8BD62D07310600DF8220 /* AuthFailureReason.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AAA8B2E2D07310600DF8220 /* AuthFailureReason.swift */; };
@@ -644,6 +645,7 @@
644645
8AAA8B232D07310600DF8220 /* IterableInAppMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableInAppMessage.swift; sourceTree = "<group>"; };
645646
8AAA8B242D07310600DF8220 /* IterablePushNotificationMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterablePushNotificationMetadata.swift; sourceTree = "<group>"; };
646647
8AAA8B252D07310600DF8220 /* RetryPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RetryPolicy.swift; sourceTree = "<group>"; };
648+
54D3BD1417B5702B16498AFF /* AuthTokenValidityState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthTokenValidityState.swift; sourceTree = "<group>"; };
647649
8AAA8B272D07310600DF8220 /* IterableAuthManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableAuthManagerProtocol.swift; sourceTree = "<group>"; };
648650
8AAA8B282D07310600DF8220 /* IterableEmbeddedManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableEmbeddedManagerProtocol.swift; sourceTree = "<group>"; };
649651
8AAA8B292D07310600DF8220 /* IterableEmbeddedUpdateDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableEmbeddedUpdateDelegate.swift; sourceTree = "<group>"; };
@@ -1049,6 +1051,7 @@
10491051
8AAA8B222D07310600DF8220 /* IterableEmbeddedMessage.swift */,
10501052
8AAA8B232D07310600DF8220 /* IterableInAppMessage.swift */,
10511053
8AAA8B242D07310600DF8220 /* IterablePushNotificationMetadata.swift */,
1054+
54D3BD1417B5702B16498AFF /* AuthTokenValidityState.swift */,
10521055
8AAA8B252D07310600DF8220 /* RetryPolicy.swift */,
10531056
);
10541057
path = Models;
@@ -2212,6 +2215,7 @@
22122215
8AAA8BC32D07310600DF8220 /* IterableInboxViewController.swift in Sources */,
22132216
8AAA8BC42D07310600DF8220 /* IterableAppIntegration.swift in Sources */,
22142217
8AAA8BCD2D07310600DF8220 /* RetryPolicy.swift in Sources */,
2218+
9313470310D6B94EBF01743D /* AuthTokenValidityState.swift in Sources */,
22152219
8AAA8BD32D07310600DF8220 /* IterableEmbeddedManagerProtocol.swift in Sources */,
22162220
8AAA8BD52D07310600DF8220 /* AuthFailure.swift in Sources */,
22172221
8AAA8BD62D07310600DF8220 /* AuthFailureReason.swift in Sources */,

swift-sdk/Core/Constants.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,22 @@ enum Const {
5858
static let getEmbeddedMessages = "embedded-messaging/messages"
5959
static let embeddedMessageReceived = "embedded-messaging/events/received"
6060
static let embeddedMessageClick = "embedded-messaging/events/click"
61-
static let embeddedMessageDismiss = "embedded-messaging/events/dismiss"
62-
static let embeddedMessageImpression = "embedded-messaging/events/impression"
6361
static let trackEmbeddedSession = "embedded-messaging/events/session"
62+
63+
/// API paths that do not require JWT authentication.
64+
/// These can be executed even when the task runner is auth-paused.
65+
static let unauthenticatedPaths: Set<String> = [
66+
disableDevice,
67+
getRemoteConfiguration,
68+
mergeUser,
69+
getCriteria,
70+
trackUnknownUserSession,
71+
trackConsent,
72+
]
73+
74+
static func requiresJWTAuth(_ path: String) -> Bool {
75+
!unauthenticatedPaths.contains(path)
76+
}
6477
}
6578

6679
public enum UserDefault {
@@ -72,6 +85,7 @@ enum Const {
7285
static let deviceId = "itbl_device_id"
7386
static let sdkVersion = "itbl_sdk_version"
7487
static let offlineMode = "itbl_offline_mode"
88+
static let autoRetry = "itbl_auto_retry"
7589
static let unknownUserEvents = "itbl_unknown_user_events"
7690
static let unknownUserUpdate = "itbl_unknown_user_update"
7791
static let criteriaData = "itbl_criteria_data"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//
2+
// Copyright © 2026 Iterable. All rights reserved.
3+
//
4+
5+
import Foundation
6+
7+
@objc enum AuthTokenValidityState: Int {
8+
case unknown = 0
9+
case valid = 1
10+
case invalid = 2
11+
}

0 commit comments

Comments
 (0)