Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
cometchat avatar

Cometchat Ios Features

  • 5 installs
  • 70 repo stars
  • Updated June 23, 2026
  • cometchat/cometchat-skills

Feature catalog for CometChat iOS UI Kit v5 covering calls, reactions, polls, stickers, AI features, and extensions with enablement steps.

About

Documents the features available in CometChat iOS UI Kit v5 and how to enable and configure each. A developer uses it to add voice/video calls, reactions, polls, stickers, or AI features to an iOS chat app.

  • Voice/video calls require the Calls SDK plus Info.plist permissions
  • Covers reactions, polls, stickers, AI features, and extensions

Cometchat Ios Features by the numbers

  • 5 all-time installs (skills.sh)
  • Ranked #828 of 1,039 Mobile Development skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cometchat/cometchat-skills --skill cometchat-ios-features

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs5
repo stars70
Last updatedJune 23, 2026
Repositorycometchat/cometchat-skills

What it does

Feature catalog for CometChat iOS UI Kit v5 covering calls, reactions, polls, stickers, AI features, and extensions with enablement steps.

Files

SKILL.mdMarkdownGitHub ↗

Purpose

This skill documents all features available in CometChat iOS UI Kit v5 — voice/video calls, reactions, polls, stickers, AI features, and extensions. Use this to understand what's available and how to enable/configure each feature.

---

1. Voice & Video Calls

Prerequisites

Add the CometChat Calls SDK to your project:

CocoaPods:

pod 'CometChatCallsSDK', '~> 4.0'

Swift Package Manager:

https://github.com/cometchat/cometchat-calls-sdk-ios

Required Permissions

Add to Info.plist:

<key>NSCameraUsageDescription</key>
<string>Camera access is required for video calls</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for voice and video calls</string>

Enable Background Modes

In Xcode → Target → Signing & Capabilities → Background Modes:

  • ✅ Audio, AirPlay, and Picture in Picture
  • ✅ Voice over IP

Call Buttons

Add call buttons to your message header:

let messageHeader = CometChatMessageHeader()
messageHeader.set(user: user)

// Call buttons are shown by default when CometChatCallsSDK is available
// To hide them:
messageHeader.hideVideoCallButton = true
messageHeader.hideVoiceCallButton = true

Standalone Call Buttons

// CometChatCallButtons requires explicit width/height at init — no zero-arg init.
let callButtons = CometChatCallButtons(width: 80, height: 32)
callButtons.set(user: user)

// Or for group calls
callButtons.set(group: group)

// Customize
callButtons.hideVideoCallButton = false
callButtons.hideVoiceCallButton = false

Initiating Calls Programmatically

import CometChatSDK

// Voice call to user
let call = Call(receiverId: user.uid ?? "", callType: .audio, receiverType: .user)
CometChat.initiateCall(call: call) { call in
    print("Call initiated: \(call?.sessionID ?? "")")
} onError: { error in
    print("Error: \(error?.errorDescription ?? "")")
}

// Video call to user
let videoCall = Call(receiverId: user.uid ?? "", callType: .video, receiverType: .user)
CometChat.initiateCall(call: videoCall) { call in
    print("Video call initiated")
} onError: { error in
    print("Error: \(error?.errorDescription ?? "")")
}

// Group call
let groupCall = Call(receiverId: group.guid ?? "", callType: .video, receiverType: .group)
CometChat.initiateCall(call: groupCall) { call in
    print("Group call initiated")
} onError: { error in
    print("Error: \(error?.errorDescription ?? "")")
}

Handling Incoming Calls

CometChat UI Kit automatically handles incoming calls when properly configured. The CometChatIncomingCall view controller is presented automatically.

For custom handling:

import CometChatSDK

class CallListener: CometChatCallDelegate {
    
    func onIncomingCallReceived(incomingCall: Call?, error: CometChatException?) {
        guard let call = incomingCall else { return }
        
        DispatchQueue.main.async {
            let incomingCallVC = CometChatIncomingCall()
            incomingCallVC.set(call: call)
            incomingCallVC.modalPresentationStyle = .fullScreen
            
            // Present from root view controller
            UIApplication.shared.windows.first?.rootViewController?.present(
                incomingCallVC,
                animated: true
            )
        }
    }
    
    func onOutgoingCallAccepted(acceptedCall: Call?, error: CometChatException?) {
        print("Call accepted")
    }
    
