CallKit 使用指南

大约 5 分钟

CallKit 使用指南

CallKit 是一套基于环信 IM 和声网音视频结合开发的音视频 UI 库,实现了一对一语音和视频通话以及多人音视频通话的功能。通过同一用户 ID 登录多台设备的场景下,当用户处理一台设备上的来电响铃后,其他所有设备都会同时停止响铃。

技术原理

使用 CallKit 实现实时音视频通讯的基本流程如下:

  1. 调用 initCallKit 进行初始化。
  2. 主叫方调用 startCall 发起通话邀请,进行一对一或多人通话。
  3. 被叫方收到 onInvite 后,选择接受或拒绝通话邀请。若接受邀请,则进入通话。
  4. 通话结束时,SDK 触发 onStateChange 回调。

前提条件

集成该库之前,你需要满足以下条件:

项目设置

  1. 在终端上运行以下命令安装 CallKit
npm install chat-callkit
  1. 导入 CallKit
import Callkit from 'chat-callkit';

实现音频和视频通话

本节介绍如何在你的项目中实现音频和视频通话。

初始化 CallKit

调用 init 初始化 CallKit

/**
 * 初始化 CallKit
 *
 * @param appId       声网 App ID。
 * @param agoraUid    声网用户 ID(UID)。
 * @param connection  IM SDK 连接实例。 
 */
CallKit.init(appId, agoraUid, connection);

发送通话邀请

主叫方调用 startCall 发送一对一或多人通话邀请。调用该方法时,需要指定通话类型。

  • 一对一通话

一对一通话时,主叫方向被叫方发送短信作为通话邀请。

let options = {
  /** 通话类型:
   * 0:一对一音频通话
   * 1:一对一视频通话
   * 2:多人视频通话
   * 3:多人音频通话
   */
  callType: 0,
  chatType: "singleChat",
  /** IM 用户 ID */
  to: "userId",
  /** 通话邀请消息 */
  message: "Join me on the call",
  /** 通话频道名称 */
  channel: "channel",
  /** 声网 token <Vg k="VSDK" /> */
  accessToken: "Agora token",
};
CallKit.startCall(options);
  • 多人通话

在多人通话中,主叫方向群组或聊天室发送文本消息,同时向用户发送命令消息加入通话。

let options = {
  /** 通话类型:
   * 0:一对一音频通话
   * 1:一对一视频通话
   * 2:多人视频通话
   * 3:多人音频通话
   */
  callType: 2,
  chatType: "groupChat",
  /** IM 用户 ID */
  to: ["userId"],
  /** 通话邀请消息 */
  message: "Join me on the call",
  /** 群组 ID */
  groupId: "groupId",
  /** 群组名称 */
  groupName: "group name",
  /** 声网 token <Vg k="VSDK" />*/
  accessToken: "Agora token",
  /** 通话频道名称 */
  channel: "channel",
};
CallKit.startCall(options);

下图为发送一对一视频通话邀请后的用户界面示例:

img

收到通话邀请

通话邀请发送后,如果被叫方在线且可以通话,将通过 onInvite 回调收到邀请。你可以弹出一个用户界面,让被叫方在该回调中接受或拒绝邀请。

/**
 * 处理通话邀请。
 *
 * @param result 是否弹出用户界面,接听来电:
 *               - true:是。
 *               - false:否。这种情况下,你无需传入 token <Vg k="VSDK" />。
 * @param accessToken 声网 token <Vg k="VSDK" />。
 */
CallKit.answerCall(result, accessToken);

下图为收到一对一视频通话邀请后的用户界面示例:

img

多人通话中间发起邀请

在多人通话中,多个用户还可以向其他用户发送通话邀请。发送邀请后,SDK 会在发送方的客户端触发 onAddPerson 回调。在该回调中,你可以让发送方指定想要邀请加入多人通话的用户,然后调用 startCall 发出邀请。

监听回调事件

在通话中,你还可以监听以下回调事件:

function Call() {
  // 处理会话状态变更。
  const handleCallStateChange = (info) => {
    switch (info.type) {
      case "hangup":
        // 挂断电话。
        break;
      case "accept":
        // 被叫方接受通话邀请。
        break;
      case "refuse":
        // 被叫方拒绝通话邀请。
        break;
      case "user-published":
        // 远端用户在通话中发布媒体流。
        break;
      case "user-unpublished":
        // 远端用户在通话中停止发布媒体流。
        break;
      case "user-left":
        // 远端用户离开通话。
        break;
      default:
        break;
    }
  };
  return <Callkit onStateChange={handleCallStateChange} />;
}

结束通话

一对一通话中,只要有一方挂断电话,通话即结束。多人通话中,只有本地用户挂断电话,通话才会结束。若本地用户挂断电话,SDK 会触发 onStateChange 回调,其中 info.type 中的值为 hangup。若远端用户挂断电话,SDK 触发 onStateChange 回调,其中 info.type 的值为 user-left

后续步骤

本节介绍你在项目中实现音频和视频通话功能时采取的其他步骤。

使用 Video SDK Token 对用户进行身份验证

为了提升通讯安全性,声网建议你在加入通话前通过 Video SDK token 对应用用户进行身份验证。为此,你需要确保项目的主要证书已启用open in new window

Token 由声网提供的 token 生成器在应用服务器上生成。获取 token 后,需要在调用 startCallanswerCall 时将 token 传递给 callkit。关于在服务器上如何生成 Token 以及在客户端如何获取和更新 Token,详见使用 Token 认证用户open in new window

参考

本节提供了实现实时音频和视频通信功能时可以参考的其他信息。

API 列表

CallKit 提供以下 API:

  • 方法如下表所示:
方法描述
initWithConfig:delegate初始化 CallKit
startCall开始通话。
answerCall接听电话。
setUserIdMap设置环信 IM 用户 ID 与声网用户 ID(UID)的映射,格式为 {[uid1]: 'custom name', [uid2]: 'custom name'}
  • 回调如下表所示:
事件描述
onAddPerson当用户邀请其他用户加入通话时触发。
onInvite收到通话邀请时触发。
onStateChange当通话状态变更时发生。
  • 属性如下表所示:
属性描述
contactAvatar一对一通话时显示的头像。
groupAvatar多人通话时显示的头像。
ringingSource铃声文件。