React Native

5.0.0

Release date: January 12, 2026

Summary

Removes iOS 13 support, fixes iOS 26+ layout issues, and improves Knowledge Base navigation and UI behavior when liquid glass is enabled.

Fixed

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

Improvements

  • [iOS] Updated dependency versions to latest stable releases:
    • JWTDecode: 3.0.1 → 3.3.0
    • ReachabilitySwift: 5.2.3 → 5.2.4
  • [iOS] Improved iOS 26.0+ compatibility with liquid glass design features
  • [iOS] Improved Knowledge Base Article Viewer with custom header view for liquid glass enabled state

Breaking

  • [iOS] Removed iOS 13 support - changed minimum deployment target to >= iOS 14

Native SDK Versions

  • iOS: 7.0.0
  • Android: 4.3.1

See our migration guide for details on migrating from iOS 6.x.x

4.2.1

Release date: January 5, 2026

Summary

Fixes cases of missed messages after background or network interruptions, restores conversation ordering on Android, and ensures recovered messages notify all listeners.

New & fixed

Reliability & Recovery

  • Fixed a cross-platform issue where messages could be sent but not received after backgrounding or network interruptions.
  • SDKs (iOS & Android) now automatically verify and restore PubNub subscriptions when the app foregrounds, when connectivity returns, or during scheduled pre-expiry checks.
  • Recovered messages now trigger onChatMessageReceived callbacks for all registered listeners (Core SDK and UI SDK).

Android-specific fixes

  • Restored conversation sort order (regression from v4.1.1): unread first, then most recent.
  • Fixed observeUnreadCount() not firing immediately after Kustomer.login() on Android.

Native SDK versions

iOS: 6.3.1

Android: 4.3.1

  • [iOS|Android] Fixed PubNub connection issues that prevented message reception after background periods or network interruptions
  • [Android] Regression from v4.1.1, where chat history screen loses sort order of conversations
  • [Android] Issue where observeUnreadCount() was not working immediately after a Kustomer.login()

Behavioral improvements

  • Recovered messages are delivered via the same listener callbacks as real-time messages.
  • Recovered messages may be delivered in short bursts (small spacing) to avoid OS notification suppression.
  • In-app notifications are suppressed if a push notification for the same message was already shown.
  • No breaking public API changes.

Benefits for your app

  • No missed inbound messages after backgrounding or flaky networks.
  • Custom UIs receive consistent callbacks for recovered messages.
  • Conversation lists display correctly on Android.
  • Reduced duplicate notifications and improved UX.

Testing & compatibility

  • Unit and integration tests updated for recovery, reconnection, and sorting scenarios.
  • Platforms: React Native bridge uses native iOS 6.3.1 and Android 4.3.1 implementations.
  • No migration steps required for consumers.

Recommended action

Upgrade to v4.2.1 if you:

  • See missed messages after backgrounding or network changes.
  • Build custom UIs on the Core SDK.
  • Rely on correct conversation ordering (Android).
  • Need robust behavior across iOS and Android.

Technical Details

Automatic PubNub Reconnection (EUX-921)

Problem Statement:

When a user's app using the React Native SDK remained in the background for an extended period, the PubNub connection for subscriptions became broken when the app returned to the foreground. Users could send messages but could not receive them due to inactive subscriptions, creating a poor user experience where messages appeared to be sent but responses were not received.

Root Cause:

  • PubNub connections may timeout or become stale after extended background periods
  • iOS terminates network connections after ~30 seconds in background (without special background modes)
  • Android's Doze mode and App Standby terminate network connections to conserve resources
  • While PubNub SDK has automatic reconnection configured, it may not detect stale connections immediately after background periods
  • The connection status may show connected but subscriptions may be broken/inactive
  • No proactive verification that subscriptions are active and receiving messages when app returns to foreground

Solution Approach:

The native SDKs now automatically verify and reconnect 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

Implementation:

iOS Implementation:

  • Uses ProcessLifecycleOwner observer to detect app foreground events
  • Uses Reachability monitoring to detect network connectivity restoration
  • Verifies subscription health using listChannels as a lightweight proxy test
  • Automatically reconnects via reauthAndResubscribe() when subscriptions are inactive
  • Schedules periodic checks: 55 minutes on success, 5 minutes on error
  • Uses dedicated serial queue (reconnectionCheckQueue) with thread-safe flag management

Android Implementation:

  • Uses ProcessLifecycleOwner observer to detect app foreground events
  • Uses NetworkCallback to detect network connectivity restoration
  • Verifies subscription health using listChannels API call as lightweight proxy test
  • Automatically reconnects via initAndSubscribe() when subscriptions are inactive
  • Schedules periodic checks: 55 minutes on success, 5 minutes on error
  • Uses coroutine scope with Mutex for thread-safe serial execution

Before (Problem State):

flowchart TD
    Start([App in Background]) --> Background[Background Period<br/>~30+ seconds]
    Background --> OSKills[iOS/Android Kills Network<br/>Connections]
    OSKills --> 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,OSKills,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[ProcessLifecycleOwner<br/>onStart / applicationWillEnterForeground]
    Trigger -->|Network Restored| T2[NetworkCallback / Reachability<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[Network Restoration Handler]
    T3 --> Check
    T4 --> Schedule[scheduleNextReconnectionCheck]
    Schedule --> Check
    NetworkHandler --> Check

    %% Check flow
    Check --> Queue{Already Checking?<br/>isCheckingOrReconnecting}
    Queue -->|Yes| Skip1[Return Success<br/>Skip - Already in Progress]
    Queue -->|No| SetFlag[Set Flag = true]

    %% Verify subscriptions
    SetFlag --> Verify[verifySubscriptionsActive<br/>listChannels test]

    Verify --> VerifyResult{Result}

    %% Subscriptions active - done
    VerifyResult -->|Success: true| Skip2[Reset Flag = false<br/>Schedule Next Check<br/>55 min delay]
    Skip2 --> Complete1([Complete - Healthy])

    %% Subscriptions inactive - reconnect
    VerifyResult -->|Success: false| Reconnect[Reconnect via<br/>initAndSubscribe / reauthAndResubscribe]

    %% Other errors - reconnect
    VerifyResult -->|Failure: Error| Reconnect

    %% Reconnection path
    Reconnect --> ReconnectResult{Result}
    ReconnectResult -->|Success| ScheduleSuccess[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]
    ScheduleSuccess --> Complete3([Complete - Reconnected])
    ScheduleError --> Complete4([Complete - Retry Scheduled])

    %% 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

    class T1,T2,T3,T4 trigger
    class Queue,VerifyResult,ReconnectResult decision
    class SetFlag,Schedule,ScheduleSuccess,ScheduleError,NetworkHandler action
    class Skip1,Skip2 skip
    class Verify verify
    class Reconnect reconnect
    class Complete1,Complete3,Complete4 complete

Key Features:

  1. Foreground Detection:

    • Automatically detects when app returns to foreground
    • Verifies PubNub subscription health immediately
    • Reconnects if subscriptions are inactive
  2. Network Connectivity Monitoring:

    • Monitors network connectivity changes
    • Automatically triggers reconnection check when network is restored
    • Handles first network notification intelligently (skips if SDK already running, runs if SDK stopped)
  3. Scheduled Periodic Checks:

    • Automatically schedules reconnection checks before token expiration
    • Success case: Checks every 55 minutes (before 1-hour token expiration)
    • Error case: Retries every 5 minutes for faster recovery from transient failures
    • Creates continuous cycle of proactive health monitoring
  4. Subscription Verification:

    • Uses listChannels API call as lightweight proxy test
    • Single source of truth for all health check cases
    • Handles edge cases: not initialized, disconnected, logged out
  5. Thread Safety:

    • Prevents overlapping reconnection attempts
    • Uses serial execution (iOS: serial queue, Android: coroutine scope with Mutex)
    • Thread-safe flag management prevents race conditions

Usage:

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

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

React Native:

import { KustomerChat } from 'kustomer-chat-react-native';

// No code changes needed - reconnection is automatic
await KustomerChat.configure({
  // ... configuration
});

// Messages will now be received reliably even after:
// - Extended background periods
// - Network connectivity interruptions
// - App lifecycle changes

Logging:

All reconnection operations are logged by the native SDKs for troubleshooting:

iOS:

  • Uses LogV2 with .pubnubRecovery tag
  • Log levels: debug, warn, error

Android:

  • Uses permanent production logging
  • Log levels: debug, error
  • Logs include method entry, state checks, decision logic, completion results, and error details

Memory Leak Fixes:

Fixed critical memory leaks by properly canceling timers:

iOS:

// 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
}