    func onOutgoingCallRejected(rejectedCall: Call?, error: CometChatException?) {
        print("Call rejected")
    }
    
    func onIncomingCallCancelled(canceledCall: Call?, error: CometChatException?) {
        print("Call cancelled")
    }
}

// Register listener
CometChat.addCallListener("call-listener", CallListener())

Call Settings Builder

Customize call behavior:

#if canImport(CometChatCallsSDK)
import CometChatCallsSDK

let callSettings = CallSettingsBuilder()
    .setIsAudioOnly(false)                    // Video call
    .setDefaultAudioMode("SPEAKER")           // "SPEAKER" or "EARPIECE"
    .setShowSwitchToVideoCall(true)           // Allow switching to video
    .setShowEndCallButton(true)
    .setShowMuteAudioButton(true)
    .setShowPauseVideoButton(true)
    .setShowSwitchCameraButton(true)
    .setShowAudioModeButton(true)
    .setStartWithAudioMuted(false)
    .setStartWithVideoMuted(false)
    .build()

let outgoingCall = CometChatOutgoingCall()
outgoingCall.set(call: call)
outgoingCall.set(callSettingsBuilder: callSettings)
#endif

Call Logs

Display call history:

let callLogs = CometChatCallLogs()
callLogs.onItemClick = { callLog, indexPath in
    // Handle call log tap - maybe initiate a new call
    print("Call log tapped: \(callLog)")
}
navigationController?.pushViewController(callLogs, animated: true)

---

2. Message Reactions

Reactions are enabled by default in CometChat UI Kit v5.

Enable/Disable Reactions

let messageList = CometChatMessageList()
messageList.set(user: user)

// Hide reaction option from message menu
messageList.hideReactionOption = true

Reaction Events

class ReactionListener: CometChatMessageEventListener {
    
    func onMessageReactionAdded(reactionEvent: ReactionEvent) {
        print("Reaction added: \(reactionEvent.reaction ?? "")")
        print("By user: \(reactionEvent.reactedBy?.name ?? "")")
        print("On message: \(reactionEvent.message?.id ?? 0)")
    }
    
    func onMessageReactionRemoved(reactionEvent: ReactionEvent) {
        print("Reaction removed: \(reactionEvent.reaction ?? "")")
    }
}

CometChatMessageEvents.addListener("reaction-listener", ReactionListener())

Custom Reaction Set

// Configure available reactions
let messageList = CometChatMessageList()

// The reaction set is configured through the data source
// See cometchat-ios-customization skill for DataSource customization

---

3. Polls

Polls allow users to create and vote on questions.

Enable Polls Extension

cometchat apply-feature polls --app-id <your-app-id>

Once enabled, the poll creation option appears in the attachment menu.

Create Poll Programmatically

import CometChatSDK

// Create poll data
let pollData: [String: Any] = [
    "question": "What's your favorite programming language?",
    "options": ["Swift", "Kotlin", "JavaScript", "Python"]
]

// Create custom message with poll type
let pollMessage = CustomMessage(
    receiverUid: user.uid ?? "",
    receiverType: .user,
    customType: "extension_poll",
    customData: pollData
)

CometChat.sendCustomMessage(message: pollMessage) { message in
    print("Poll sent: \(message?.id ?? 0)")
} onError: { error in
    print("Error: \(error?.errorDescription ?? "")")
}

Poll Bubble Customization

// Polls are rendered using CometChatPollBubble
// Style customization:
CometChatPollBubble.style.backgroundColor = .secondarySystemBackground
CometChatPollBubble.style.questionTextColor = .label
CometChatPollBubble.style.questionTextFont = CometChatTypography.Heading4.medium
CometChatPollBubble.style.optionTextColor = .label
CometChatPollBubble.style.optionTextFont = CometChatTypography.Body.regular
CometChatPollBubble.style.voteCountTextColor = .secondaryLabel

---

4. Stickers

Stickers provide a fun way to express emotions.

Enable Stickers

cometchat apply-feature stickers --app-id <your-app-id>

Once enabled, the sticker button appears in the message composer.

Hide Stickers

let messageComposer = CometChatMessageComposer()
messageComposer.set(user: user)
messageComposer.hideStickersButton = true

Custom Sticker Packs

Sticker packs are managed through the CometChat Dashboard: 1. Go to CometChat Dashboard 2. Navigate to Extensions → Stickers 3. Add custom sticker packs

