A lightweight iOS SDK built with Swift and UIKit to embed a Chatwoot-powered chat interface in any iOS app.
- Enable any iOS app to launch a full-featured Chatwoot chat screen
- Use UIKit for broad iOS compatibility (iOS 12+)
- ✅ Swift 5.7+
- ✅ UIKit Framework
- ✅ iOS 12+ (Broad device compatibility)
- ✅ SwiftUI Compatible (via UIViewControllerRepresentable)
In Package.swift
:
.package(url: "https://github.com/chatwoot/ios-agent-sdk", from: "1.0.0")
- Open your Xcode project
- Add Package Dependency:
- Go to File → Add Package Dependencies...
- Click Add Local.. (bottom left)
- Navigate to your local
ios-sdk
folder - Select the folder and click Add Package
- Configure Package: Select your target(s) and click Add Package
import ChatwootSDK
To enable photo capture or image upload features in the chat interface, you must add the following keys to your app’s Info.plist
:
<key>NSCameraUsageDescription</key>
<string>This app uses the camera to let you capture and upload photos in chat.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to your photo library to let you pick images for chat.</string>
- Open your project in Xcode.
- Locate your app target’s
Info.plist
file in the Project Navigator. - Right-click and select “Add Row”, then add each key above with a clear description string.
- NSCameraUsageDescription: Explains why the app uses the camera (e.g., photo capture for chat).
- NSPhotoLibraryUsageDescription: Explains why the app needs photo library access (e.g., image upload for chat).
Parameter | Type | Required | Default | Description |
---|---|---|---|---|
accountId |
Int |
✅ | - | Unique ID for the Chatwoot account |
apiHost |
String |
✅ | - | Chatwoot API host URL |
accessToken |
String |
✅ | - | Access token for authentication |
pubsubToken |
String |
✅ | - | Token for real-time updates |
websocketUrl |
String |
✅ | - | WebSocket URL for real-time communication |
inboxName |
String |
✅ | - | Display name for the inbox/chat channel |
inboxNameFontSize |
CGFloat |
❌ | 18 |
Font size for the inbox name in header |
backArrowIcon |
UIImage |
✅ | - | Back arrow icon for the header bar |
connectedIcon |
UIImage |
✅ | - | Icon displayed when the app is online |
disconnectedIcon |
UIImage |
✅ | - | Icon displayed when the app is offline |
disableEditor |
Bool |
❌ | false |
Disables the message editor in chat UI |
editorDisableUpload |
Bool |
❌ | false |
Disables file upload in the message editor |
// Create mandatory header icons as UIImage objects from SVG files using SVGKit
let backArrowIcon = createUIImageFromSVG(named: "back_arrow.svg")
let connectedIcon = createUIImageFromSVG(named: "connected_icon.svg")
let disconnectedIcon = createUIImageFromSVG(named: "disconnected_icon.svg")
ChatwootSDK.setup(ChatwootConfiguration(
accountId: 1,
apiHost: "https://your-chatwoot.com",
accessToken: "YOUR_ACCESS_TOKEN",
pubsubToken: "YOUR_PUBSUB_TOKEN",
websocketUrl: "wss://your-chatwoot.com",
inboxName: "Support", // Display name for the inbox
inboxNameFontSize: 20, // Optional: font size for inbox name (default: 18)
backArrowIcon: backArrowIcon, // Required: UIImage object
connectedIcon: connectedIcon, // Required: UIImage object
disconnectedIcon: disconnectedIcon, // Required: UIImage object
disableEditor: false, // Optional: disable message editor
editorDisableUpload: false // Optional: disable file uploads
))
Present Modally from UIKit (Recommended for Theming):
// UIKit Example
ChatwootSDK.presentChat(from: self, conversationId: 123)
SwiftUI Example (Call UIKit Presentation):
import SwiftUI
import ChatwootSDK
struct ContentView: View {
@State private var conversationId: String = "14635"
var body: some View {
Button("Open Chat") {
presentChatFromRoot()
}
}
private func presentChatFromRoot() {
guard let conversationIdInt = Int(conversationId) else { return }
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let rootVC = windowScene.windows.first?.rootViewController {
ChatwootSDK.presentChat(from: rootVC, conversationId: conversationIdInt)
}
}
}
- This approach ensures correct status bar theming and avoids SwiftUI modal limitations.
- Do not use
.fullScreenCover
orUIViewControllerRepresentable
for presenting the chat if you want full theming support.
The conversationId is required to load the chat UI. Make sure you have a valid conversation ID before calling loadChatUI.
// Set colors using UIColor or hex string
ChatwootSDK.setThemeColor(.systemBlue)
ChatwootSDK.setThemeColor("#1f93ff")
ChatwootSDK.setTextColor(.white)