Quickstart

Updated

Rapidly develop and easily enhance your social, work, and educational apps with face-to-face interaction.

This page provides a step-by-step guide on how to create a basic Interactive Live Streaming app using the Agora Video SDK.

Understand the tech

To start a Interactive Live Streaming session, implement the following steps in your app:

  • Initialize the Agora Engine: Before calling other APIs, create and initialize an Agora Engine instance.

  • Join a channel: Call methods to create and join a channel.

    • Join as a host: A live streaming event has one or more hosts. A host publishes audio and video to the channel. Hosts can also subscribe to streams from other hosts.

    • Join as audience: Audience members can only subscribe to streams published by hosts.

  • Send and receive audio and video: Hosts publish streams to the channel. Audience members subscribe to audio and video streams published by hosts.

Prerequisites

  • Xcode 13.0 or higher.

  • An Apple developer account.

  • If you need to use CocoaPods integrated SDK, make sure CocoaPods is installed.

  • Two devices running iOS 14.0 or higher.

  • A camera and a microphone

  • A valid Agora account and project. Please refer to Agora account management for details.

Set up your project

This section shows you how to set up your iOS project and install the Agora Video SDK.

Create a new project Follow these steps to create a project in Xcode:

  1. Refer to Create a project. Under Application select App. Use Storyboard for the user interface and choose Swift as the programming language.

    If you have not added the development team information, you see the Add account... button. Click the button and follow the on-screen prompts to log in to your Apple ID. Once login is complete, click Next, and choose your Apple account as the development team.

  2. Set up automatic signing for your projects.

  3. Set the target devices where your app will be deployed.

  4. Create a user interface for your app. Refer to Create a user interface to create a bare bones UI.

Add to an existing project Follow these steps to add Interactive Live Streaming to your Xcode project:

  1. Open your project in Xcode.

  2. Set the target devices where your app will be deployed.

  3. Create a user interface for your app. Refer to Create a user interface to create a bare bones UI.

Install the SDK

Use one of the following methods to install Video SDK.

Swift Package Manager

  1. In Xcode, go to File > Add Package Dependencies.

  2. In the search bar, past the following URL:

    {`https://github.com/AgoraIO/AgoraRtcEngine_iOS.git`}
  3. Click Add Package, select the latest version, and click Next.

  4. For basic Interactive Live Streaming, select RtcBasic.

    If needed, also select:

    • SpatialAudio for spatial audio effects.
    • VirtualBackground for virtual background.
  5. Under Add to Target, select your project and click Add Package.

    For further information, refer to Apple's official documentation.

CocoaPods

  1. Go to the project root directory in the terminal and run the pod init command. A text file named Podfile is generated in the project folder.

  2. Open Podfile and modify the content as follows. Replace Your App with your target name.

    platform :ios, '9.0'
      target 'Your App' do
       # For x.y.z fill in the specific SDK version number, such as 4.4.0.
       # Integrate the Full SDK
       pod 'AgoraRtcEngine_iOS', 'x.y.z'
    
       # To integrate the Lite SDK, use the following line instead
       # pod 'AgoraLite_iOS', '4.4.0'
      end

    Obtain the latest version number from the release notes.

  3. Run the pod install command in the terminal to install the Video SDK. After successful installation, the terminal shows Pod installation complete!.

  4. After successful installation, a file with the suffix .xcworkspace is generated in the project folder. Open the file through Xcode for subsequent operations.

Manual integration

  1. Download the latest version of the SDK from SDKs download and extract the contents.

  2. Copy the files in the libs folder of the SDK package to your project directory.

  3. Open Xcode and add the corresponding dynamic library. Make sure the Embed property of the added dynamic library is set to Embed & Sign.

    Agora SDK uses libc++ (LLVM) by default. If you need to use libstdc++ (GNU), please contact support@agora.io. The library provided by the SDK is a FAT Image, which includes 32/64-bit simulator and 32/64-bit real machine versions.

The privacy updates for App Store submissions released by Apple, require developers to declare approved reasons for using a set of APIs in their app’s privacy manifest. Agora provides a PrivacyInfo.xcprivacy file that you can include in your project.

Implement Interactive Live Streaming

This section guides you through the implementation of basic real-time audio and video interaction in your app.

The following figure illustrates the essential steps:

This guide includes complete sample code that demonstrates implementing basic real-time interaction. To understand the core API calls in the sample code, review the following implementation steps.

Import Agora framework

Add the following import to your swift file:

import AgoraRtcKit

Initialize the engine

Call sharedEngine(withAppId:delegate:) to create and initialize an AgoraRtcEngineKit instance. Provide your App ID and an AgoraRtcEngineDelegate implementation to handle SDK events.

var agoraKit: AgoraRtcEngineKit!
let appId = "YOUR_AGORA_APP_ID"

// Initialize the Agora engine
func initializeAgoraVideoSDK() {
  agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: appId, delegate: self)
}

Join a channel

To join a channel, call joinChannel with the following parameters:

  • Channel name: The name of the channel to join. Clients that pass the same channel name join the same channel. If a channel with the specified name does not exist, it is created when the first user joins.

  • Authentication token: A dynamic key that authenticates a user when the client joins a channel. In a production environment, you obtain a token from a token server in your security infrastructure. For the purpose of this guide Generate a temporary token.

  • User ID: A 32-bit signed integer that identifies a user in the channel. You can specify a unique user ID for each user yourself. If you set the user ID to 0 when joining a channel, the SDK generates a random number for the user ID and returns the value in the didJoinChannel callback.

  • Channel media options: Configure AgoraRtcChannelMediaOptions to define publishing and subscription settings, optimize performance for your specific use-case, and set optional parameters.

For Interactive Live Streaming, set the channelProfile to .liveBroadcasting, the clientRoleType to .broadcaster (host) or .audience, and the audienceLatencyLevel to ultraLowLatency.

let channelName = "demo"  // Replace with your actual channel name
let token = "<Authentication token>" // Replace with your token

// Join the channel with specified options
func joinChannel() {
  let options = AgoraRtcChannelMediaOptions()
  // In a live streaming use-case, set the channel use-case to liveBroadcasting
  options.channelProfile = .liveBroadcasting
  // Set the user role as broadcaster (default is audience)
  options.clientRoleType = .broadcaster
  // Publish audio captured by microphone
  options.publishMicrophoneTrack = true
  // Publish video captured by camera
  options.publishCameraTrack = true
  // Auto subscribe to all audio streams
  options.autoSubscribeAudio = true
  // Auto subscribe to all video streams
  options.autoSubscribeVideo = true
  // Set the audience latency level
  options.audienceLatencyLevel = .ultraLowLatency
  // Use a temporary Token to join the channel
  agoraKit.joinChannel(
    byToken: token,
    channelId: channelName,
    uid: 0,
    mediaOptions: options
  )
}

You can also set the latency level after joining a channel by calling the setClientRole method with role set to AgoraClientRole.audience and options.audienceLatencyLevel set to ultraLowLatency.

// Set the user role to audience
let role = AgoraClientRole.audience
let options = AgoraClientRoleOptions()
// Set the ultra low latency level
options.audienceLatencyLevel = .ultraLowLatency

agoraKit.setClientRole(role, options: options)

Subscribe to Video SDK events

The Video SDK provides a delegate for handling channel events. To use it, conform to the AgoraRtcEngineDelegate protocol in your class and implement the event methods you want to handle. The following code implements the didJoinChannel, didOfflineOfUid, and didJoinedOfUid callbacks:

To ensure that you receive all Video SDK events, set the Agora Engine event handler before joining a channel.

// Extension for handling Agora SDK callbacks
extension ViewController: AgoraRtcEngineDelegate {