---

5. AI Features

CometChat provides AI-powered features for enhanced chat experiences.

Prerequisites — enable each AI feature via the CLI

iOS projects don't run cometchat apply (no .cometchat/state.json), so call the CLI in stateless mode with --app-id. AI features need an OpenAI key the first time:

cometchat apply-feature smart-replies --app-id <your-app-id> --openai-key sk-...
cometchat apply-feature conversation-summary --app-id <your-app-id>
cometchat apply-feature conversation-starter --app-id <your-app-id>

The OpenAI key is stored on the app once. Subsequent ai-feature applies don't need --openai-key repeated. Requires cometchat auth login once per machine.

Get an OpenAI key at https://platform.openai.com/api-keys. 4. Configure your AI provider (OpenAI, etc.)

AI Conversation Starter

Suggests conversation starters for new chats:

let conversationStarter = CometChatAIConversationStarter()

// Set AI message options
conversationStarter.set(aiMessageOptions: [
    "How can I help you today?",
    "What brings you here?",
    "Tell me about your project"
])

// Handle selection
conversationStarter.onMessageClicked { selectedReply in
    print("Selected: \(selectedReply)")
    // Send the selected message
}

// Show loading state
conversationStarter.showLoadingView()

// Hide loading state
conversationStarter.hideLoadingView()

// Show error state
conversationStarter.show(error: true)

AI Smart Replies

Suggests quick replies based on conversation context:

// Smart replies are automatically shown in the message composer
// when enabled in the dashboard

// To customize the smart replies view:
let messageComposer = CometChatMessageComposer()
messageComposer.set(user: user)

// Smart replies appear above the composer when available

AI Conversation Summary

Generates a summary of the conversation:

// Conversation summary is available through the AI extension
// Enable in CometChat Dashboard → AI → Conversation Summary

// The summary can be accessed through the message header menu
// or programmatically:

// Get conversation summary
CometChat.getConversationSummary(
    conversationWith: user.uid ?? "",
    conversationType: .user
) { summary in
    print("Summary: \(summary)")
} onError: { error in
    print("Error: \(error?.errorDescription ?? "")")
}

AI Assistant / Bot

Create AI-powered chat bots:

// AI Bots are configured in CometChat Dashboard
// They appear as regular users in the chat

// To start a conversation with an AI bot:
let botUID = "ai-assistant"  // Your bot's UID from dashboard

CometChat.getUser(UID: botUID) { bot in
    guard let bot = bot else { return }
    
    let messagesVC = MessagesVC()  // your own VC composing CometChatMessageHeader + List + Composer
    messagesVC.set(user: bot)
    // Present the messages view
} onError: { error in
    print("Error: \(error?.errorDescription ?? "")")
}

AI Assistant Bubble Style

CometChatAIAssistantBubble.style.backgroundColor = .secondarySystemBackground
CometChatAIAssistantBubble.style.textColor = .label
CometChatAIAssistantBubble.style.textFont = CometChatTypography.Body.regular
CometChatAIAssistantBubble.style.borderColor = .separator
CometChatAIAssistantBubble.style.borderWidth = 1
CometChatAIAssistantBubble.style.cornerRadius = CometChatCornerStyle(cornerRadius: 12)

---

6. Link Preview

Automatically generates previews for URLs shared in messages.

Enable/Disable Link Preview

Link preview is enabled by default.

// Link previews are handled automatically
// No additional configuration needed

Link Preview Style

// Customize link preview appearance
// Link previews use the standard message bubble styling

---

7. Message Translation

Translate messages to different languages.

Enable Translation

cometchat apply-feature message-translation --app-id <your-app-id>

Translate a Message

// Translation option appears in message menu when enabled
// Users can tap "Translate" to see the translated version

// Programmatic translation:
CometChat.translateMessage(
    message: textMessage,
    targetLanguage: "es"  // Spanish
) { translatedMessage in
    print("Translated: \(translatedMessage.text ?? "")")
} onError: { error in
    print("Error: \(error?.errorDescription ?? "")")
}

---

8. Collaborative Features

Collaborative Whiteboard

Real-time whiteboard for drawing and collaboration:

# Enable Collaborative Whiteboard via CLI:
cometchat apply-feature collaborative-whiteboard --app-id <your-app-id>
// Whiteboard option appears in attachment menu
// Opens a shared whiteboard session

Collaborative Document

Real-time document editing:

