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 |