  // Triggered when the local user successfully joins a channel
  func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinChannel channel: String, withUid uid: UInt, elapsed: Int) {
    print("Successfully joined channel: \(channel) with UID: \(uid)")
  }

  // Triggered when a remote user joins the channel
  func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int) {
    setupRemoteVideo(uid: uid, view: remoteView)
  }
  // Triggered when a remote user leaves the channel
  func rtcEngine(_ engine: AgoraRtcEngineKit, didOfflineOfUid uid: UInt, reason: AgoraUserOfflineReason) {
    setupRemoteVideo(uid: uid, view: nil)
  }
}

To learn about the other SDK events, see AgoraRtcEngineDelegate.

Enable the video module

Follow the steps below to set up the video module.

  1. To enable the video module, call enableVideo.

  2. To enable local video preview, call startPreview.

    // Enable video functionality (audio is enabled by default)
    agoraKit.enableVideo()
    // Enable local video preview
    agoraKit.startPreview()

Display the local video

Call setupLocalVideo to initialize the local view and set the local video display properties.

// Configures and starts displaying the local video feed
func setupLocalVideo() {
  let videoCanvas = AgoraRtcVideoCanvas()
  videoCanvas.view = localView
  videoCanvas.uid = 0 // UID 0 is assigned to the local user
  videoCanvas.renderMode = .hidden
  agoraKit.setupLocalVideo(videoCanvas)
}

Display remote video

To initialize the remote user view, call setupRemoteVideo and set the local display properties for the remote user. Use the didJoinedOfUid callback to get the UID of the remote user.

func setupRemoteVideo(uid: UInt, view: UIView?) {
  let videoCanvas = AgoraRtcVideoCanvas()
  videoCanvas.uid = uid
  videoCanvas.view = view // Assign view for joining, set to nil for leaving
  videoCanvas.renderMode = .hidden
  agoraKit.setupRemoteVideo(videoCanvas)
}

Handle permissions

To access the camera and microphone on iOS devices, add the required permissions for real-time interaction. Open the info.plist file from the project navigation bar, edit the property list, to add the required permissions. These permissions are optional. However, if you do not add these permissions, you will not be able to use the corresponding devices.

KeyTypeValue
Privacy - Microphone Usage DescriptionStringFor the purpose of using the microphone. For example, for a call or live interactive streaming session.
Privacy - Camera Usage DescriptionStringFor the purpose of using the camera. For example, for a call or live interactive streaming session.
  • If your project depends on third-party plugins or libraries, such as a third-party camera library, and the signature of the plug-in or library is inconsistent with the signature of the project, check the Hardened Runtime settings. Specifically, review and potentially disable Runtime Exceptions and Library Validation in the project configuration.
  • For further information, refer to Preparing your app for distribution.

Start and close the app

When the user launches the app, it joins the channel and starts Interactive Live Streaming. When the user closes the app, it leaves the channel and ends Interactive Live Streaming.

  1. To start Interactive Live Streaming, call the following methods:

    // Initialize the Agora engine
    initializeAgoraVideoSDK()
    // Start the local video preview
    setupLocalVideo()
    // Join an Agora channel
    joinChannel()
  2. To leave the channel and release SDK resources when the app is closed, call the following methods:

    // Stop local video preview
    agoraKit.stopPreview()
    // Leave the channel and release session-related resources
    agoraKit.leaveChannel(nil)
    // Release all resources used by the Agora SDK
    AgoraRtcEngineKit.destroy()

After destroying the engine, you can no longer use SDK methods and callbacks. To use the real-time interaction functions again, create a new engine. See Initialize the engine for details.

Complete sample code

A complete code sample demonstrating the basic process of real-time interaction is provided for your reference. Copy the following code into your ViewController.swift file:

Create a user interface

To connect the sample code to your existing UI, ensure that your ViewController.swift file includes the UIViews used to Display the local video and Display remote video.

