Use this guide to quickly start a basic voice call demo with the Agora Voice SDK for macOS.

Sample project

We provide an open-source Agora-macOS-Tutorial-Objective-C-1to1 or Agora-macOS-Tutorial-Swift-1to1 demo project that implements the basic one-to-one voice call on GitHub. You can try the demo and view the source code.


  • Xcode 9.0 or later
  • A macOS device running macOS 10.10 or later
  • A valid Agora account and an App ID
Open the specified ports in Firewall Requirements if your network has a firewall.

Set up the development environment

In this section, we will create a macOS project, and integrate the SDK into the project.

Create a macOS project

Now, let's build a macOS project from scratch. Skip to Integrate the SDK if a macOS project already exists.

Create a macOS project
  1. Open Xcode and click Create a new Xcode project.

  2. Choose Cocoa App as the template and click Next.

  3. Input the project information, such as the project name, team, organization name, and language, and click Next.

    If you haven't added any team information, you will see an Add account... button. Click it, input your Apple ID, and click Next to add your team.
  4. Choose the storage path of the project and click Create.

  5. Go to the TARGETS > Project Name > General > Signing menu, choose Automatically manage signing, and then click Enable Automatic on the pop-up window.

Integrate the SDK

Choose either of the following methods to integrate the Agora SDK into your project.

As of v3.0.1, the SDK only include the dynamic library AgoraRtcKit.framework. To upgrade your SDK to v3.0.1, refer to Migration Guide.

Method 1: Automatically integrate the SDK with CocoaPods

  1. Ensure that you have installed CocoaPods before the following steps. See the installation guide in Getting Started with CocoaPods.

  2. In Terminal, go to the project path and run the pod init command to create a Podfile in the project folder.

  3. Open the Podfile, delete all contents and input the following contents. Remember to change Your App to the target name of your project, and change version to the version of the SDK which you want to integrate.

    # platform :macOS, '10.11' use_frameworks!
    target 'Your App' do
      pod 'AgoraRtcEngine_macOS', '~> version'
  4. Go back to Terminal, and run the pod update command to update the local libraries.

  5. Run the pod install command to install the Agora SDK. Once you successfully install the SDK, it shows Pod installation complete! in Terminal, and you can see an xcworkspace file in the project folder.

  6. Open the generated xcworkspace file in Xcode.

Method 2: Manually add the SDK files

  1. Go to SDK Downloads, download the latest version of the Agora SDK for macOS, and unzip the downloaded SDK package.
  2. Copy the AgoraRtcEngineKit.framework file in the libs folder to the project folder.
  3. Open Xcode (take the Xcode 11.0 as an example), go to the TARGETS > Project Name > General > Frameworks, Libraries, and Embedded Content menu, click Add Other... after clicking + to add AgoraRtcKit.framework. Once added, the project automatically links to other system libraries. To ensure that the signature of the dynamic library is the same as the signature of the app, you need to set the Embed attribute of the dynamic library to Embed & Sign.
To integrate the SDK earlier than v3.0.0, click here to see the integration steps.
  1. Unzip the downloaded SDK package.

  2. Copy AgoraRtcEngineKit.framework to the project folder.

  3. Open Xcode (take the Xcode 11.0 as an example), go to the TARGETS > Project Name > Build Phases > Link Binary with Libraries menu, and click + to add the following frameworks and libraries. To add the AgoraRtcEngineKit.framework file, remember to click Add Other... after clicking +.

    • AgoraRtcKit.framework
    • Accelerate.framework
    • CoreWLAN.framework
    • libc++.tbd
    • libresolv.9.tbd
    • SystemConfiguration.framework
According to the requirement of Apple, the Extension of app cannot contain the dynamic library. If you need to integrate the SDK with the dynamic library in the Extension, change the file status as Do Not Embed.

Before integrating the dynamic library

After integrating the dynamic library

Add project permissions

  1. Add the following permissions in the info.plist file for device access according to your needs:
Key Type Value
Privacy - Microphone Usage Description String To access the microphone, such as for a call or live interactive streaming.



  1. If you enable the App Sandbox or Hardened Runtime settings in your project, check the following items to add the corresponding permissions:
Menu Category Item
App Sandbox Network Incoming Connections (Server)
Incoming Connections (Client)
Hardware Audio Input
Hardened Runtime Resource Access Audio Input
  • According to the requirements of Apple:
    • Mac software distributed in the Mac App Store must enable the App Sandbox setting. See details in Apple News and Updates.
    • Mac software distributed outside the Mac App Store must enable the Hardened Runtime setting. See details in Apple News and Updates.
  • The Hardened Runtime’s library validation prevents an app from loading frameworks, plug-ins, or libraries unless they’re either signed by Apple or signed with the same team ID as the app. When you face with problems, check Hardened Runtime -> Runtime Exceptions -> Disable Library Validation to disable the library validation.
  • Implement the basic call

    This section introduces how to use the Agora Voice SDK to make a voice call. The following figure shows the API call sequence of a basic one-to-one voice call.

    1. Create the UI

    Create the user interface (UI) for the one-to-one call in your project. Skip to Import the class if you already have a UI in your project.

    When you are implementing a voice call, we recommend adding the following elements into the UI:

    • The voice call window
    • The end-call button

    When you use the UI setting of the demo project, you can see the following interface:

    2. Import the class

    Import the AgoraRtcKit class in your project.

    // Objective-C
    // As of v3.0.0, the SDK uses the AgoraRtcKit object.
    #import <AgoraRtcKit/AgoraRtcEngineKit.h>
    // The SDK of a version earlier than v3.0.0 uses the AgoraRtcEngineKit object.
    #import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>
    // Swift
    // As of v3.0.0, the SDK uses the AgoraRtcKit object.
    import AgoraRtcKit
    // The SDK of a version earlier than v3.0.0 uses the AgoraRtcEngineKit object.
    import AgoraRtcEngineKit
    The Agora Native SDK uses libc++ (LLVM) by default. Contact Agora support If you want to use libstdc++ (GNU). The SDK provides FAT image libraries with multi-architecture support for both 32/64-bit audio emulators and 32/64-bit voice real devices.

    3. Initialize AgoraRtcEngineKit

    Create and initialize the AgoraRtcEngineKit object before calling any other Agora APIs.

    Call the sharedEngineWithAppId method and pass in the App ID to initialize the AgoraRtcEngineKit object.

    You can also listen for callback events, such as when the remote user joins or leaves the channel.

    // Objective-C
    - (void)initializeAgoraEngine {
        // Input your App ID to initialize the AgoraRtcEngineKit object.
        self.agoraKit = [AgoraRtcEngineKit sharedEngineWithAppId:appID delegate:self];
    // Swift
    func initializeAgoraEngine() {
       // Initialize the AgoraRtcEngineKit object.
       agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: AppID, delegate: self)

    4. Join a channel

    After initializing the AgoraRtcEngineKit object, you can call the joinChannelByToken method to join a channel. In this method, set the following parameters:

    • channelId: Specify the channel name that you want to join. Input your channelId before running the sample code.

    • token: Pass a token that identifies the role and privilege of the user. You can set it as one of the following values:

      • nil.
      • A temporary token generated in Console. A temporary token is valid for 24 hours. For details, see Get a Temporary Token.
      • A token generated at the server. This applies to scenarios with high-security requirements. For details, see Generate a token from Your Server.
      If your project has enabled the app certificate, ensure that you provide a token.
    • uid: ID of the local user that is an integer and should be unique. If you set uid as 0, the SDK assigns a user ID for the local user and returns it in the joinSuccessBlock callback.

    • joinSuccessBlock: Returns that the user joins the specified channel. It is same as didJoinChannel. We recommend setting joinSuccessBlock as nil, so that the SDK can trigger the didJoinChannel callback.

    For more details on the parameter settings, see joinChannelByToken.

    // Objective-C
    - (void)joinChannel {
        // Join a channel with a token.
        [self.agoraKit joinChannelByToken:token channelId:@"demoChannel1" info:nil uid:0 joinSuccess:^(NSString *channel, NSUInteger uid, NSInteger elapsed) {
    // Swift
    func joinChannel() {
        // Join a channel with a token.
        agoraKit.joinChannel(byToken: Token, channelId: "demoChannel1", info:nil, uid:0) { [unowned self] (channel, uid, elapsed) -> Void in}
        self.logVC?.log(type: .info, content: "did join channel")
        isStartCalling = true

    5. Leave the channel

    Call the leaveChannel method to leave the current call according to your scenario, for example, when the call ends, when you need to close the app, or when your app runs in the background.

    // Objective-C
    - (void)leaveChannel {
        // Leave the channel.
        [self.agoraKit leaveChannel:^(AgoraChannelStats *stat)
    // Swift
    func leaveChannel() {
    // Leave the channel.
     AgoraKit = nil

    Run the project

    Run the project on your macOS device. You can hear the remote user when you successfully start a one-to-one voice call in the app.


    When integrating the Agora Voice SDK, you can also refer to the following articles: