iOS

7.0.0

Release date: Jan 12, 2026

Summary

Introduces a breaking change by dropping iOS 13 support, fixes iOS 26+ UI issues, and improves Knowledge Base navigation with liquid glass enabled.

Fixed

  • Fixed iOS 26.0+ compatibility issues with tab bar navigation and layout constraints
  • Fixed back button title display in Knowledge Base categories when liquid glass is enabled
  • Fixed layout constraints in Chat History view controller to properly handle tab bar visibility state

Improved

  • Updated dependency versions to latest stable releases:
    • JWTDecode: 3.0.1 → 3.3.0
    • ReachabilitySwift: 5.2.3 → 5.2.4
    • NextGrowingTextView: 2.1.0 → 2.2.1
  • Improved Swift Package Manager dependency resolution by using .upToNextMinor(from:) versioning strategy for better compatibility
  • Improved iOS 26.0+ compatibility with liquid glass design features
  • Improved Knowledge Base Article Viewer with custom header view for liquid glass enabled state

Breaking

  • Swift Package Manager users must have Xcode 15.0 or later installed to integrate this SDK version. Older Xcode versions will not be able to resolve or build the package dependencies.
  • Removed iOS 13 support - changed minimum deployment target to >= iOS 14

Migrating from 6.X.X to 7.0.0

This guide will help you migrate your app from Kustomer iOS SDK versions 6.X.X to version 7.0.0.

Overview

Version 7.0.0 introduces several important changes:

  • Breaking Change: Minimum iOS deployment target increased from iOS 13 to iOS 14
  • New Feature: Support for iOS 26.0+ liquid glass design features
  • Breaking Change: Swift Package Manager users require Xcode 15.0 or later

Summary

To migrate to SDK 7.0.0:

  1. ✅ Update your app's minimum iOS deployment target to 14.0 or later
  2. ✅ (Optional) Add UIDesignRequiresCompatibility = YES to your Info.plist to disable liquid glass
  3. ✅ (Swift Package Manager only) Update to Xcode 15.0 or later
  4. ✅ Update the SDK version in your dependency manager
  5. ✅ Test your app thoroughly

1. Update Minimum iOS Deployment Target to iOS 14

The SDK now requires iOS 14.0 or later as the minimum deployment target. If your app currently supports iOS 13, you'll need to update your deployment target.

Why This Change?

  • iOS 14 provides better performance and security features
  • Dependency updates require iOS 14+ for optimal compatibility
  • Aligns with Apple's recommended minimum deployment targets for modern apps
  • Allows the SDK to leverage newer iOS APIs and improvements

Steps to Update Your App's Minimum Deployment Target

Option A: Update via Xcode Project Settings (Recommended)

  1. Open your project in Xcode
  2. Select your project in the Project Navigator (top-level item)
  3. Select your app target from the TARGETS list
  4. Go to the "General" tab
  5. Find "Minimum Deployments" section
  6. Set "iOS" to 14.0 or later

Option B: Update via Build Settings

  1. Open your project in Xcode
  2. Select your project in the Project Navigator
  3. Select your app target from the TARGETS list
  4. Go to the "Build Settings" tab
  5. Search for "iOS Deployment Target"
  6. Set the value to 14.0 or later

Option C: Update Podfile (CocoaPods)

If you're using CocoaPods, update your Podfile:

platform :ios, '14.0'

Then run:

pod install

Option D: Update Package.swift (Swift Package Manager)

If you're using Swift Package Manager, update your Package.swift:

platforms: [
    .iOS(.v14)
]

Verify the Change

After updating, verify the change:

  1. Check your project's build settings to confirm iOS Deployment Target is set to 14.0 or later
  2. Build your project to ensure there are no compilation errors
  3. Test your app on iOS 14+ devices or simulators to ensure compatibility

2. Disable Liquid Glass (Optional)

The Kustomer SDK automatically detects and adapts to liquid glass when available. Liquid glass is a new design system introduced in iOS 26.0+ that provides enhanced visual effects and transparency.

To disable liquid glass design features in iOS 26.0+, opt out by setting UIDesignRequiresCompatibility to YES in your app's Info.plist.

When to Disable Liquid Glass

You may want to disable liquid glass if:

  • Your app's design doesn't align with liquid glass aesthetics
  • You want consistent UI behavior across all iOS versions
  • You're experiencing layout issues with liquid glass enabled

⚠️ Important: Setting UIDesignRequiresCompatibility to YES in your app's Info.plist is an app-wide setting that will disable liquid glass for your entire app, not just the Kustomer SDK. This means all of your app's UI components will use the traditional iOS design instead of liquid glass effects on iOS 26.0+ devices. Make sure this aligns with your app's overall design strategy before making this change.

Steps to Disable Liquid Glass

Option A: Using Xcode's Property List Editor

  1. Open your project in Xcode
  2. Find your app's Info.plist file in the Project Navigator
  3. Right-click on Info.plist and select "Open As" → "Source Code" (or use the Property List editor)
  4. Add the following key-value pair:
<key>UIDesignRequiresCompatibility</key>
<true/>

Option B: Using Xcode's Property List Editor (Visual)

  1. Open your project in Xcode
  2. Find your app's Info.plist file in the Project Navigator
  3. Click on Info.plist to open it in the Property List editor
  4. Click the "+" button to add a new row
  5. Enter the key: UIDesignRequiresCompatibility
  6. Set the type: Boolean
  7. Set the value: YES (or check the checkbox)

Option C: Manual XML Edit

If you prefer to edit the XML directly:

  1. Open your Info.plist file in a text editor or Xcode's Source Code view
  2. Add the following entry inside the <dict> tag:
<key>UIDesignRequiresCompatibility</key>
<true/>

Your Info.plist should look something like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!-- ... other keys ... -->
    
    <key>UIDesignRequiresCompatibility</key>
    <true/>
    
    <!-- ... other keys ... -->
</dict>
</plist>

Verify the Change

After adding the key:

  1. Build and run your app on an iOS 26.0+ device or simulator
  2. Verify that liquid glass effects are disabled - the SDK will use the traditional iOS design instead
  3. Test your app's UI to ensure everything displays correctly

Note

  • App-Wide Impact: UIDesignRequiresCompatibility is an app-wide setting that affects your entire app's UI, not just the Kustomer SDK
  • Setting UIDesignRequiresCompatibility to YES (or true) disables liquid glass for the entire app
  • Setting it to NO (or false) enables liquid glass (if running iOS 26.0+)
  • If the key is not present, liquid glass will be enabled by default on iOS 26.0+
  • This setting only affects iOS 26.0+ devices; older iOS versions are unaffected

3. Update Xcode Version (Swift Package Manager Users Only)

If you're using Swift Package Manager to integrate the SDK, you must have Xcode 15.0 or later installed.

Why This Change?

The SDK now uses Swift tools version 5.9, which requires Xcode 15.0 or later.

Steps to Update

  1. Upgrade Xcode to version 15.0 or later

    • Download from the Mac App Store or Apple Developer portal
    • Or use xcode-select to switch to a compatible version
  2. Update CI/CD configurations (if applicable)

    • Update your build servers to use Xcode 15.0 or later
    • Update any GitHub Actions, Jenkins, or other CI/CD workflows
  3. Verify the update:

    xcodebuild -version
    

    Should show Xcode 15.0 or later

CocoaPods Users