Alternatively, use the following sample code to generate a basic user interface. To use this interface, replace the contents of the ViewController.swift file with the following code:

Sample code to create the user interface

// ViewController.swift
import UIKit

class ViewController: UIViewController {

  // UI view for displaying the local video stream
  var localView: UIView!
  // UI view for displaying the remote video stream
  var remoteView: UIView!

  override func viewDidLoad() {
    super.viewDidLoad()

    // Set up the user interface
    setupUI()
  }

  // Sets up the UI layout for local and remote video views
  func setupUI() {
    // Create the local video view covering the full screen
    localView = UIView(frame: UIScreen.main.bounds)

    // Create the remote video view positioned in the top-right corner
    remoteView = UIView(frame: CGRect(x: self.view.bounds.width - 135, y: 50, width: 135, height: 240))

    // Add video views to the main view
    self.view.addSubview(localView)
    self.view.addSubview(remoteView)
  }
}

Test the sample code

Take the following steps to test the sample code:

  1. In your code update the appId and token, with the app ID and temporary token you obtained from Agora Console. Use the same channelName you filled in when generating the temporary token.

  2. Connect your iOS device to your computer.

  3. Click Build to run your project and wait a few seconds for the app installation to complete.

  4. Allow the app to access the device's microphone and camera.

  5. If an untrusted developer prompt pops up on the device, click Cancel to close the prompt, then open Settings > General > VPN and Device Management on the iOS device, and choose to trust the developer in the Developer APP.

  6. On a second iOS device, repeat the previous steps to install and launch the app. Alternatively, use the Web demo to join the same channel and test the following use-cases:

    • If users on both devices join the channel as hosts, they can see and hear each other.
    • If one user joins as host and the other as audience, the host can see themselves in the local video window; the audience can see the host in the remote video window and hear the host.

Reference

This section contains content that completes the information on this page, or points you to documentation that explains other aspects to this product.

  • If a firewall is deployed in your network environment, refer to Connect with Cloud Proxy to use Agora services normally.

Next steps

After implementing the quickstart sample, read the following documents to learn more:

  • To ensure communication security in a test or production environment, best practice is to obtain and use a token from an authentication server. For details, see Secure authentication with tokens.

Sample project

Agora provides an open source sample project on GitHub for your reference. Download it or view the source code for a more detailed example.

Add a privacy manifest file

The Agora Video SDK for iOS provides the PrivacyInfo.xcprivacy file that contains the required reasons for the APIs used by the SDK. To add the privacy manifest to your app in Xcode, follow these steps:

  1. Create a privacy manifest in your app project:

  2. Choose File > New File.

  3. Scroll down to the Resource section and select App Privacy File type.

  4. Click Next.

  5. Check your app in the Targets list.

  6. Click Create.

The default file name is PrivacyInfo.xcprivacy which is also the required file name for bundled privacy manifests.

  1. Add the items in PrivacyInfo.xcprivacy file of the Video SDK to PrivacyInfo.xcprivacy of the app using the following source code:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>NSPrivacyTracking</key>
      <false/>
      <key>NSPrivacyCollectedDataTypes</key>
      <array/>
      <key>NSPrivacyAccessedAPITypes</key>
      <array>
        <dict>
          <key>NSPrivacyAccessedAPIType</key>
          <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
          <key>NSPrivacyAccessedAPITypeReasons</key>
          <array>
            <string>35F9.1</string>
          </array>
        </dict>
        <dict>
          <key>NSPrivacyAccessedAPIType</key>
          <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
          <key>NSPrivacyAccessedAPITypeReasons</key>
          <array>
            <string>DDA9.1</string>
          </array>
        </dict>
        <dict>
          <key>NSPrivacyAccessedAPIType</key>
          <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
          <key>NSPrivacyAccessedAPITypeReasons</key>
          <array>
            <string>E174.1</string>
          </array>
        </dict>
      </array>
    </dict>
    </plist>

API reference

Frequently asked questions

See also