# Enable Collaborative Document via CLI:
cometchat apply-feature collaborative-document --app-id <your-app-id>
// Document option appears in attachment menu
// Opens a shared document session

---

9. Typing Indicators

Show when users are typing.

Enable/Disable Typing Indicators

let messageComposer = CometChatMessageComposer()
messageComposer.set(user: user)

// Disable sending typing events
messageComposer.disableTypingEvents = true

// Typing indicators in message list
let messageList = CometChatMessageList()
messageList.set(user: user)
// Typing indicators are shown automatically

Listen for Typing Events

class TypingListener: CometChatMessageDelegate {
    
    func onTypingStarted(_ typingIndicator: TypingIndicator) {
        print("\(typingIndicator.sender?.name ?? "") is typing...")
    }
    
    func onTypingEnded(_ typingIndicator: TypingIndicator) {
        print("\(typingIndicator.sender?.name ?? "") stopped typing")
    }
}

CometChat.addMessageListener("typing-listener", TypingListener())

---

10. Read Receipts

Show message delivery and read status.

Enable/Disable Read Receipts

let messageList = CometChatMessageList()
messageList.set(user: user)

// Hide read receipts
messageList.hideReceipts = true

// In conversations list
let conversations = CometChatConversations()
conversations.hideReceipts = true

Receipt Status

  • Sent — Message sent to server
  • Delivered — Message delivered to recipient's device
  • Read — Message read by recipient

---

11. Threaded Messages

Reply to specific messages in threads.

Enable/Disable Threads

let messageList = CometChatMessageList()
messageList.set(user: user)

// Hide thread reply option
messageList.hideReplyInThreadOption = true

Open Thread View

// Thread replies are handled automatically
// Tapping "Reply in thread" opens the thread view

// Programmatic thread access:
messageList.onThreadRepliesClick = { message, template in
    // Custom thread handling
    print("Thread for message: \(message.id)")
}

---

12. Voice Recording

Record and send voice messages.

Enable/Disable Voice Recording

let messageComposer = CometChatMessageComposer()
messageComposer.set(user: user)

// Hide voice recording button
messageComposer.hideVoiceRecording = true

Required Permission

Add to Info.plist:

<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for voice messages</string>

---

13. Live Reactions

Send animated reactions that appear on screen. Live reactions are enabled by default and handled automatically by the SDK.

Listen for Live Reactions

class LiveReactionListener: CometChatMessageEventListener {
    
    func ccLiveReaction(reaction: TransientMessage) {
        print("Live reaction received: \(reaction.data)")
        // Show animation on screen
    }
}

CometChatMessageEvents.addListener("live-reaction-listener", LiveReactionListener())

---

14. Profanity Filter / Data Masking

Filter inappropriate content and mask sensitive data.

Enable in Dashboard

1. Go to CometChat Dashboard 2. Navigate to Extensions → Profanity Filter 3. Configure blocked words and masking rules

How It Works

  • Messages containing blocked words are automatically filtered
  • Sensitive data (credit cards, SSN, etc.) can be masked
  • Works on both sent and received messages

---

15. Thumbnail Generation

Automatically generates thumbnails for images and videos.

How It Works

  • Thumbnails are generated automatically for media messages
  • Displayed in conversation list and message list
  • Full media loads on tap

---

Feature Availability Matrix

FeatureRequires SDKDashboard ConfigDefault
Voice/Video CallsCometChatCallsSDKNoEnabled*
ReactionsNoNoEnabled
PollsNoYesEnabled
StickersNoYesEnabled
AI FeaturesNoYesDisabled
Link PreviewNoYesEnabled
TranslationNoYesDisabled
WhiteboardNoYesDisabled
Collaborative DocNoYesDisabled
Typing IndicatorsNoNoEnabled
Read ReceiptsNoNoEnabled
Threaded MessagesNoNoEnabled
Voice RecordingNoNoEnabled
Live ReactionsNoNoEnabled
Profanity FilterNoYesDisabled

*Calls require CometChatCallsSDK to be installed

---

Best Practices

1. Enable only needed features — Disable unused features to reduce complexity 2. Configure in Dashboard first — Most features require Dashboard configuration 3. Test on real devices — Calls and voice recording require physical devices 4. Handle permissions gracefully — Request permissions before using camera/microphone 5. Monitor usage — AI features may have usage limits based on your plan

Related skills

Mobile Developmentfrontendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.