If you're using CocoaPods, you don't need to update Xcode (unless you also use Swift Package Manager for other dependencies).


4. Update SDK Version

CocoaPods

Update your Podfile:

pod 'KustomerChat', '~> 7.0'

Then run:

pod update KustomerChat

Swift Package Manager

  1. Open your project in Xcode
  2. Select your project in the Project Navigator
  3. Select your app target
  4. Go to the "Package Dependencies" tab
  5. Find "KustomerChat" in the list
  6. Click the version and select "Upgrade to 7.0.0" or "Update to Latest Versions"

Alternatively, update your Package.swift:

dependencies: [
    .package(url: "https://github.com/kustomer/kustomer-ios.git", from: "7.0.0")
]

5. Testing Checklist

After completing the migration, test the following:

  • App builds successfully with iOS 14.0+ deployment target
  • App runs correctly on iOS 14+ devices/simulators
  • All Kustomer SDK features work as expected
  • UI displays correctly (especially if liquid glass is enabled/disabled)
  • No runtime crashes or warnings related to iOS version
  • Chat functionality works correctly
  • Knowledge Base displays correctly
  • Chat History displays correctly

6. Additional Notes

Dependency Updates

Version 7.0.0 includes updated dependencies:

  • JWTDecode: 3.0.1 → 3.3.0
  • ReachabilitySwift: 5.2.3 → 5.2.4
  • NextGrowingTextView: 2.1.0 → 2.2.1

These updates are handled automatically by your dependency manager.

iOS 26.0+ Compatibility

The SDK now includes comprehensive support for iOS 26.0+ features:

  • Proper layout handling for liquid glass design
  • Updated tab bar appearance configuration
  • Custom header views for Knowledge Base articles
  • Improved navigation bar transparency

Breaking Changes Summary

  1. iOS 14 minimum deployment target (was iOS 13)
  2. Xcode 15.0+ required for Swift Package Manager users (was Xcode 14.x)

7. Need Help?

If you encounter any issues during migration:

  1. Check the changelog for detailed technical information
  2. Review the SDK documentation
  3. Contact Kustomer Support for assistance

Happy migrating! 🚀

6.3.1

Release date: Dec 17, 2025

Summary

Fixes cases of missed messages after background or network interruptions, and ensures recovered messages notify listeners.

New & fixed

Improved message reliability.

  • Fixed an issue where apps could send messages but fail to receive them after extended background periods or network interruptions.
  • PubNub subscriptions are now automatically verified and restored when needed.

Message recovery notifications

  • Recovered messages now trigger onChatMessageReceived callbacks.
  • Both Core SDK consumers and built-in UI components receive recovered messages automatically.

Connection health monitoring

  • The SDK now performs proactive reconnection checks before auth tokens expire.
  • Recovery occurs automatically without manual intervention.

Behavioral improvements

  • Recovered messages now trigger the same listener callbacks as real-time messages.
  • Message recovery may deliver messages in short bursts to avoid OS notification suppression.
  • In-app notifications are suppressed when a push notification for the same message was already displayed.

Reliability enhancements

  • Automatic reconnection when:
    • The app returns to foreground.
    • Network connectivity is restored.
    • Authentication tokens approach expiration.
  • Adaptive retry logic improves recovery speed for transient failures while reducing resource use during extended outages.
  • Memory leaks related to reconnection timers have been fixed.

Benefits for your app

  • Users no longer miss messages after backgrounding.
  • Custom UIs receive consistent message callbacks.
  • Built-in UI components update automatically after recovery.
  • Reduced notification duplication.
  • Improved stability under real-world network conditions.

Testing & compatibility

  • Unit, integration, and UI tests added or expanded.
  • Scenarios tested include:
    • Background → foreground transitions.
    • Network loss and recovery.
    • Message recovery and listener notification.
    • Push and in-app notification deduplication.
    • Fully backward compatible.

Recommended action

Upgrade to v6.3.1 if your app:

  • Experiences missed messages after backgrounding.
  • Uses custom message listeners.
  • Relies on push and in-app notifications.
  • Operates in unstable network conditions

Technical Details

Automatic PubNub Reconnection

The SDK now automatically verifies and reconnects PubNub subscriptions when:

  1. The app returns to foreground after being in the background
  2. Network connectivity is restored (wifi or cellular)
  3. Periodically via scheduled checks before token expiration

This ensures that users can always receive messages, even after extended background periods or network interruptions.

Problem Solved:

Previously, when an app remained in the background for an extended period, iOS would terminate network connections (after ~30 seconds without special background modes). When the app returned to foreground, PubNub connections could appear connected but subscriptions would be inactive, causing users to send messages but not receive responses.

Before (Problem State):

flowchart TD
    Start([App in Background]) --> Background[Background Period<br/>~30+ seconds]
    Background --> iOSKills[iOS Kills Network<br/>Connections]
    iOSKills --> Foreground[App Returns to<br/>Foreground]
    Foreground --> CheckStatus[Check Connection Status]
    CheckStatus --> StatusOK{Status =<br/>.connected?}
    StatusOK -->|Yes| AssumeOK[Assume Connection OK<br/>No Verification]
    StatusOK -->|No| Reconnect[PubNub Auto-Reconnect<br/>May Not Detect Stale State]
    AssumeOK --> Problem[Problem: Subscriptions<br/>Actually Inactive]
    Reconnect --> Problem
    Problem --> SendOK[User Can Send Messages]
    Problem --> ReceiveFail[User Cannot Receive<br/>Messages]
    
    %% Styling - Dark mode safe grayscale palette
    classDef entry fill:#F8F9FA,stroke:#495057,stroke-width:2px,color:#000
    classDef process fill:#E9ECEF,stroke:#6C757D,stroke-width:2px,color:#000
    classDef decision fill:#CED4DA,stroke:#495057,stroke-width:2px,color:#000
    classDef problem fill:#6C757D,stroke:#212529,stroke-width:3px,color:#fff
    classDef endState fill:#495057,stroke:#343A40,stroke-width:2px,color:#fff
    
    class Start entry
    class Background,iOSKills,Foreground,CheckStatus,AssumeOK,Reconnect,SendOK process
    class StatusOK decision
    class Problem problem
    class ReceiveFail endState

After (Solution State):

flowchart TD
    Start([SDK Initialized]) --> Trigger{Reconnection Trigger}
    
    %% Triggers
    Trigger -->|App Foreground| T1[applicationWillEnterForeground]
    Trigger -->|Network Restored| T2[reachabilityChanged<br/>wifi/cellular]
    Trigger -->|Scheduled Check| T3[Scheduled Timer<br/>55 min success<br/>5 min error]
    Trigger -->|Auth Tokens Fetched| T4[getPubNubAuthTokens<br/>TTL-based scheduling]
    
    %% All triggers lead to checkAndReconnectIfNeeded
    T1 --> Check[checkAndReconnectIfNeeded]
    T2 --> NetworkHandler[wifiOrCellularIsNowReachable]
    T3 --> Check
    T4 --> Schedule[scheduleNextReconnectionCheck<br/>delay = TTL - 7.5 min]
    Schedule --> Check
    
    %% Network restoration flow with first notification check
    NetworkHandler --> FirstCheck{First Reachable<br/>Notification?<br/>isFirstReachableNotification}
    FirstCheck -->|Yes| SDKStatus{SDK Status?}
    FirstCheck -->|No| ScheduleDelay[scheduleDelayedReconnection<br/>5 sec delay]
    SDKStatus -->|.stopped| StartSDK[start SDK]
    SDKStatus -->|Running| SkipFirst[Skip - First notification<br/>during init]
    StartSDK --> ScheduleDelay
    ScheduleDelay --> Check
    
    %% Simplified check flow - always verify subscriptions
    Check --> Queue{Already Checking?<br/>isCheckingOrReconnecting}
    Queue -->|Yes| Skip1[Return Success<br/>Skip - Already in Progress]
    Queue -->|No| SetFlag[Set Flag = true]
    
    %% Simplified: Always verify subscriptions (single source of truth)
    SetFlag --> Verify[verifySubscriptionsActive<br/>listChannels test]
    
    Verify --> VerifyResult{Result}
    
    %% Subscriptions active - proceed to message recovery
    VerifyResult -->|Success: true| ResetFlag1[Reset Flag = false<br/>Schedule Next Check<br/>55 min delay]
    
    %% Subscriptions inactive - reconnect
    VerifyResult -->|Success: false| Reconnect[reauthAndResubscribe<br/>calls initAndSubscribe]
    
    %% Logged out - exit gracefully
    VerifyResult -->|Failure: No channel group name| Skip3[Reset Flag = false<br/>Return Success<br/>Skip - Logged Out]
    Skip3 --> Complete2([Complete - Logged Out])
    
    %% Other errors - reconnect
    VerifyResult -->|Failure: Other error| Reconnect
    
    %% Reconnection path
    Reconnect --> ReconnectResult{Result}
    ReconnectResult -->|Success| ResetFlag2[Reset Flag = false<br/>Schedule Next Check<br/>55 min delay]
    ReconnectResult -->|Failure| ScheduleError[Reset Flag = false<br/>Schedule Next Check<br/>5 min delay]
    ScheduleError --> Complete4([Complete - Retry Scheduled])
    
    %% Message Recovery Flow (after successful verification or reconnection)
    ResetFlag1 --> Recovery[markNewAgentMessagesDelivered<br/>isFromRecovery: true]
    ResetFlag2 --> Recovery
    
    Recovery --> FetchMessages[fetchUndeliveredMessages<br/>from PubNub history]
    FetchMessages --> HasMessages{Messages<br/>Found?}
    
    HasMessages -->|No| Complete1([Complete - Healthy<br/>No Messages to Recover])
    HasMessages -->|Yes| MarkDelivered[Mark as Delivered<br/>in Repository]
    
    MarkDelivered --> SendActions[Send Delivery Actions<br/>to PubNub]
    SendActions --> NotifyListeners[For Each Message:<br/>onChatMessageReceived<br/>to All Listeners]
    
    NotifyListeners --> CheckPush{Push Notification<br/>Already Displayed?}
    CheckPush -->|Yes| Suppress[Suppress In-App<br/>Notification]
    CheckPush -->|No| Show[Show In-App<br/>Notification]
    
    Suppress --> PostRefresh[Post chatHistoryShouldRefresh<br/>Event]
    Show --> PostRefresh
    
    PostRefresh --> RefreshUI[ChatHistoryViewController<br/>reloadDataSilently]
    RefreshUI --> Complete3([Complete - Messages Recovered<br/>UI Updated])
    
    %% Styling - Dark mode safe grayscale palette
    classDef trigger fill:#F8F9FA,stroke:#495057,stroke-width:2px,color:#000
    classDef decision fill:#E9ECEF,stroke:#6C757D,stroke-width:2px,color:#000
    classDef action fill:#CED4DA,stroke:#495057,stroke-width:2px,color:#000
    classDef skip fill:#DEE2E6,stroke:#343A40,stroke-width:2px,color:#000
    classDef reconnect fill:#6C757D,stroke:#212529,stroke-width:3px,color:#fff
    classDef complete fill:#495057,stroke:#343A40,stroke-width:2px,color:#fff
    classDef verify fill:#CED4DA,stroke:#6C757D,stroke-width:2px,color:#000
    classDef recovery fill:#E9ECEF,stroke:#495057,stroke-width:2px,color:#000
    classDef notification fill:#DEE2E6,stroke:#6C757D,stroke-width:2px,color:#000
    
    class T1,T2,T3,T4 trigger
    class Queue,VerifyResult,ReconnectResult,FirstCheck,SDKStatus,HasMessages,CheckPush decision
    class SetFlag,Schedule,ScheduleError,NetworkHandler,StartSDK,ScheduleDelay,Skip2,Skip3,ResetFlag1,ResetFlag2,MarkDelivered,SendActions,PostRefresh,RefreshUI action
    class Skip1,SkipFirst,Suppress,Show notification
    class Verify verify
    class Reconnect reconnect
    class Recovery,FetchMessages,NotifyListeners recovery
    class Complete1,Complete2,Complete3,Complete4 complete

Implementation:

The SDK now includes a checkAndReconnectIfNeeded() utility function that:

  • Verifies subscription health using listChannels as a lightweight proxy test
  • Automatically reconnects and re-subscribes if subscriptions are inactive
  • Uses a dedicated serial queue to prevent overlapping reconnection attempts
  • Handles edge cases gracefully (not initialized, disconnected, logged out)

Foreground Handler:

When the app returns to foreground, the SDK automatically checks PubNub connection health:

// From KustomerClient.swift
@objc private func applicationWillEnterForeground() {
  if settingsProvider.settings.didLoadSettingsAndSchedulesAtLeastOnce {
    if AuthProvider.shared.trackingTokenExists {
      self.startWithCachedTrackingToken { [weak self] r in
        // Check and reconnect PubNub if needed after foregrounding
        self?.chatProvider.checkPubNubConnectionAndReconnectIfNeeded { result in
          // Connection verified/reconnected successfully
        }
      }
    }
  }
}

Network Reachability Handler:

When network connectivity is restored, the SDK automatically schedules a reconnection check:

// From KustomerClient.swift
private func wifiOrCellularIsNowReachable() {
  // Schedule delayed reconnection check to allow network to stabilize
  scheduleDelayedReconnection()
}

private func scheduleDelayedReconnection() {
  let workItem = DispatchWorkItem { [weak self] in
    self?.chatProvider.checkPubNubConnectionAndReconnectIfNeeded { result in
      // Connection verified/reconnected successfully
    }
  }
  DispatchQueue.main.asyncAfter(deadline: .now() + 5.0, execute: workItem)
}

Scheduled Periodic Checks:

The SDK automatically schedules periodic reconnection checks to ensure connection health before token expiration:

// From PubNubManager.swift
func checkAndReconnectIfNeeded(
  completion: ((Result<Void, KError>) -> Void)? = nil,
  successDelay: TimeInterval = 3300, // 55 minutes
  errorRetryDelay: TimeInterval = 300  // 5 minutes
) {
  // Verifies subscriptions and reconnects if needed
  // Automatically schedules next check:
  // - 55 minutes on success (before token expiration)
  // - 5 minutes on error (faster recovery from transient failures)
}

Subscription Verification:

The SDK verifies subscription health using a lightweight listChannels test:

// From PubNubManager.swift
func verifySubscriptionsActive(completion: @escaping (Result<Bool, KError>) -> Void) {
  // Uses listChannels as lightweight proxy test
  // Returns true if subscriptions are active, false if inactive
  // Handles edge cases: not initialized, logged out, network errors
}

Thread Safety:

All reconnection operations use a dedicated serial queue (reconnectionCheckQueue) with thread-safe flag management to prevent overlapping calls:

// From PubNubUtitilities.swift
private let reconnectionCheckQueue = DispatchQueue(label: "com.kustomer.pubnub.reconnection")
private let reconnectionCheckLock = NSLock()
private var isCheckingOrReconnecting = false

Memory Leak Fixes:

Fixed critical memory leaks by properly canceling timers:

// From PubNubManager.swift
deinit {
  // Cancel reconnection check timer to prevent memory leaks
  reconnectionCheckTimer?.cancel()
}

func disconnect() {
  // Cancel reconnection check timer to prevent reconnection attempts after disconnect
  reconnectionCheckTimer?.cancel()
  reconnectionCheckTimer = nil
  // ... disconnect logic
}

Usage:

No code changes required - the SDK automatically handles reconnection. The functionality is internal and called automatically by the SDK when:

  • App returns to foreground
  • Network connectivity is restored
  • Scheduled periodic checks trigger

Logging:

All reconnection operations are logged using LogV2 with the .pubnubRecovery tag for troubleshooting:

LogV2.debug("PubNub reconnection check started", tags: [.pubnubRecovery])
LogV2.warn("Reconnection check skipped: already checking or reconnecting", tags: [.pubnubRecovery])
LogV2.error("PubNub reconnection check failed: \(error)", tags: [.pubnubRecovery])

Benefits:

  1. Improved Reliability: Messages are always received, even after background periods or network interruptions
  2. Automatic Recovery: No manual intervention required - SDK handles reconnection automatically
  3. Better User Experience: Users can send and receive messages seamlessly without connection issues
  4. Proactive Health Checks: Scheduled checks ensure connection health before token expiration
  5. Thread Safe: Prevents race conditions and overlapping reconnection attempts
  6. Memory Safe: Proper timer cleanup prevents memory leaks

Message Recovery and Listener Notification

When the SDK reconnects to PubNub after being disconnected, it now automatically recovers undelivered messages and notifies all registered listeners (both Core SDK users and UI SDK components). This ensures that custom UIs and built-in UI components stay in sync with recovered messages.

Problem Solved:

Previously, when messages were recovered after reconnection, they were marked as delivered but no listener events were executed. This meant:

  • Core SDK users building custom UIs received no notifications when messages were recovered
  • UI SDK components (ChatDataSourceProvider, ChatHistoryDataSourceProvider, etc.) didn't receive recovered messages
  • Users had to manually refresh or wait for new messages to see recovered content

Solution:

The SDK now notifies all registered listeners when messages are recovered:

// From ChatProvider.swift
private func markNewAgentMessagesDelivered(isFromRecovery: Bool = false) {
  pubSubService.fetchUndeliveredMessages { [weak self] channel, messages in
    // Mark messages as delivered
    self?.chatMessageRepository.markAsDelivered(...)
    self?.pubSubService.sendDeliveryActions(...)
    
    // Notify all listeners for each recovered message (only during recovery)
    if isFromRecovery {
      messages.forEach { message in
        self?.onChatMessageReceived(conversationId: messageConversationId, chatMessage: message)
      }
      // Trigger silent UI refresh
      EventBroadcaster.shared.post(.chatHistoryShouldRefresh, nil)
    }
  }
}

Key Features:

  1. Listener Notification: All registered listeners (Core SDK users and UI SDK components) receive onChatMessageReceived callbacks for each recovered message
  2. Silent UI Refresh: Chat history refreshes silently (no pull-to-refresh spinner) when messages are recovered
  3. Recovery-Specific Processing: Recovery logic only executes when isFromRecovery: true, maintaining backward compatibility
  4. Thread Safety: Listener calls and notifications are dispatched to the main thread to ensure safe UI updates

Push Notification Tracking:

The SDK now tracks which messages had push notifications displayed to prevent duplicate in-app notifications when messages are recovered:

  • Persistence: Push notification tracking persists across app launches using UserDefaults with a 48-hour expiration window
  • Automatic Cleanup: Expired entries are automatically cleaned up to prevent unbounded growth
  • Thread Safety: Uses KUSThreadSafeDictionary for thread-safe access from multiple threads

Implementation:

// From InAppNotificationManager.swift
func recordPushNotificationDisplayed(for messageId: String) {
  let now = Date()
  messagesWithPushDisplayed[messageId] = now
  persistPushNotifications()
  
  // Periodically clean up expired entries
  if messagesWithPushDisplayed.getAll().count % 10 == 0 {
    cleanupExpiredPushNotifications()
  }
}

func shouldDisplayNotification(for message: KUSChatMessage, conversationId: String) -> (shouldDisplay: Bool, reason: String?) {
  // Suppress in-app notification if push was already displayed
  if messagesWithPushDisplayed[message.id] != nil {
    return (false, "push notification was already displayed")
  }
  // ... other checks
}

Benefits:

  1. Consistent API: All listeners receive messages the same way whether they arrive via subscription or recovery
  2. Automatic UI Updates: Custom UIs and built-in components automatically update when messages are recovered
  3. No Duplicate Notifications: Prevents showing in-app notifications for messages that already had push notifications
  4. Better UX: Users see recovered messages immediately without manual refresh
  5. Backward Compatible: Non-recovery scenarios maintain original behavior (default isFromRecovery: false)

Bug Fixes and Code Quality Improvements

Fixed Conversation ID Extraction:

  • Fixed bug where conversation IDs containing hyphens were incorrectly truncated when extracted from PubNub channel names
  • Now correctly extracts full conversation IDs by finding the .convo- delimiter and taking everything after it

Thread Safety Improvements:

  • Replaced plain Set<String> with KUSThreadSafeSet<String>() for duplicate message processing guard in PubNubListener
  • Replaced plain [String: Date] dictionary with KUSThreadSafeDictionary<Date>() for push notification tracking in InAppNotificationManager
  • Ensured recovery-path listener calls and notifications run on main thread for safe UI updates

Code Quality:

  • Extracted magic numbers into well-named constants (e.g., DUPLICATE_MESSAGE_GRACE_PERIOD)
  • Removed unused channelName parameter from onChatMessageAttachmentsFetched and onConversationFetched methods
  • Fixed notification posting to occur exactly once per recovery (not once per channel) using thread-safe flag
  • Added comprehensive test coverage for push notification tracking and message recovery

Legacy Cleanup:

  • Automatic cleanup of legacy UserDefaults suite (com.kustomer.sdk.messageIdsFromPushUserDefaults) on initialization
  • Prevents unbounded growth of unused data from previous SDK versions

Test Improvements:

  • Fixed flaky UI tests by replacing blocking XCTWaiter.wait() calls with RunLoop.current.run(until:) to allow UI updates during waits
  • Fixed test isolation by clearing in-memory state between tests
  • Fixed persistence tests to properly verify UserDefaults persistence
  • Updated tests to use properly formatted PubNub channel names matching production format

6.3.0

Release date: 12-05-2025

Added

  • markSessionAsRead(sessionId:completion:)
    Marks all existing messages and CSATs in a conversation as read in a single call.

    • Resets unread counts to 0
    • Idempotent and safe to call multiple times
    • Does not affect future messages

Deprecated

  • markRead(conversationId:)
  • markRead(conversationId:messageIds:satisfactionId:)

Legacy APIs for marking messages as read. These now internally route to markSessionAsRead and will be removed in a future major release.

Migration

// Deprecated (still supported)
ChatProvider.shared.markRead(conversationId: sessionId,
                            messageIds: [],
                            satisfactionId: nil)

// Recommended
ChatProvider.shared.markSessionAsRead(sessionId: sessionId) { _ in }

6.2.1

Release date: 11-24-2025

Fixed

  • Fixed an issue where replying to an assistant conversation with attachments (with or without text) could break the conversation flow.

6.2.0

Release date:11-14-2025

Added

  • Kustomer.setup(apiKey:options:launchOptions:completion:)
    New setup API with a completion handler that is guaranteed to fire.
  • Expanded KustomerLanguage enum to include all supported locales.

Deprecated

  • Kustomer.configure()

Completion handler was not guaranteed to execute and will be removed in a future major release.

Migration

// Deprecated
Kustomer.configure(apiKey: apiKey,
                   options: options,
                   launchOptions: launchOptions) { _ in }

// Recommended
Kustomer.setup(apiKey: apiKey,
               options: options,
               launchOptions: launchOptions) { result in
  // Handle success or failure
}

v 6.1.1

Release date: 10-02-2025

Fixed

  • An out-of-bounds crash could occur when updating the Chat History conversation.
  • Logic around how unread counts are calculated.

Added

  • A clearer message under messages that indicate if the message is “Generated by AI”.

v 6.1.0

Release date: 08-28-2025

Fixed

  • Updated German translation for “Chat” tab.
  • Fixed HTML entities that appeared in French translations.

Added

v 6.0.0

Release date: 08-13-2025

Fixed

  • Conditions that prevented the Chat History Screen from displaying the most up-to-date state of conversations.
  • Scenario where a previously logged-in user’s active conversation count could prevent a new logged-in user from creating a conversation

Dropped

  • Removed iOS 12 support - changed minimum target to >= iOS 13

v 5.0.14

Release date: 07-23-2025

Fixed

  • Issue where writing to Kustomer.options while performing Kustomer.overrideBrandId() would cause the options to reset to default.

v 5.0.13

Release date: 07-14-2025

Fixed

  • Kustomer.overrideBrandId() would not change default assistant to new brand’s default assistant.
  • Kustomer.overrideBrandId() will now re-register to Push Notifications if that brand has a different PubNub keyset.
  • Potential duplicate messages (from the agent) in the conversation due to bad network connectivity on the agent side.

v 5.0.12

Release date: 07-07-2025

Fixed

  • Crash caused by malformed PubNub messages (that can be caused by bad network connections).
  • Bug in Knowledgebase handling, where the SDK would fail to set the proper Knowledgebase if it encountered a badly formatted response from the API.

v 5.0.11

Release date: 05-22-2025

Fixed

  • Crash caused by RACE condition during subscribe to PubNub channels.
  • Bug where “No results” graphic would appear in KnowledgeBase, even if featured articles are present.
  • KnowledgeBase will now use the custom domain supplied in the Kustomer app.

v 5.0.10

Release date: 04-07-2025

Added

  • New overrideBrandId function to allow SDK to override the current brandId.

Fixed

  • Fixed a bug with the Hide chat history setting where a user could occasionally still see the back button from chat and go to history.

v 5.0.9

Release date: 03-14-2025

Fixed

  • Issue with Kustomer.openChatAssistant() preventing follow up assistant messages from appearing until the user re-enters the conversation.

v 5.0.8

Release date: 01-31-2025

Fixed

  • Wrong link color in outgoing message bubbles.

Improved

  • Increased thread safety in multiple areas to reduce crashes caused by concurrency and race conditions.

v 5.0.7

Release date: 01-06-2025

Fixed

  • Bug that caused a crash when rendering a message that contains utf8 non-width characters.

Improved

  • Updated branding in the SDK to use Kustomer's new colors and logo.

Added

  • Multiple new configurable colors for customizing the look of the SDK: chatHeaderTitle, chatHeaderText, chatHeaderSeparator, historyRowTitle, historyRowSubtitle, historyRowDate, historyRowIcon, historyRowSeparator, historyText, outgoingMessageBubbleShadow, tabBatUnselectedItemBorderColor.
`tabBatUnselectedItemBorderColor`

tabBatUnselectedItemBorderColor

`chatHeaderTitle`, `chatHeaderText`, and `outgoingMessageBubbleShadow`

chatHeaderTitle, chatHeaderText, and outgoingMessageBubbleShadow

`historyRowTitle`, `historyRowSubtitle`, `historyRowDate`, `historyRowIcon`, `historyRowSeparator`, and `historyText`

historyRowTitle, historyRowSubtitle, historyRowDate, historyRowIcon, historyRowSeparator, and historyText

v 5.0.6

Release date: 12-05-2024

Added

  • Added Xcode 16 & iOS 18 support

Fixed

  • Resolved an issue where two consecutive Multi-Level List (MLL) steps in a conversational assistant displayed identical options, even when configured differently.
  • Fixed a bug where the afterCreateConversationOrError callback in startNewConversation didn't execute if there was a failure in describeConversation

v 5.0.5

Release date: 11-14-2024

Deprecated

  • phones, emails, and socials are now deprecated in the describeCustomer method. The new methods to use are: sharedPhones, sharedEmails, sharedSocials.

Fixed

  • Resolved an issue with the startNewConversation method callback, which previously did not execute in error scenarios. The updated callback now fires on both success and error.
  • Fixed a bug that prevented reply types (for example, buttons) from hiding in older messages. This includes an edge case where the same message displayed twice would incorrectly show reply buttons in both the old and new versions.

v 5.0.4

Release date: 11-01-2024

Improved

  • Removed crash scenarios in ChatViewController from multiple overlapping requests to update the chat.
  • Removed embedded SwiftyJSON dependency and marked as Implementation ONLY.
  • Removed embedded NextGrowingTestView dependency and marked as Implementation ONLY.
  • Removed embedded TaggerKit dependency.
  • Removed Sentry dependency.

Fixed

  • Fixed UI issues that made the chat history screen look different than on web and Android.

Added

  • Added the Kustomer.overrideAssistant(id) method to be in parity with Android.

v 5.0.3

Release date: 10-18-2024

Fixed

  • Fixed issues that prevented CSAT messages from incrementing unread count

v 5.0.2

Release date: 10-03-2024

Improved

  • Improved logic that fetches the unread count for messages after the app is brought into the foreground. Logic now does not mark any messages as read unless there is an actively open chat conversation.
  • Removed embedded Nantes dependency and marked as Implementation ONLY
  • Removed embedded NotificationView dependency and marked as Implementation ONLY

Fixed

  • Fixed Crash that would sometimes happen when in an active Chat. This was caused by overlapping updates to the UITableViewDataSource that supports the Chat view.

v 5.0.1

Release date: 09-26-2024

Improved

  • Optimized Assets/Images in SDK, to decrease impact SDK has on app size
  • Removed embedded SnapKit dependency and marked as Implementation ONLY - made size reduction
  • Removed embedded Reachability dependency and marked as Implementation ONLY - made size reduction

Removed

  • Removed KUSReachabilityChangedNotification type due to removal of Reachability dependency
  • Removed KUSReachabilityChanged notification name due to removal of Reachability dependency