Android:

// From KusPubnubService.kt
// Reconnection check job is properly cancelled in resetPubnub()
fun resetPubnub() {
  reconnectionCheckJob?.cancel()
  reconnectionCheckJob = null
  // ... reset logic
}

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
  7. Cross-Platform Consistency: Same behavior on both iOS and Android platforms

Technical Implementation Notes:

  • Simplified Approach: Both platforms use a single verifySubscriptionsActive() test that covers all cases (not initialized, no connection, inactive subscriptions, healthy)
  • Subscription Verification: Uses listChannels API call as lightweight proxy test (PubNub SDK doesn't expose subscription state directly)
  • Reconnection Strategy:
    • iOS: Uses reauthAndResubscribe() which internally calls initAndSubscribe()
    • Android: Uses initAndSubscribe() directly
  • Error Handling: Errors are handled gracefully with automatic retry scheduling
  • Edge Cases: Handles not initialized, disconnected, logged out scenarios gracefully

Conversation Sorting Fix (EUX-961)

Problem Statement:

In Android SDK v4.1.1, the Conversations screen displayed conversations in a seemingly random order instead of by date. The expected behavior is that conversations are ordered by date (most recent first) with unread messages at the top.

Root Cause:

Regression History:

  • Commit: 5b394631 - "fix: [KDEV-62273] fix unread message count issues (#607)"
  • Date: March 22, 2024
  • First appeared in: SDK v4.1.1

What Changed:
The commit changed conversation merging logic from:

value.addAll(response.dataOrNull!!)
_conversationList.postValue(KusResult.Success(value.distinctBy { it.id }))

To:

val conversationsMap = _conversationList.value?.dataOrNull?.associateBy { it.id }
    ?.toMutableMap() ?: mutableMapOf()
conversationList.forEach {
    conversationsMap[it.id] = it
}
val updatedConversations = conversationsMap.values.toList()
_conversationList.postValue(KusResult.Success(updatedConversations))

Why It Was Changed:
The change was made to fix duplicate conversation issues (KDEV-62273). The previous distinctBy approach always picked the first occurrence, which was often the older version. The Map approach correctly updates conversations with the latest version.

The Problem:
While the Map approach fixed the duplicate issue, it introduced a new problem: conversationsMap.values.toList() does not preserve any meaningful order, causing conversations to appear in random order.

Additional Issues:

  1. Order Loss During Merge: Converting Map.values.toList() loses order
  2. No Re-sorting on Updates: Sorting only occurred in the ViewModel when both conversations and settings were available, but updates via addOrReplace() didn't trigger re-sorting, causing the list order to become stale when conversations were updated via PubNub events
  3. Data Loss Bug: The addOrReplace() function incorrectly handled KusResult.Error and KusResult.Loading states, causing silent data loss when real-time updates occurred during error states

Solution Approach:

Implemented sorting at the repository level to ensure conversations are always sorted correctly, regardless of how they're added or updated.

Solution Approach:

Implemented sorting at the repository level to ensure conversations are always sorted correctly, regardless of how they're added or updated. This ensures consistent sorting behavior across all conversation update paths.

Implementation Details:

  1. New Sorting Utility (KusConversationSortUtil.kt):
    • Created centralized sorting function that sorts by:
      1. Unread message count (descending) - conversations with unread messages appear first
      2. Last message timestamp (descending) - most recent conversations appear first
    • Handles null/zero values by treating them as 0 (oldest)
    • Extracted comparator (conversationComparator) for reusability
    • Single source of truth for sorting logic

Sorting Utility Implementation:

// From KusConversationSortUtil.kt
internal object KusConversationSortUtil {
    /**
     * Comparator for sorting conversations:
     * 1. Unread message count (descending)
     * 2. Last message timestamp (descending)
     */
    val conversationComparator = compareByDescending<KusConversation> { it.unreadMessageCount }
        .thenByDescending { it.lastMessageAt ?: 0L }

    fun sortConversations(conversations: List<KusConversation>): List<KusConversation> {
        return conversations.sortedWith(conversationComparator)
    }
}
  1. Repository-Level Sorting (KusUiConversationRepository.kt):
    • Updated fetchConversations() to sort conversations after merging via Map
    • Ensures correct order even when fetching multiple pages during pagination
    • Sorting applied immediately after merging to prevent order loss

Repository Implementation:

// After merging conversations via Map
conversationList.forEach {
    conversationsMap[it.id] = it
}
// Sort conversations before posting to maintain correct order
val updatedConversations = KusConversationSortUtil.sortConversations(
    conversationsMap.values.toList()
)
_conversationList.postValue(KusResult.Success(updatedConversations))
  1. Real-time Update Sorting (KusLiveDataExtensions.kt):
    • Updated addOrReplace() to re-sort after adding/replacing conversations
    • Critical for maintaining order when conversations are updated via PubNub events
    • Fixed data loss bug where Error/Loading states would cause silent data loss

Data Loss Bug Fix:
The addOrReplace() function was updated to explicitly handle each KusResult state:

  • KusResult.Success: Preserve existing data
  • null (uninitialized): Use empty list
  • Error or Loading: Use empty list (prevents silent data loss)

Before (Data Loss Bug):

// ❌ Silent data loss when Error/Loading state
val value = this.value?.dataOrNull?.toMutableList() ?: mutableListOf(conversation)
// If value is Error/Loading, dataOrNull returns null, losing all conversations

After (Fixed):

// ✅ Explicit state handling prevents data loss
val value = when (val current = this.value) {
    is KusResult.Success -> current.data.toMutableList()
    null -> mutableListOf()
    else -> mutableListOf() // Error/Loading: use empty list
}
// Re-sort after adding/replacing
val sortedValue = KusConversationSortUtil.sortConversations(value)
this.postValue(KusResult.Success(sortedValue))

Before (Problem State):

// Conversations appeared in random order
// Map.values.toList() doesn't preserve order
val conversations = conversationsMap.values.toList()
// Order was inconsistent and unpredictable

After (Solution State):

// Conversations are always sorted correctly
// 1. Unread messages first (by unread count descending)
// 2. Then by last message timestamp (descending)
val sortedConversations = conversations.sortedWith(
    compareByDescending<Conversation> { it.unreadCount }
        .thenByDescending { it.lastMessageTimestamp ?: 0L }
)

Sorting Logic:

// From KusConversationSortUtil.kt
fun sortConversations(conversations: List<Conversation>): List<Conversation> {
    return conversations.sortedWith(
        compareByDescending<Conversation> { it.unreadCount }
            .thenByDescending { it.lastMessageTimestamp ?: 0L }
    )
}

Usage:

No code changes required - conversations are automatically sorted correctly in the Chat History screen.

React Native:

import { KustomerChat } from 'kustomer-chat-react-native';

// Conversations are now automatically sorted correctly:
// 1. Unread conversations appear first
// 2. Conversations are sorted by most recent message timestamp
// 3. Sorting is maintained during pagination and real-time updates

await KustomerChat.openChatHistory();
// Conversations display in correct order

Benefits:

  • Conversations consistently sorted by date (most recent first)
  • Unread messages always appear at the top
  • Sorting maintained during pagination, real-time updates, and refresh operations
  • Edge cases handled correctly (null timestamps, empty lists, etc.)
  • Fixed data loss bug where Error/Loading states would cause silent data loss

Testing:

Unit Tests:

  • Added comprehensive unit tests for sorting utility (KusConversationSortUtilTest.kt)
  • All 6 unit tests passing:
    1. sortConversations sorts by unread count first - Verifies unread messages appear first
    2. sortConversations sorts by lastMessageAt when unread count is same - Verifies date sorting
    3. sortConversations treats null lastMessageAt as zero - Verifies null handling
    4. sortConversations returns empty list for empty input - Verifies edge case
    5. sortConversations returns single conversation as-is - Verifies single item handling
    6. sortConversations prioritizes unread count over lastMessageAt - Verifies priority logic

Integration Tests:

  • Added bug reproduction tests in KusUiConversationRepositoryTest.kt:
    1. Merge/Pagination Bug Test: Verifies conversations maintain sort order when merged via Map during pagination
    2. Real-time Update Bug Test: Verifies conversations re-sort correctly when updated via addOrReplace()
  • Tests follow TDD approach: pass when bug exists, fail when bug is fixed (forcing expectations update)
  • All tests updated to verify correct sorted order after fix implementation

Test Coverage:

  • Sorting logic: 6/6 unit tests passing
  • Repository integration: 2/2 bug reproduction tests passing
  • Edge cases: null timestamps, empty lists, single items all handled correctly

Performance Considerations:

  • Sorting is O(n log n), which is acceptable for typical conversation list sizes (< 1000 items)
  • Sorting happens at repository level, ensuring consistent behavior
  • No performance regression observed in testing

4.2.0

Release date: 12-05-2025

Summary

Added

  • [iOS] Added markSessionAsRead(sessionId:completion:) — marks all messages and CSATs in a conversation as read.
  • [Android] Added markSessionAsRead(conversationId: String) — marks all messages and CSATs in a conversation as read.

Deprecated

  • [iOS] Deprecated markRead(conversationId:) and markRead(conversationId:messageIds:satisfactionId:).
  • [Android] Deprecated markRead(conversationId, messageIds, satisfactionId).

Native SDK Versions

  • iOS: 6.3.0
  • Android: 4.3.0

Technical Details

Deprecated Methods

iOS – Deprecated API:

// Deprecated - Use markSessionAsRead instead
Kustomer.markRead(conversationId: "conv_123")
Kustomer.markRead(conversationId: "conv_123",
                  messageIds: ["msg_1", "msg_2"],
                  satisfactionId: "sat_1")

Android – Deprecated API:

// Deprecated - Use markSessionAsRead instead
Kustomer.markRead("conv_123", listOf("msg_1", "msg_2"), "sat_1")

Deprecated APIs remain functional but internally route to markSessionAsRead.
They will be removed in a future major release.

New Methods

iOS – Recommended API:

// Marks all messages and CSATs as read
Kustomer.markSessionAsRead(sessionId: "conv_123") { error in
    if let error = error {
        print("Error marking session as read: \(error)")
    } else {
        print("Session marked as read successfully")
    }
}

Android – Recommended API:

// Marks all messages and CSATs as read
try {
    Kustomer.markSessionAsRead("conv_123")
} catch (e: Exception) {
    Log.e("Kustomer", "Error marking session as read", e)
}

React Native:

This method will be exposed directly in a future React Native SDK release. For now, use the underlying native implementations if needed.

4.1.1

Release date: 11-24-2025

Summary

Fixed

  • [iOS] Fixed an issue where replying to an assistant conversation with an attachment could break the conversation flow.
  • [Android] Improved performance when loading large conversation histories after login.

Native SDK Versions

  • iOS: 6.2.1
  • Android: 4.2.2

Technical Details

iOS – Assistant Attachment Flow

Issue:
Responding to an assistant conversation with an attachment could break the conversation flow.

Fix:
Attachment responses in assistant conversations are now handled correctly.
No client-side code changes are required.

Kustomer.openChatAssistant(assistantId: "assistant_123") { error in
    // Users can now respond with attachments without breaking the flow
}

Android – Conversation Loading Performance

Issue:
Customers with extensive chat history experienced long loading times after login.

Fix:
Optimized conversation fetching and loading logic for large conversation histories.
No client-side code changes are required.

Kustomer.login("customer_id") { success ->
    if (success) {
        // Conversations load more efficiently
    }
}

React Native:

// Improvements are applied automatically
await KustomerChat.login('customer_id');

4.1.0

Release date: 11-17-2025

Summary

Added

  • [iOS] Added Kustomer.setup() with a completion handler guaranteed to fire.
  • [iOS] Added all supported languages to KustomerLanguages.

Deprecated

  • [iOS] Deprecated Kustomer.configure().

Native SDK Versions

  • iOS: 6.2.0
  • Android: 4.2.1

Technical Details

Deprecated Method

iOS – Deprecated API:

// Deprecated - Completion block may not fire
Kustomer.configure(with: options) {
    // Completion handler not guaranteed to execute
}

New Method

iOS – Recommended API:

// Completion handler guaranteed to fire
Kustomer.setup(with: options) { error in
    if let error = error {
        print("Setup error: \(error)")
    } else {
        print("Setup complete")
    }
}

Language Support Update

iOS:

let options = KustomerOptions()
options.language = .english // .spanish, .french, .german, etc.

Kustomer.setup(with: options) { error in }

React Native:

import { KustomerChat } from 'kustomer-chat-react-native';

await KustomerChat.configure({
  language: 'en' // or 'es', 'fr', 'de', etc.
});

4.0.3

Release date: 10-23-2025

Added

  • [iOS][Android] Added Core SDK method Kustomer.chatProvider.createConversation().

Native SDK Versions

  • iOS: 6.1.2
  • Android: 4.2.1

V 4.0.2

Release date: 10-17-2025

Fixed

  • [Android] Crash that occurred sometimes when navigating to or from a KB article

Native SDK Versions

  • iOS: 6.1.2
  • Android: 4.2.1

v 4.0.1

Release date: 10-13-2025

Fixed

  • [iOS] Crash from triggering Kustomer.showKbArticle() or Kustomer.showKbCategory() while on a Background Thread

Native SDK Versions

  • iOS: 6.1.2
  • Android: 4.2.0

v 4.0.0

Release date: 10-09-2025

See the Migration guide for this release.

Fixed

  • [Android] Bumped Android NDK to v28 and JDK to 17 and enabled new architecture in React Native.

Native SDK Versions

  • iOS: 6.1.1
  • Android: 4.2.0

v 3.1.2

Release date: 10-02-2025

Fixed

  • [iOS] Fixed min target iOS SDK (from iOS 12 -> iOS 13)
  • iOS 12 support was removed in the native iOS SDK v6.0.0

Native SDK Versions

  • iOS: 6.1.1
  • Android: 4.1.1

v 3.1.1

Release date: 10-02-2025

Fixed

  • [iOS] An out-of-bounds crash could occur when updating the Chat History conversation.
  • [iOS] Logic around how unread counts are calculated.
  • [Android] Slow loading of the Chat History screen when the user has a lot of conversations.
  • [Android] Slow loading ofthe Chat Conversation screen when the conversation has a lot of messages.

Added

  • [iOS] A clearer message under messages that indicates ifthe message is “Generated by AI”.

Native SDK Versions

  • iOS: 6.1.1
  • Android: 4.1.1

v3.1.0

Release date: 9-25-2025

Deprecated

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

Added

  • (React Native) Added support for AI Agent teams on mobile both on iOS and Android
  • (Android) Added firstRead support to KusChatMessage, which enables unread count to consider firstRead status in calculations

Fixed

  • (iOS) Fixed HTML entities that appeared in French translations
  • (Android|iOS) Updated German translation for "Chat" tab
  • (iOS) Conditions that prevented Chat History Screen from displaying most up to data state of conversations
  • (iOS) Scenario where a previously logged in user's active conversation count could prevent a new logged in user from creating a conversation

Updated

  • Min iOS SDK: 13, updated from 12 .

Native SDK Versions

  • iOS: 6.1.0
  • Android: 4.1.0

v 3.0.1

Release date: 08-27-2025

Fixed

(Android) Resolved an issue where calling openChatAssistant on Android SDK 24 to 35 crashes due to missing user data

v 3.0.0

Release date: 07-14-2025

Added

  • (Android) Added support for Android SDK 35, including full edge-to-edge content rendering for a more immersive, modern UI experience.

Fixed

  • (Android) Resolved an issue where the article WebView did not extend fully to the top of the bottom navigation, ensuring proper layout and visual continuity.

Updated

  • Min Android SDK: 24 (Nougat), updated from 21.
  • Min JVM: 17

Native SDK Versions

  • iOS: 5.0.12
  • Android: 4.0.0

v 2.7.2

Release date: 07-11-2025

Fixed

  • (iOS) Crash caused by malformed PubNub messages (that can be caused by bad network connections).
  • (iOS) 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 2.7.1

Release date: 06-03-2025

Fixed

  • Compilation error in openChatAssistant, preventing iOS from building.

v2.7.0

Release date: 05-16-2025

Added

Fixed

  • (iOS) Crash caused by RACE condition during subscribe to PubNub channels.
  • (iOS) Bug where “No results” graphic would appear in KnowledgeBase, even if featured articles are present.
  • (iOS) KnowledgeBase will now use the custom domain supplied in the Kustomer app.
  • (iOS) Bug with Hide chat history setting, where (in some cases) a user could still see the back button from Chat and go to History.
  • (iOS) Issue with Kustomer.openChatAssistant() preventing follow-up assistant messages from appearing until the user re-enters the conversation.
  • (iOS) Wrong link color in outgoing message bubbles.
  • (Android) Fixed a ClassCastException that occurred when applying the dark theme to the article WebView based on device settings.
  • (Android) Fixed an issue where the article WebView failed to apply the dark theme on Android SDK versions 33 and higher.
  • (Android) Fixed a ClassCastException that occurred when applying the dark theme to the article WebView based on device settings.

Improved

  • (iOS) Increased thread safety in multiple areas to reduce crashes caused by concurrency and race conditions.
  • (Android) The New Conversation button is now disabled when there is no internet connection.
  • (Android) The empty conversation view now properly reflects offline hours based on the business schedule.
  • (Android) Removed unnecessary android.permission.CAMERA permission. The SDK only launches external camera apps using MediaStore.ACTION_IMAGE_CAPTURE and does not directly access camera APIs.

Native SDK Versions

  • iOS: 5.0.10
  • Android: 3.4.4

v2.6.0

Release date: 1-30-2025

Added

  • (iOS) Added Xcode 16 & iOS 18 support.
  • (Android) Introduced new Kustomer color branding and logo updates. A new secondary color attribute has been added to control the appearance of selected bottom navigation elements and other secondary components. More details are available in Customize colors.
  • (Android) The Core Android SDK now includes consumer ProGuard files for release builds, ensuring the required ProGuard rules are automatically applied. This removes the need for adopters to manually create or maintain these rules going forward.

Fixed

  • (iOS) Fixed an issue where chat history failed to load when a conversation was opened via a push notification while the app was not running.
  • (Android) Fixed an issue where chat history failed to load when a conversation was opened via a push notification while the app was not running.
  • (Android) Bug that caused two sequential multi-level list (MLL) steps in a conversational assistant to display the same options, even if they differ.
  • (Android) Bug that prevented the new callback named afterCreateConversationOrError in startNewConversation from executing when there is a failure in describeConversation.

Improved

  • (iOS) Enhanced KustomerCore initialization logic to minimize the risk of race conditions and unintended side effects.
  • (Android) Enhanced KustomerCore initialization logic to minimize the risk of race conditions and unintended side effects.

Native SDK Versions

  • iOS: 5.0.7
  • Android: 3.4.1

v2.5.0

Release date: 11-15-2024

Deprecated

  • (React Native) Deprecated the phones and emails fields on describeCustomer. The new methods to use are sharedPhones and sharedEmails.This provides clearer visibility on updated customer attributes.
    Note: The deprecated fields will continue to work and may be removed in a future version.

Fixed

  • (React Native) Added experimental support for React Native 0.76.
    • This requires Bridgeless mode to be disabled. See the Requirements page for more information.
  • (Android) Fixed an issue where the navigation would reset after attachment selection in Android OS 33+ devices.
  • (Android) Fixed a SecurityException thrown when monitoring network status via system service callback.
  • (Android) Fixed an IndexOutOfBoundsException occurring when converting chat responses to chat messages for the UI.
  • (iOS) 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.
  • (iOS) 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.

Added

  • (React Native) Added support for the startNewConversation method.

Native SDK Versions

  • iOS: 5.0.5
  • Android: 3.3.1

v2.4.0

Release date: 11-04-2024

Fixed

  • (React Native) isChatAvailable now returns a boolean on both platforms.
  • (React Native|iOS) Fixed an issue where openConversation could fail to open the SDK.
  • (React Native|iOS) showKbArticle and showKbCategory correctly open the KB UI.
  • (React Native|iOS) setPushToken will now show an informative error, instead of causing a crash.
  • (React Native) Updated the accuracy of various TypeScript types for SDK methods.
  • (React Native) Fixed the parsing of custom attributes within describeCustomer.
  • (iOS) Fixed a crash that would sometimes happen when in an active chat. This was caused by overlapping UITableViewDataSource updates that support the chat view.
  • (iOS) Fixed issues that prevented CSAT messages from incrementing unread count.
  • (iOS) Fixed UI issues that made the chat history screen look different than on web and Android.
  • (Android) Fixed an issue where the unread count indicator failed to update correctly upon receiving an initial outbound message while the app was terminated.
  • (Android) Fixed an issue where the unread count indicator was not set when a conversation received a satisfaction survey while the app was killed. The unread count is now correctly updated when the chat history is reopened.
  • (Android) Fixed a NullPointerException in KusChatFragment.getBinding that occurred when the pull-to-refresh action was still running while the chat screen was closed.
  • (Android) Fixed an issue related to the usage of the OkHttp BOM that caused build failures when using Android Gradle Plugin versions 8.2 or higher.

Added

  • (React Native) Added all to the logLevel type in the configure() method.
  • (React Native) Added a useIsKustomerLoggedIn hook.
  • (React Native) Added an updated Jest testing framework mock for the Kustomer SDK.
  • (React Native) Added the describeConversation method.
  • (iOS) Optimized Assets/Images in SDK to decrease the SDK's impact on app size.
  • Removed embedded SnapKit dependency and marked as Implementation ONLY - made size reduction.
  • (iOS) Removed embedded Reachability dependency and marked as Implementation ONLY - made size reduction.
  • (iOS) 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.
  • (iOS) Removed embedded Nantes dependency and marked as Implementation ONLY.
  • (iOS) Removed embedded NotificationView dependency and marked as Implementation ONLY.
  • Updated Kustomer logos.

Native SDK Versions

  • iOS: 5.0.4
  • Android: 3.3.0

v2.3.0

Release date: 09-23-2024

Fixed

  • (iOS) Removed Alamofire and AlamofireImage packages from dependencies, reducing the binary size of the iOS SDK.
  • (iOS) Fixed an issue where users could see unread message badges when there were no new messages.
  • (Android) Updated the KusLogOptions to use an enum instead of an integer.
  • (Android) Fixed all of the Android lint errors.
  • (Android) Addressed a rare IllegalStateException error that could be thrown when calling startNewConversation.

Added

  • (React Native) Added support for KustomerChat.close() to programmatically close the Kustomer UI.
  • (React Native) Added support for KustomerChat.describeCustomer().
  • (Android) Added support for Kustomer.isVisible(), not yet supported in React Native.

Native SDK Versions

  • iOS: 5.0.0
  • Android: 3.2.0

v 2.2.0

Release date: 09-09-2024

Fixed

  • (iOS) 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.
  • (iOS) SDK now explicitly calls all registerForRemoteNotifications() requests on the main thread to avoid any crashes when calling from a background thread
  • (Android) Fixed an issue where chat assistant rules were not evaluated in some instances.
  • (Android) Fixed a localization issue in which certain locales set via KustomerOptions.setUserLocale() were not parsed correctly.
  • (Android) Fixed a navigation issue caused by a missing default value.
    (Android) Fixed a minor NullPointerException that occurred when parsing the verifiedAt field for an identified customer.

v2.1.4

Release date: 08-08-2024

Fixed

  • (iOS) Fixed a crash that occurred when scrolling to the bottom of chat history when loading the next page of conversations.
  • (Android) Fixed an issue where the unread message count included messages from different brands.
  • (Android) Fixed a UI glitch that occurred with blank avatars whenever a conversation was opened.

Added

  • (iOS) KustomerUI.Color.quickActionButtonBorder to style quick reply and MLL buttons in chats.
  • (Android) Added pull-to-refresh functionality for the chat conversation view.

Improved

  • (iOS) Quick Reply buttons and MLL buttons are now rendered using quickActionButton, quickActionButtonText, and quickActionButtonBorder colors.

v2.1.3

Release date: 07-01-2024

Fixed

  • (iOS) Fixed a bug where swiping down to dismiss the MLL options screen left chat unable to reselect MLL options
  • (Android) Fixed an issue where featured articles failed to load when opened for non-default brands.
  • (Android) Fixed a minor UI bug in which the "no search results" view text was incorrectly aligned on smaller devices.

Updated

  • (Android) Upgraded knowledge base APIs to v4, enhancing the reliability of handling article locales and translations.

v2.1.2

Released: 03-15-2024

Added

  • Added additional information to configure the SDK for Android or using your JS/JT sources.

Updated

  • Updated KustomerSDK on iOS to 4.0.1.
  • Updated KustomerSDK on Android to 2.13.3.

v2.1.1

Released: 02-23-2024

Added

  • Type definitions.

Improved

  • Reduced build artifact size for iOS. (PubNub is no longer a static framework)

2.1.0

Released: 02-09-2024

Updated

  • Updated KustomerSDK on iOS to 4.0.0
  • Updated KustomerSDK on Android to 2.13.2
  • Called 2.0.1-22 on npmjs.com

v2.0.2

Updated

  • Updated to react-native 0.72.5