Architecture Reference - React Native

Reference documentation for the architecture of the Agentforce Mobile SDK for React Native.

Overview

The React Native Agentforce SDK is a bridge to the native iOS and Android SDKs, not a reimplementation. It provides a JavaScript API that delegates to platform-specific native modules.

┌─────────────────────────────────────────────────────┐
│                  React Native App                   │
│                                                     │
│  ┌─────────────────────────────────────────────┐   │
│  │       AgentforceService (JS Singleton)      │   │
│  └─────────────────────────────────────────────┘   │
│                         │                           │
│                    NativeModules                    │
│                         │                           │
├─────────────────────────┼───────────────────────────┤
│           iOS           │          Android          │
│  ┌──────────────────┐   │   ┌──────────────────┐   │
│  │ AgentforceModule │   │   │ AgentforceModule │   │
│  │     (Swift)      │   │   │     (Kotlin)     │   │
│  └──────────────────┘   │   └──────────────────┘   │
│           │             │            │              │
│  ┌──────────────────┐   │   ┌──────────────────┐   │
│  │  AgentforceSDK   │   │   │  agentforce-sdk  │   │
│  │   (CocoaPods)    │   │   │     (Maven)      │   │
│  └──────────────────┘   │   └──────────────────┘   │
└─────────────────────────┴───────────────────────────┘

iOS Architecture

The iOS implementation uses Swift and CocoaPods.

CocoaPods Setup

The bridge is distributed as a CocoaPods podspec with two subspecs:

Subspec Dependencies Use Case
Core (default) React-Core, AgentforceSDK Service Agent only
WithMobileSDK Core + SalesforceSDKCore Service Agent + Employee Agent auth

Source File Layout

ios/
  ReactNativeAgentforce.podspec
  Agentforce/
    AgentforceModule.swift          -- Main native module (RCTEventEmitter subclass)
    BridgeLogger.swift              -- Log forwarding bridge
    BridgeNavigation.swift          -- Navigation event bridge
    BridgeHiddenPreChat.swift       -- Hidden prechat field delegate
    ServiceAgentManager.swift       -- Legacy Service Agent manager
    Models/
      AgentMode.swift               -- Service/Employee mode enum
    Providers/
      UnifiedCredentialProvider.swift -- Credential provider for both modes
      BridgeViewProvider.swift       -- Custom view provider bridge

Native Module Registration

AgentforceModule is a subclass of RCTEventEmitter:

@objc(AgentforceModule)
class AgentforceModule: RCTEventEmitter {
    override static func requiresMainQueueSetup() -> Bool { return true }
    override func supportedEvents() -> [String]! {
        return ["onLogMessage", "onNavigationRequest"]
    }
}

UserDefaults Keys

Key Type Purpose
AgentforceFF_enableMultiAgent Bool Multi-agent feature flag
AgentforceFF_enableMultiModalInput Bool Multi-modal input feature flag
AgentforceFF_enablePDFUpload Bool PDF upload feature flag
AgentforceFF_enableVoice Bool Voice feature flag
EmployeeAgentId String Stored Employee Agent ID

Android Architecture

The Android implementation uses Kotlin and Gradle.

Gradle Setup

Key settings from the bridge's android/build.gradle:

android {
    namespace = "com.salesforce.android.reactagentforce"
    compileSdk 36
    defaultConfig {
        minSdkVersion 29
        targetSdkVersion 36
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
        coreLibraryDesugaringEnabled true
    }
    buildFeatures {
        compose = true
    }
}

Maven Repositories

repositories {
    google()
    mavenCentral()
    maven { url 'https://jitpack.io' }
    maven { url 'https://opensource.salesforce.com/AgentforceMobileSDK-Android/agentforce-sdk-repository' }
    maven { url 'https://s3.amazonaws.com/inapp.salesforce.com/public/android' }
    maven { url 'https://s3.amazonaws.com/salesforce-async-messaging-experimental/public/android' }
}

Key Dependencies

Dependency Scope Version Purpose
agentforce-sdk api 14.97.1 Core Agentforce SDK
SalesforceReact compileOnly 13.1.1 Mobile SDK (host app provides at runtime)
compose-bom implementation 2024.02.00 Jetpack Compose BOM
desugar_jdk_libs coreLibraryDesugaring 2.1.5 Java 8+ API desugaring

Source File Layout

android/src/main/java/com/salesforce/android/reactagentforce/
  AgentforcePackage.kt              -- ReactPackage registration
  AgentforceModule.kt               -- Main native module (@ReactMethod)
  AgentforceConversationActivity.kt -- Compose Activity for conversation UI
  AgentforceClientHolder.kt         -- Static holder for client/conversation
  EmployeeAgentAuthBridge.kt        -- Mobile SDK auth bridge
  BridgeLogger.kt                   -- Log forwarding
  BridgeNavigation.kt               -- Navigation event forwarding
  BridgeHiddenPreChat.kt            -- Hidden prechat field storage
  models/
    AgentMode.kt                    -- Service/Employee mode sealed class
  providers/
    UnifiedCredentialProvider.kt    -- Credential provider for both modes
    BridgeViewProvider.kt           -- Custom view provider bridge

Native Package Registration

AgentforcePackage registers native modules dynamically:

class AgentforcePackage : ReactPackage {
    override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
        val modules = mutableListOf<NativeModule>(AgentforceModule(reactContext))
        if (isMobileSdkAvailable()) {
            modules.add(EmployeeAgentAuthBridge(reactContext))
        }
        return modules
    }
}

The Mobile SDK check uses reflection. If not found, EmployeeAgentAuthBridge isn't registered.

SharedPreferences

Preferences File Keys Purpose
AgentforceFeatureFlags enableMultiAgent, enableMultiModalInput, enablePDFUpload, enableVoice, enableCustomViewProvider Feature flags
AgentforceEmployeeAgent employee_agent_id Stored Employee Agent ID

Event Communication

Events flow from native to JS via NativeEventEmitter:

Event Payload Description
onLogMessage { level, message, error? } SDK log message
onNavigationRequest { type, ...fields } Navigation request from agent

See Also