v 5.0.0

Release date: 09-19-2024

Improved

  • Removed Alamofire and AlamofireImage dependency from SDK - made SDK size reduction.

Fixed

  • Unread count now filters out conversations with the wrong brand. This should fix unread counts that don’t appear to ever go away due to brand mismatch.

Deprecated

  • Deprecated case describeCurrentCustomerIsAnonymous in KError, because the describeCustomer function now allows anonymous users. This improves consistency in behavior across web and Android.

🚧

Breaking changes to Alamofire and AlamofireImage

  • Completely removed KUSURLConvertible and KUSAFError from the SDK, as they were only there to support the use of Alamofire and AlamofireImage.
  • Completely removed case alamofire(KustomerChat.KUSAFError) from KError, as it was only there to support the use of Alamofire and AlamofireImage.

v 4.2.0

Release date: 08-29-2024

Fixed

  • Chat screen and message bubbles now have no transforms applied to them. This helps mitigate any scrolling bugginess on the chat screen where swipe to dismiss functionality is triggered when scrolling to bottom (most recent) of chat.
  • SDK now explicitly calls all registerForRemoteNotifications() requests on the main thread to avoid any crashes when calling from a background thread

Added

  • Added support for Telugu (te) and Kannada (kn) translations.

4.1.6

Release date: 08-08-2024

Fixed

  • Crash when scrolling to the bottom of Chat history when loading the next page of conversations.

Added

  • KustomerUI.Color.quickActionButtonBorder - To style quick reply and MLL buttons in Chats

Improved

  • Quick reply and MLL buttons are now rendered using quickActionButton, quickActionButtonText, and quickActionButtonBorder colors.

v4.1.5

Release date: 06-28-2024

Fixed

  • Fixed a bug where swiping down to dismiss the MLL options screen left chat unable to reselect MLL options

v4.1.4

Release date: 06-07-2024

Improved

  • Improved the ability to use Kustomer.options.activeAssistant to override the organization’s default assistant when using Kustomer.startNewConversation() method. Previously, you could only change this once before SDK initialization. Now you can change it as many times as needed to switch between different conversational assistants.

v4.1.3

Release date: 05-24-2024

Fixed

  • Fixed a bug that prevented KustomerUI.Color.historyNewChatButtonText from being used in the New Chat button on the Chat History screen. Previously, a white color was used, regardless of the customer's set override.
  • Fixed a bug that caused a crash in the iOS SDK when an incoming message from an agent contains a Unicode “non-width space” character.

v4.1.2

Release date: 05-16-2024

Fixed

  • Fixed a bug that caused the app to crash when performing updates to the ChatHistoryViewController.

v4.1.1

Release date: 05-02-2024

🚧

Changes to Swift repository

Starting with the Kustomer Chat iOS SDK v4.1.1, you must use https://github.com/kustomer/kustomer-ios-spm as the repository when using Swift Package Manager to install the Kustomer Chat SDK. For more information, see Swift Package Manager installation

Fixed

  • The completion block in Kustomer.openChatAssistant() function now fires when the chat assistant is opened and the first message is sent. Previously, never fired.

Added

  • The framework now includes a privacy manifest to adhere to Apple’s new requirements when submitting an app that uses the KustomerChat SDK. The complete list of privacy reasons is found here.

Improved

  • Polling (implemented in v 4.1.0) now only refreshes the chat UI if missing messages are detected. This prevents the screen from flickering unless a change is detected.

v4.1.0

Release date: 04-23-2024

Improved

  • Improved the reliability of incoming message delivery when actively viewing a conversation.

v4.0.4

Release date: 04-17-2024

Fixed

  • Avatars were rendered for outgoing attachments when viewing the conversation on the Chat History screen.
  • Fixed a bug that caused ChatViewController to crash when loading an existing conversation.
  • Fixed a bug that resulted in a crash when accessing Kustomer-defined colors before the application bundles were accessible

Improved

  • Improved the reliability of incoming message delivery when actively viewing a conversation.

v4.0.3

Release date: 04-02-2024

Added

  • Public extension for notifications that allows the ability to check if notification.isFromKustomer(), and if notification.kustomerShouldDisplay(). This enables customers to wrap their own workflows around notifications.

v4.0.2

Release date: 03-22-2024

Fixed

  • Crash that would periodically occur due to the SDK attempting to update the chat history list while an update is already in progress.
  • In-app notifications would display for chat assistants with multiple initial messages whenever a new chat window was opened.

v4.0.1

Release date: 03-08-2024

Fixed

  • Reply types (like buttons in a chat assistant message) would sometimes disappear when messages were received out of order.
  • Avatars in customer satisfaction (CSAT) chat surveys were rendered without the image or initials.
  • Fixed a bug where if a list is dismissed without making a selection, a large blank space would appear in the Chat View where multi-level list options should be.
  • Bug that mistakenly marked delivered messages as undelivered, causing duplicate outbound messages.
  • App would periodically crash when a team logo was not assigned to chat.

Added

  • Logging around network reachability changes.
  • Additional logging to incoming message brand filtering.

Improved

  • Title, Text, and Avatars in the Chat View Header are now updated more often and with greater accuracy.

Deprecated

  • KustomerLogType.fatal has been deprecated in Kustomer.options.logLevels. Future versions of SDK Logging will log any error as KustomerLogType.error.

v4.0.0

Release date: 02-09-2024

🚧

Breaking changes to Pubnub installation

This change marks PubNub as an implementation detail.

As a result, PubNub is no longer included and exposed via the KustomerChat SDK when using import KustomerChat.

SDK users that are not directly using PubNub or its related data types no longer need the PubNub dependency.

SDK users with the need to directly use PubNub or its data types can now add any version of PubNub to their project and access it by using import PubNub.

Fixed

  • Crash in LoadingViewController when chat is disabled on the Kustomer App website.
  • Support for using Xcode 15.1 or higher.

Improved

  • No more duplicate symbol warnings in the Xcode console when building an app using SDK from SPM (Swift Package Manager).
  • SDK is now using the latest version of PubNub internally (v 6.3.0).
  • Improved chat message delivery on slow networks.

v3.1.1

Release date: 01-25-2024

Fixed

  • Issues where push notifications were not being re-subscribed to when Push Environment, Device Token, or Customer Id are changed. iOS devices now re-register with PubNub more frequently.
  • Crash when calling the Kustomer.showKbArticle() function with an empty or non-existent Id.
  • Avatar images displayed placeholders instead of actual images/initials on the Chat History screen. They now display correctly.

Improved

  • The chat input bar is now hidden by default and will only appear if the last outbound message does not have buttons for the customer to select. This improves the chat UI for users revisiting a conversation with Answer Button Feedback buttons.
  • The End Chat and Close Conversation buttons in the chat window header overlapped, making it difficult to tap the red x (End Chat button) without accidentally tapping the down arrow (Close Conversation button) instead.
  • Avatars will use only the name's first letter when falling back to displaying initials. This makes iOS, Android, and Web SDKs treat the fallback similarly.
  • The initials rendered in the avatar of an attachment cell were rendered using a system color, not a Kustomer-defined color. They now all render using the same set of Kustomer-defined colors.

v3.1.0

Release date: 12-01-2023

