|
| 1 | +# CallKit 使用指南 |
| 2 | + |
| 3 | +`CallKit` 是一套基于环信 IM 和声网音视频结合开发的音视频 UI 库,实现了一对一语音和视频通话以及多人音视频通话的功能。通过同一用户 ID 登录多台设备的场景下,当用户处理一台设备上的来电响铃后,其他所有设备都会同时停止响铃。 |
| 4 | + |
| 5 | +## 技术原理 |
| 6 | + |
| 7 | +使用 `CallKit` 实现实时音视频通讯的基本流程如下: |
| 8 | + |
| 9 | +1. 调用 `init` 对 `CallKit` 进行初始化。 |
| 10 | +2. 主叫方调用 `startCall` 发起通话邀请,进行一对一或多人通话。 |
| 11 | +3. 被叫方收到 `onInvite` 后,选择接受或拒绝通话邀请。若接受邀请,则进入通话。 |
| 12 | +4. 通话结束时,SDK 触发 `onStateChange` 回调。 |
| 13 | + |
| 14 | +## 前提条件 |
| 15 | + |
| 16 | +集成该库之前,你需要满足以下条件: |
| 17 | + |
| 18 | +- 创建 [环信应用](/product/enable_and_configure_IM.html)及[声网应用](https://doc.shengwang.cn/doc/rtc/javascript/get-started/enable-service#创建声网项目); |
| 19 | +- 实现环信 IM 的基本功能,包括登录、好友、群组以及会话等的集成; |
| 20 | +- 上线前开通声网 Token 验证时,用户需要实现自己的 [App Server](https://github.com/easemob/easemob-im-app-server/tree/master/agora-app-server),用于生成 Token。详见[创建 Token 服务及使用 App Server 生成 Token](https://doc.shengwang.cn/doc/rtc/javascript/basic-features/token-authentication)。 |
| 21 | + |
| 22 | +## 项目设置 |
| 23 | + |
| 24 | +1. 在终端上运行以下命令安装 `CallKit`: |
| 25 | + |
| 26 | +``` |
| 27 | +npm install chat-callkit |
| 28 | +``` |
| 29 | + |
| 30 | +2. 导入 `CallKit`: |
| 31 | + |
| 32 | +``` |
| 33 | +import Callkit from 'chat-callkit'; |
| 34 | +``` |
| 35 | + |
| 36 | +## 实现音频和视频通话 |
| 37 | + |
| 38 | +本节介绍如何在你的项目中实现音频和视频通话。 |
| 39 | + |
| 40 | +### 初始化 `CallKit` |
| 41 | + |
| 42 | +调用 `init` 初始化 `CallKit`。 |
| 43 | + |
| 44 | +```javascript |
| 45 | +/** |
| 46 | + * 初始化 CallKit |
| 47 | + * |
| 48 | + * @param appId 声网 App ID。 |
| 49 | + * @param agoraUid 声网用户 ID(UID)。 |
| 50 | + * @param connection IM SDK 连接实例。 |
| 51 | + */ |
| 52 | +CallKit.init(appId, agoraUid, connection); |
| 53 | +``` |
| 54 | + |
| 55 | +### 发送通话邀请 |
| 56 | + |
| 57 | +主叫方调用 `startCall` 发送一对一或多人通话邀请。调用该方法时,需要指定通话类型。 |
| 58 | + |
| 59 | +- 一对一通话 |
| 60 | + |
| 61 | +一对一通话时,主叫方向被叫方发送短信作为通话邀请。 |
| 62 | + |
| 63 | +```javascript |
| 64 | +let options = { |
| 65 | + /** 通话类型: |
| 66 | + * 0:一对一音频通话 |
| 67 | + * 1:一对一视频通话 |
| 68 | + * 2:多人视频通话 |
| 69 | + * 3:多人音频通话 |
| 70 | + */ |
| 71 | + callType: 0, |
| 72 | + chatType: "singleChat", |
| 73 | + /** IM 用户 ID */ |
| 74 | + to: "userId", |
| 75 | + /** 通话邀请消息 */ |
| 76 | + message: "Join me on the call", |
| 77 | + /** 通话频道名称 */ |
| 78 | + channel: "channel", |
| 79 | + /** 声网 token <Vg k="VSDK" /> */ |
| 80 | + accessToken: "Agora token", |
| 81 | +}; |
| 82 | +CallKit.startCall(options); |
| 83 | +``` |
| 84 | + |
| 85 | +- 多人通话 |
| 86 | + |
| 87 | +在多人通话中,主叫方向群组或聊天室发送文本消息,同时向用户发送命令消息加入通话。 |
| 88 | + |
| 89 | +```javascript |
| 90 | +let options = { |
| 91 | + /** 通话类型: |
| 92 | + * 0:一对一音频通话 |
| 93 | + * 1:一对一视频通话 |
| 94 | + * 2:多人视频通话 |
| 95 | + * 3:多人音频通话 |
| 96 | + */ |
| 97 | + callType: 2, |
| 98 | + chatType: "groupChat", |
| 99 | + /** IM 用户 ID */ |
| 100 | + to: ["userId"], |
| 101 | + /** 通话邀请消息 */ |
| 102 | + message: "Join me on the call", |
| 103 | + /** 群组 ID */ |
| 104 | + groupId: "groupId", |
| 105 | + /** 群组名称 */ |
| 106 | + groupName: "group name", |
| 107 | + /** 声网 token <Vg k="VSDK" />*/ |
| 108 | + accessToken: "Agora token", |
| 109 | + /** 通话频道名称 */ |
| 110 | + channel: "channel", |
| 111 | +}; |
| 112 | +CallKit.startCall(options); |
| 113 | +``` |
| 114 | + |
| 115 | +下图为发送一对一视频通话邀请后的用户界面示例: |
| 116 | + |
| 117 | + |
| 118 | + |
| 119 | +### 收到通话邀请 |
| 120 | + |
| 121 | +通话邀请发送后,如果被叫方在线且可以通话,将通过 `onInvite` 回调收到邀请。你可以弹出一个用户界面,让被叫方在该回调中接受或拒绝邀请。 |
| 122 | + |
| 123 | +```javascript |
| 124 | +/** |
| 125 | + * 处理通话邀请。 |
| 126 | + * |
| 127 | + * @param result 是否弹出用户界面,接听来电: |
| 128 | + * - true:是。 |
| 129 | + * - false:否。这种情况下,你无需传入 token <Vg k="VSDK" />。 |
| 130 | + * @param accessToken 声网 token <Vg k="VSDK" />。 |
| 131 | + */ |
| 132 | +CallKit.answerCall(result, accessToken); |
| 133 | +``` |
| 134 | + |
| 135 | +下图为收到一对一视频通话邀请后的用户界面示例: |
| 136 | + |
| 137 | + |
| 138 | + |
| 139 | +### 多人通话中间发起邀请 |
| 140 | + |
| 141 | +在多人通话中,多个用户还可以向其他用户发送通话邀请。发送邀请后,SDK 会在发送方的客户端触发 `onAddPerson` 回调。在该回调中,你可以让发送方指定想要邀请加入多人通话的用户,然后调用 `startCall` 发出邀请。 |
| 142 | + |
| 143 | +### 监听回调事件 |
| 144 | + |
| 145 | +在通话中,你还可以监听以下回调事件: |
| 146 | + |
| 147 | +```javascript |
| 148 | +function Call() { |
| 149 | + // 处理会话状态变更。 |
| 150 | + const handleCallStateChange = (info) => { |
| 151 | + switch (info.type) { |
| 152 | + case "hangup": |
| 153 | + // 挂断电话。 |
| 154 | + break; |
| 155 | + case "accept": |
| 156 | + // 被叫方接受通话邀请。 |
| 157 | + break; |
| 158 | + case "refuse": |
| 159 | + // 被叫方拒绝通话邀请。 |
| 160 | + break; |
| 161 | + case "user-published": |
| 162 | + // 远端用户在通话中发布媒体流。 |
| 163 | + break; |
| 164 | + case "user-unpublished": |
| 165 | + // 远端用户在通话中停止发布媒体流。 |
| 166 | + break; |
| 167 | + case "user-left": |
| 168 | + // 远端用户离开通话。 |
| 169 | + break; |
| 170 | + default: |
| 171 | + break; |
| 172 | + } |
| 173 | + }; |
| 174 | + return <Callkit onStateChange={handleCallStateChange} />; |
| 175 | +} |
| 176 | +``` |
| 177 | + |
| 178 | +### 结束通话 |
| 179 | + |
| 180 | +一对一通话中,只要有一方挂断电话,通话即结束。多人通话中,只有本地用户挂断电话,通话才会结束。若本地用户挂断电话,SDK 会触发 `onStateChange` 回调,其中 `info.type` 中的值为 `hangup`。若远端用户挂断电话,SDK 触发 `onStateChange` 回调,其中 `info.type` 的值为 `user-left`。 |
| 181 | + |
| 182 | +## 后续步骤 |
| 183 | + |
| 184 | +本节介绍你在项目中实现音频和视频通话功能时采取的其他步骤。 |
| 185 | + |
| 186 | +### 使用 Video SDK Token 对用户进行身份验证 |
| 187 | + |
| 188 | +为了提升通讯安全性,声网建议你在加入通话前通过 Video SDK token 对应用用户进行身份验证。为此,你需要确保[项目的主要证书已启用](https://doc.shengwang.cn/doc/console/general/user-guides/manage_authentication#启用主要证书)。 |
| 189 | + |
| 190 | +Token 由声网提供的 token 生成器在应用服务器上生成。获取 token 后,需要在调用 `startCall` 和 `answerCall` 时将 token 传递给 callkit。关于在服务器上如何生成 Token 以及在客户端如何获取和更新 Token,详见[使用 Token 认证用户](https://doc.shengwang.cn/doc/rtc/javascript/basic-features/token-authentication)。 |
| 191 | + |
| 192 | +## 参考 |
| 193 | + |
| 194 | +本节提供了实现实时音频和视频通信功能时可以参考的其他信息。 |
| 195 | + |
| 196 | +### API 列表 |
| 197 | + |
| 198 | +`CallKit` 提供以下 API: |
| 199 | + |
| 200 | +- 方法如下表所示: |
| 201 | + |
| 202 | +| 方法 | 描述 | |
| 203 | +| ------------------------- | --------------------------------------------------------------------------------------------------------- | |
| 204 | +| `initWithConfig:delegate` | 初始化 `CallKit`。 | |
| 205 | +| `startCall` | 开始通话。 | |
| 206 | +| `answerCall` | 接听电话。 | |
| 207 | +| `setUserIdMap` | 设置环信 IM 用户 ID 与声网用户 ID(UID)的映射,格式为 `{[uid1]: 'custom name', [uid2]: 'custom name'}`。 | |
| 208 | + |
| 209 | +- 回调如下表所示: |
| 210 | + |
| 211 | +| 事件 | 描述 | |
| 212 | +| --------------- | ---------------------------------- | |
| 213 | +| `onAddPerson` | 当用户邀请其他用户加入通话时触发。 | |
| 214 | +| `onInvite` | 收到通话邀请时触发。 | |
| 215 | +| `onStateChange` | 当通话状态变更时发生。 | |
| 216 | + |
| 217 | +- 属性如下表所示: |
| 218 | + |
| 219 | +| 属性 | 描述 | |
| 220 | +| --------------- | ------------------------ | |
| 221 | +| `contactAvatar` | 一对一通话时显示的头像。 | |
| 222 | +| `groupAvatar` | 多人通话时显示的头像。 | |
| 223 | +| `ringingSource` | 铃声文件。 | |
0 commit comments