iOS
UIKit Getting Started

UIKit for iOS

Sendbird UIKit for iOS is a development kit with an user interface that enables an easy and fast integration of standard chat features into new or existing client apps. From the overall theme to individual styles such as colors and fonts, components can be fully customized to create an in-app chat experience unique to your brand identity.

Note: Currently, UIKit for iOS supports group channels only.

ThemeLight


Benefits

  • Easy installation
  • Full-featured chat with a minimal amount of code
  • Customize components, events, and views
  • Customizable user list to enable chat among specified users

Requirements

The minimum requirements for UIKit for iOS are:

  • iOS 10.3+
  • Swift 4.2+ / Objective-C
  • Sendbird Chat SDK for iOS 3.0.198+

Try the sample app

Our sample app has all the core features of Sendbird UIKit for iOS. Download the app from our GitHub repository to get an idea of what you can build with the actual UIKit before building your own project.

Download Sample App


Create a project

You can get started by creating a project. Sendbird UIKit supports both objective-c and swift, so you can create and work on a project in the language you want to develop with. Create a project


Install UIKit for iOS

UIKit for iOS can be installed through either CocoaPods or Carthage:

CocoaPods

  1. Add SendBirdUIKit into your Podfile in Xcode as below:
Light Color Skin
Copy
platform :ios, '10.3' 
use_frameworks! 

target YOUR_PROJECT_TARGET do
    pod 'SendBirdUIKit'
end
  1. Install the SendBirdUIKit framework through CocoaPods.
Light Color Skin
Copy
$ pod install
  1. Update the SendBirdUIKit framework through CocoaPods.
Light Color Skin
Copy
$ pod update 

Note: Sendbird UIKit for iOS is Sendbird Chat SDK-dependent. If you install the UIKit, CocoaPods will automatically install the Chat SDK for iOS as well. The minimum requirement of the Chat SDK for iOS is 3.0.198 or later.

Carthage

  1. Add SendBirdUIKit and SendBirdSDK into your Cartfile as below:

Note: Sendbird UIKit for iOS is Sendbird Chat SDK-dependent. The minimum required version of the Chat SDK for iOS is 3.0.198 or later.

Light Color Skin
Copy
github "sendbird/sendbird-uikit-ios"
github "sendbird/sendbird-ios-framework" == 3.0.198
  1. Install the SendBirdUIKit framework through Carthage.
Light Color Skin
Copy
$ cartage update
  1. Go to your Xcode project target’s General settings tab in the Frameworks and Libraries section. Then drag and drop on the disk each framework from the <YOUR_XCODE_PROJECT_DIRECTORY>/Carthage/Build/iOS folder.
  2. Go to your Xcode project target’s Build Phases settings tab, click the + icon, and choose New Run Script Phase. Create a Run Script, specify your shell (ex: /bin/sh), and add /usr/local/bin/carthage copy-frameworks to the script below the shell.
  3. Add the following paths to the SendBirdUIKit and SendBirdSDK frameworks under Input Files.
Light Color Skin
Copy
$(SRCROOT)/Carthage/Build/iOS/SendBirdUIKit.framework
$(SRCROOT)/Carthage/Build/iOS/SendBirdSDK.framework

Note: Building or creating the SendbirdUIKit framework with Carthage can only be done using the latest Swift. If your Swift is not the most recent version, the framework should be copied into your project manually.

Handling errors caused by unknown attributes

If you are building your project with Xcode 11.3 or earlier versions, the following 2 errors may occur.

Light Color Skin
Copy
- Unknown attribute ‘_inheritsConvenienceInitializers’
- Unknown attribute ‘_hasMissingDesignatedInitializers’

This is because of the 2 new annotation processing methods rolled out in Swift 5.2, which is used in Xcode 11.5. As they don’t apply to Xcode 11.3 and earlier versions that use Swift 5.1, such errors will occur in the swiftinterface that is automatically generated in UIKit.

When those errors happen, refer to the following steps to remove the new annotations that cause trouble in the swiftinterface. Once they are removed, UIKit will work properly.

  1. Open the Edit scheme menu of the project target. EditScheme
  2. Go to Build > Pre-actions and select the New Run Script Action option at the bottom. NewRunScriptAction
  3. Add the script below to the editor and select the target to apply the script to. ApplyScript
Light Color Skin
Copy
# CocoaPods
if [ -d "${PROJECT_DIR}/Pods/SendBirdUIKit" ]; then
    find ${PROJECT_DIR}/Pods/SendBirdUIKit/SendBirdUIKit.framework/Modules/SendBirdUIKit.swiftmodule/ -type f -name '*.swiftinterface' -exec sed -i '' s/'@_inheritsConvenienceInitializers '// {} +
    find ${PROJECT_DIR}/Pods/SendBirdUIKit/SendBirdUIKit.framework/Modules/SendBirdUIKit.swiftmodule/ -type f -name '*.swiftinterface' -exec sed -i '' s/'@_hasMissingDesignatedInitializers '// {} +
fi

# Carthage
if [ -d "${PROJECT_DIR}/Carthage/Build/iOS/SendBirdUIKit.framework" ]; then
    find ${PROJECT_DIR}/Carthage/Build/iOS/SendBirdUIKit.framework/Modules/SendBirdUIKit.swiftmodule/ -type f -name '*.swiftinterface' -exec sed -i '' s/'@_inheritsConvenienceInitializers '// {} +
    find ${PROJECT_DIR}/Carthage/Build/iOS/SendBirdUIKit.framework/Modules/SendBirdUIKit.swiftmodule/ -type f -name '*.swiftinterface' -exec sed -i '' s/'@_hasMissingDesignatedInitializers '// {} +
fi
  1. Once removed, you can continue building your project.

Get attachment permission

Sendbird UIKit offers features to attach or save files such as photos, videos, and documents. To use those features, you need to request permission from end users.

Media attachment permission

Applications must acquire permission to use end users’ photo assets or to save assets into their library. Once the permission is granted, users can send image or video messages and save media assets.

Light Color Skin
Copy
...
<key>NSPhotoLibraryUsageDescription</key>
    <string>$(PRODUCT_NAME) would like access to your photo library</string>
<key>NSCameraUsageDescription</key>
    <string>$(PRODUCT_NAME) would like to use your camera</string>
<key>NSMicrophoneUsageDescription</key>
    <string>$(PRODUCT_NAME) would like to use your microphone (for videos)</string>
<key>NSPhotoLibraryAddUsageDescription</key>
    <string>$(PRODUCT_NAME) would like to save photos to your photo library</string>
...

Media attachment permission

(Optional) Document attachment permission

If you want to attach files from iCloud, you must activate the iCloud feature. Once it is activated, users can also send a message with files from iCloud.

Go to your Xcode project's Signing & Capabilities tab. Then, click + Capability button and select iCloud. Check iCloud Documents. Document attachment permission


Implementation guide

Initialize with APP_ID

In order to use the Chat SDK's features, you must initialize the SendBirdUIKit instance with APP_ID. This step also initializes the Chat SDK for iOS.

Initialize the SendBirdUIKit instance through AppDelegate as below:

Objective-C
Swift
Light Color Skin
Copy
// AppDelegate.m

@import SendBirdUIKit;
...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    
    NSString *APP_ID = @"2D7B4CDB-932F-4082-9B09-A1153792DC8D"; // The ID of the Sendbird application which UIKit sample app uses..
    [SBUMain initializeWithApplicationId:APP_ID];
    ...

}
Light Color Skin
Copy
// AppDelegate.swift

import SendBirdUIKit
...

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    ...
    
    let APP_ID = "2D7B4CDB-932F-4082-9B09-A1153792DC8D" // The ID of the Sendbird application which UIKit sample app uses.
    SBUMain.initialize(applicationId: APP_ID)
    ...

}

Note : In the above, you should specify the ID of your Sendbird application in place of the APP_ID.

Set the current user

User information must be set as CurrentUser in the SBUGlobal prior to launching Sendbird UIKit. This information will be used within the kit for various tasks. The userId field must be specified whereas other fields such as nickname and profileUrl are optional and filled with default values if not specified.

Set the CurrentUser for UIKit through the AppDeleagte as below:

Note: Even if you don’t use the AppDelegate, you should register user information before launching a chat service.

Objective-C
Swift
Light Color Skin
Copy
// AppDelegate.m

@import SendBirdUIKit;
...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    
    // Case 1: USER_ID only
    [SBUGlobals setCurrentUser:[[SBUUser alloc] initWithUserId:{USER_ID} nickname:nil profileUrl:nil]];
    
    // Case 2: Specify all fields
    [SBUGlobals setCurrentUser:[[SBUUser alloc] initWithUserId:{USER_ID} nickname:{(opt)NICKNAME} profileUrl:{(opt)PROFILE_URL}]];
    ...
}
Light Color Skin
Copy
// AppDelegate.swift

import SendBirdUIKit
...

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    ...

    // Case 1: USER_ID only
    SBUGlobals.CurrentUser = SBUUser(userId: {USER_ID})

    // Case 2: Specify all fields
    SBUGlobals.CurrentUser = SBUUser(userId: {USER_ID}, nickname:{(opt)NICKNAME} profileUrl:{(opt)PROFILE_URL})
    ...
}

Note : If the CurrentUser is not set in advance, there will be restrictions to your usage of UIKit.

Channel list

UIKit allows you to create a channel specifically for 1-on-1 chat and to list 1-on-1 chat channels so that you can easily view and manage them. With the SBUChannelListViewController class, you can provide end users a complete chat service featuring a channel list.

Use the following code for the SceneDelegate and AppDelegate.

Objective-C
Swift
Light Color Skin
Copy
// SceneDelegate.m

@import SendBirdUIKit;
...

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    ...

    SBUChannelListViewController *channelListVC = [[SBUChannelListViewController alloc] init];
    UINavigationController *naviVC = [[UINavigationController alloc] initWithRootViewController:channelListVC];
    self.window.rootViewController = naviVC;
}
Light Color Skin
Copy
// SceneDelegate.swift

import SendBirdUIKit
...

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    ...

    let channelListVC = SBUChannelListViewController()
    let naviVC = UINavigationController(rootViewController: channelListVC)
    self.window?.rootViewController = naviVC
}
Objective-C
Swift
Light Color Skin
Copy
// AppDelegate.m

@import SendBirdUIKit;
...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...

    SBUChannelListViewController *channelListVC = [[SBUChannelListViewController alloc] init];
    UINavigationController *naviVC = [[UINavigationController alloc] initWithRootViewController:channelListVC];
    self.window.rootViewController = naviVC;
}
Light Color Skin
Copy
// AppDelegate.swift

import SendBirdUIKit
...

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    ...
    
    let channelListVC = SBUChannelListViewController()
    let naviVC = UINavigationController(rootViewController: channelListVC)
    self.window?.rootViewController = naviVC
}

Note: At this point, you can confirm if the service is working by running your client app.

Channel

With the SBUChannelViewController class, you can build a channel-based chat service instead of a channel list-based one.

Note: You should have either a SBDChannel object or a ChannelUrl in order to run a channel-based chat service.

Use the following code to implement the chat service.

Objective-C
Swift
Light Color Skin
Copy
@import SendBirdUIKit;
...

SBUChannelViewController *channelVC = [[SBUChannelViewController alloc] initWithChannelUrl:{CHANNEL_URL}];
UINavigationController *naviVC = [[UINavigationController alloc] initWithRootViewController:channelVC];
[self presentViewController:naviVC animated:YES completion:nil];
Light Color Skin
Copy
import SendBirdUIKit
...

let vc = SBUChannelViewController(channelUrl: {CHANNEL_URL})
let naviVC = UINavigationController(rootViewController: vc)
present(naviVC, animated: true)

For Objective-C

UIKit is a Swift-based framework. However, If your project is in Objective-C, configuring just a few additional steps allows you to run the kit in your client app. Go to your Xcode project target's Build settings tab and then set the ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES to YES.


Distribution setting

UIKit is distributed in the form of a fat binary, which contains information on both Simulator and Device architectures. Add the script below if you are planning to distribute your application in the App Store and wish to remove unnecessary architectures in the application's build phase.

Go to your Xcode project target's Build Phases tab. Then, click + and select New Run Script Phase. Append this script.

Light Color Skin
Copy
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
    FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
    FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
    echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

    EXTRACTED_ARCHS=()

    for ARCH in $ARCHS
    do
        echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
        lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
        EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
    done

    echo "Merging extracted architectures: ${ARCHS}"
    lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
    rm "${EXTRACTED_ARCHS[@]}"

    echo "Replacing original executable with thinned version"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done

UIKit at a glance

UIKit for iOS manages the lifecycle of its ViewController along with various views and data from the Chat SDK for iOS. UIKit Components are as follows:

ComponentDescription

SBUChannelListViewController

A ViewController that manages a channel list.

SBUChannelViewController

A ViewController that manages a 1-on-1 chat channel.

SBUChannelSettingViewController

A ViewController that manages the channel settings.

SBUCreateChannelViewController

A ViewController that creates a channel.

SBUInviteUserViewController

A ViewController that invites a user to a channel.

SBUMemberListViewController

A ViewController that shows a list of members in a channel.

SBUTheme

A singleton that manages themes.

SBUColorSet

A singleton that manages color sets.

SBUFontSet

A singleton that manages font sets.

SBUMain

A class that contains static functions required when using Sendbird UIKit.

SBUGlobalSet

A class that contains static attributes required when using Sendbird UIKit.