Fixed

  • Attachment Cells not displaying images on iOS 17.
  • Article Feedback buttons were cut at the bottom of the article when opening from a Deflection link.
  • Application now registers for PubNub push notifications every time the push environment changes.
  • Fixed a bug where some knowledge base categories did now show up due to missing attributes.

Added

  • Support for displaying AI chat assistant messages.
  • Support for AI assistant typing indicator.

Improved

  • Moved all quick reply actions into the message thread

v3.0.0

Release date: 09-18-2023

Update

  • Increased minimum deployment target to iOS 12.

📘

Support for new XCode Release Candidate

This update is to support the new Xcode 15 Release Candidate. You can find information about the Xcode 15 Release Candidate and minimum requirements here.

v2.9.0

Release date: 09-18-2023

Fixed

Fixed a crash when uploading Live Photos on devices running iOS 17. In iOS 14+, the NSPhotoLibraryUsageDescription in Info.plist file can be omitted if necessary.

v2.8.1

Release date: 08-07-2023

🚧

Known issue with lldb debugger

There is a known issue with the lldb debugger when using macOS Ventura 13.3.1. Please upgrade to versions greater than Ventura 13.3.1. As of this release the latest stable version is Ventura 13.5

Fixed

  • Fixed an issue where UI updates, while initializing Push, were running off the main thread causing a crash.
  • Fixed an issue where the SDK was preventing the usage of the article language when constructing the article URL to be viewed within the embed, which led to the inability to view articles in other languages.

Updated

  • Built using Xcode 14.3.1 and generated by Apple Swift version 5.8.1

v2.8.0

Release date: 07-17-2023

🚧

Changes to KUSChatListener events

When subscribing to KUSChatListener, events are no longer handled across all brands unless KustomerOptions.showAllBrandsConversationHistory is true. Only session events related to the provided brandId will be handled.

Fixed

  • Fixed an issue where conversations across an organization’s brands were appearing in chat history and in-app notifications

Added

Updated

  • ChatProvider.getConversationPage, ChatProvider.getOpenConversationCount and ChatProvider.getConversations now use a value of KustomerOptions.brandId as a query parameter when fetching sessions. By default, this is set to the default brand. If KustomerOptions.showAllBrandsConversationHistory is true then all sessions will be fetched across all brands.

v2.7.9

Release date: 04-18-2023

Fixed

  • Fixed an issue where the Start new conversation button is not available after a conversation has ended.
  • Fixed an issue where launching the chat app from a push notification caused the app to crash.
  • Fixed an issue with displaying branded knowledge base articles.

Improved

  • Improved support for the knowledge base language defaults when an article isn’t available in a user’s browser language.

Updated

  • Adding custom describe parameters to new conversations now supports any type.

v2.7.8

Release date: 03-14-2023

Fixed

  • Fixed a bug that caused line break issues when using emoji as bullet points in a list.
  • Fixed a bug where some conversations starting with a Data Attribute interaction were not saving the response as the conversation name.
  • Fixed a bug where UI and in-app notifications still appear despite setting both to false.
  • Fixed a bug where VoiceOver was highlighting a group of buttons instead of reading the selected one.
  • Fixed a bug where customers selecting a push notification when viewing the conversation’s history view were not being taken to the respective conversation thread.

Improved

  • Improved the reliability of message delivery when users are on a slower internet connection.
  • Improved initialMessages handling in non-assistant conversations.

Deprecated

v2.7.7

Release date: 02-01-2023

Fixed

  • Fixed a bug that allowed users to repeatedly press the Send button, resulting in resending the original message several times.
  • Fixed a bug where the End Chat button did not appear until a second message was drafted in chats without an assistant.
  • Fixed a bug where the text input field wasn’t visible when filling out a CSAT.
  • Fixed a bug where brand specific knowledge base searches were still showing default brand articles in the results. Now, only articles assigned to that brand will appear.
  • Fixed a bug where the New Conversation button was not working as expected. Now, the button initializes a new conversation.

Improved

  • Improved the Conversation listener logic.
  • Improved the chat UI. Now, the unread counter badge doesn’t overlap text.

v2.7.6

Release date: 12-13-2022

Summary: Hotfix release

🚧

Upcoming bitcode deprecation

In keeping with Apple's deprecation of bitcode support we will be building the framework with Xcode 14 and removing bitcode enablement in the following release. This may cause compatibility issues with Xcode 13 and apps that continue to use bitcode.

Fixed

  • Fixed a bug where the conversation was not being described with describe parameters when calling the startNewConversation method with initial message parameters.

v2.7.5

Release date: 12-08-2022

🚧

Upcoming bitcode deprecation

In keeping with Apple's deprecation of bitcode support we will be building the framework with Xcode 14 and removing bitcode enablement in the following release. This may cause compatibility issues with Xcode 13 and apps that continue to use bitcode.

Fixed

  • Fixed a bug where the conversation was not being described with describe parameters when calling the startNewConversation method.
  • Fixed a bug where articles that were not in a default brand category failed to open when viewing them in the chat UI for an alternative brand. Now, all articles in all brands are displayed properly.
  • Fixed a bug where agent messages sent while a customer was out of network didn’t load correctly once the customer was back online.
  • Fixed a bug that resulted in two conversations being created when a customer sends two attachments in an initial message.

Improved

  • Improved how the iOS SDK handles fetching messages after a disconnect with PubNub.
  • Improved error messaging when the user tries to preview an unsupported file type.
  • Deflection report now immediately shows all articles that are clicked in chat, even if the chat is abandoned after the article is clicked.

v2.7.4

Release date: 11-03-2022

Fixed

  • Fixed a bug where launching the chat app from a push notification caused the app to be blank.
  • Fixed a bug where the category name is shown twice in the Knowledge Base widget.
  • Fixed a bug where outbound chats messages were not appearing in the chat app.
  • Fixed a bug where inbound messages periodically displayed with a larger font size.
  • Fixed a bug that resulted in an additional space being entered for the first item in an ordered list.
  • Fixed a bug that was cutting off URLs shown in the chat UI.
  • Fixed a bug that resulted in elements to overlap and empty spaces when opening the chat UI from a push notification.

Improved

  • Improved the accuracy of Turkish translations.
  • Greater flexibility with push notifications in your mobile application by moving the Kustomer SDK to a secondary handler. For more information, see Implement Kustomer SDK as secondary handler.
  • Refactored the SDK to remove a third-party library.

Added

  • Added support for a new Request feedback interaction, a new conversational assistant feature.
  • Initial messages sent to a customer now appear on the agent timeline when creating a new session.
  • Added the Coveralls integration to the SDK which tracks code coverage and helps you identify parts of your code not covered by your test suite.

v2.7.3

Release date: 09-22-2022

Fixed

  • Fixed a bug where previously merged conversations were still appearing in the conversation list.
  • Fixed a bug where users had to quit and relaunch the app to receive push notifications.
  • Fixed a bug that caused describeConversation and getConversationPage to not run correctly.
  • Fixed a bug that caused users to receive a push notification with a repetitive message when a conversation is merged.
  • Fixed a bug where conversations that are reopened still appeared closed in the chat UI.

Added

  • Added filtering for insecure file types.
  • Added support to display knowledge base articles marked as “Featured Articles” on the Answers tab in the chat UI.

Improved

  • Improved the accuracy of Turkish translations.
  • Changes to Chat settings now reflect immediately within the SDK.

v2.7.2

Release date: 08-24-2022

Fixed

  • Fixed an issue where the pound (£) symbol was displaying incorrectly when viewing knowledge base articles in the chat widget.
  • Fixed an issue where Kustomer.logout() completion handler is not called after a successful log out.
  • Fixed a bug where the No knowledge base article results UI was not translated into other languages.
  • Fixed a bug where the openConversation completion handler was not being called when the conversation was successfully opened.

Added

  • Added a button that allows you to quickly scroll down to the bottom of the message thread.
  • Added support for setting a lock out period with satisfaction (CSAT) surveys. To edit the time period, go to Settings > Satisfaction > General tab on the Kustomer website.

Improved

  • Improved the performance of unread message counts.
  • Improved how articles render in the SDK.
  • Improved the consistency of language locale overrides set in the SDK.
  • Improved the user experience of the conversation history view UI.
  • Optimized code to improve the overall performance.

v2.7.1

Release date: 07-28-2022

Summary: Hotfix release

Fixed

  • Fixed a bug that periodically caused the assistant to send duplicate messages after backgrounding and reopening the app.
  • Fixed a bug where initial messages set in startNewConversation weren’t being sent.
  • Fixed a bug where the conversational assistant specified in openChatAssistant wasn’t respected.
  • Fixed a bug where logging in with an expired JWT token caused excessive retries.
  • Fixed a bug where responses sent to assistants triggered by a workflow failed on the first attempt.

Updated

  • Updated the BUILD_LIBRARY_FOR_DISTRIBUTION flag to Yes to support clients that want to build an updated version of their wrapper.

v2.7.0

Release date: 07-14-2022

Fixed

  • Fixed a bug where session data was still visible after logging out of chat.
  • Fixed a bug where KustomerUI.Color.messagesBackground was not correctly applying the set color to a message background.
  • Fixed a rare bug that caused chat to crash after the following error: NSInvalidArgumentException: _countWithNoChangesForRequest:error: A fetch request must have an entity

Added

Improved

  • Improved the local storage used by the SDK to get more reliable data and make it more dynamic.
  • Improved color customization for knowledge base articles in the SDK. Now, the article will display the colors that are set in your knowledge base theme by default. The following have been deprecated:
    • kbHeaderTint
    • kbArticleBackgroundLight
    • kbArticleBackgroundDark
    • kbSurveySubmitButtonText
    • kbSurveySubmitButton
  • Improved how customer deletion is handled. Now, end-users are logged out of chat when the delete event is received.
  • Improved how conversation deletion is handled. Now, deleting an open conversation ends the chat and the customer is prompted to start a new conversation.

Updated

  • Updated the Core SDK to improve performance and consistency in behavior across Android and iOS SDKs.

Removed

The following methods have been completely removed:

  • public func getConversations()
  • public func getConversation(conversationId:String)
  • public func chatMessages(conversationId:String)
  • public func getUnreadCount()
  • public func openConversationCount()
  • public func sendChatMessage(action:KUSMessageAction, completion _outerCompletion: @escaping (KUSChatMessage, KUSConversation)
  • public func sendChatMessage(text:String, assistant:KUSAssistant, completion _outerCompletion: @escaping (KUSChatMessage, KUSConversation)
  • public func sendChatMessage(mllNode:KUSMLLNode, completion _outerCompletion: @escaping (KUSChatMessage, KUSConversation)

v2.6.2

Release date: 05-18-2022

🚧

Deprecated

The following methods have been deprecated in this release and will be completely removed in iOS v2.7.0:

Please upgrade your implementation to iOS v2.6.2 to get the most up-to-date methods.

Fixed

  • Fixed a bug that caused the app to periodically crash when assistant buttons had very long text.
  • Fixed a bug that caused links in the conversational assistant to not work properly.
  • Fixed a bug that caused button labels to appear cut off if the device is set to use a larger text size.
  • Fixed a bug where the KBProvider.shared.getCategory method wasn’t successfully returning the Knowledge Base object properties. For more information, see Work with the Knowledge Base.
  • Fixed a rare edge case scenario of arithmetic overflow with Pubnub & threading issue with UI
  • Fixed a bug where conversations missed by an agent are closed even if a follow-up channel was selected.

Improved

  • Improved the performance and efficiency of the whole chat view UI. This includes improvements to read receipts, merged conversations, and sending attachments.
  • Improved button text alignment.
  • Improved the accuracy of Turkish translations.

Added

Added the following new methods:

v2.6.1

Release date: 04-07-2022

Fixed

  • Fixed a bug where KustomerColor.incomingMessageText was not correctly applying the set color to stylized text in the conversational assistant.
  • Fixed a bug that caused links in the conversational assistant to not work properly.
  • Fixed a bug that caused messages that started with a numeric value to appear as a numbered list.
  • Fixed a bug where the Enter key does not create a new line when a user is providing written feedback for a KB article.
  • Fixed a bug where images sent in an outgoing message via a URL didn’t display properly.

Added

  • Added a new ‘startNewConversation` method which introduces the functionality to start a new conversation with an end-user message by specifying the initial message direction.

Improved

  • Improved the accuracy of Turkish translations.
  • Improved the accuracy of the KustomerUI Colors enumerations reference.
  • Improved how CSAT followup questions display when the device is set to a right to left language, such as Arabic or Hebrew.

v2.6.0

Release date: 03-03-2022

🚧

Changes to PubNub installation

PubNub is now automatically downloaded as a dependency if using Swift Package Manager or Cocoapods.

Users manually installing the SDK must download PubNub separately instead of adding the KustomerPubSub framework. See Install the Kustomer Chat iOS SDK for more information.

This change exposes the pushEnvironment variable in KustomerOptions that was previously defined in KustomerPubSub. It is now an enum in KustomerChat.

Fixed

  • Fixed a bug causing the app to crash when presenting conversational assistant buttons on devices running iOS 15+.

Improved

  • Improved the UI when uploading an image to the chat. Now, an entire image can be uploaded without the need to crop it.
  • Improved our authentication to fix an issue where a chat conversation would occasionally not have an assistant.
  • Improved how we send CSAT responses to our backend to support CSAT reporting in various languages.

v2.5.4

Release date: 02-09-2022

Fixed

  • Fixed a bug where underscores were being removed from URLs, resulting in links that wouldn’t open in the chat UI.
  • Fixed a bug where the numeric part of an address automatically changed to 1. After a customer sends the message.
  • Fixed a rare bug where the chat widget was occasionally displayed by default on first launch even though only the Knowledge Base widget was turned on.
  • Fixed a bug where customer responses to a multiple choice CSAT question were being stored in the incorrect attribute.
  • Fixed a bug that prevented the keyboard from minimizing when answering a free text question.
  • Fixed a bug where the confirmation message when submitting a CSAT always displays in English, regardless of the device language or SDK settings. Now, the confirmation message will display in the correct language.

Added

  • Added support for article feedback. With this feature, customers can rate your articles as positive or negative and, if turned on, allow them to provide written feedback.
  • Added support for disabling attachments. To edit, go to Apps > Chat > Settings on the Kustomer website.
  • Added a new showKbCategory method that can be used to open a specific knowledge base category.

Improved

  • Improved the user experience and overall consistency for the chat UI.
  • Improved the voice-over controls experience for conversational assistant prompts.
  • Improved the performance of the chat widget.

Updated

  • Updated the conversation list to no longer display draft conversations.