实现纯语音互动
本文介绍如何集成声网实时互动 SDK,通过少量代码从 0 开始实现一个简单的纯语音互动 App,适用于语音通话场景。
首先,你需要了解以下有关音视频实时互动的基础概念:
- 声网实时互动 SDK:由声网开发的、帮助开发者在 App 中实现实时音视频互动的 SDK。
- 频道:用于传输数据的通道,在同一个频道内的用户可以进行实时互动。
- 主播:可以在频道内发布音视频,同时也可以订阅其他主播发布的音视频。
- 观众:可以在频道内订阅音视频,不具备发布音视频权限。
更多概念详见关键概念。
下图展示在 App 中实现纯语音互动的基本工作流程:

- 所有用户调用
joinChannel
方法加入频道,并将所有用户角色都设置为主播。 - 加入频道后,所有用户都可以在频道内发布音频流,并订阅对方的音频流。
前提条件
在实现功能以前,请按照以下要求准备开发环境:
- Xcode 12.0 或以上版本。
- Apple 开发者账号。
- 如需使用 Cocoapods 集成 SDK,则确保已安装 Cocoapods,否则请参考 Getting Started with CocoaPods 进行安装。
- 两台 iOS 9.0 或以上版本的设备。
- 可以访问互联网的计算机。如果你的网络环境部署了防火墙,参考应对防火墙限制以正常使用声网服务。
- 一个有效的声网账号以及声网项目。请参考开通服务从声网控制台获得以下信息:
- App ID:声网随机生成的字符串,用于识别你的项目。
- 临时 Token:Token 也称为动态密钥,在客户端加入频道时对用户鉴权。临时 Token 的有效期为 24 小时。
创建项目
按照以下步骤,在 Xcode 中创建一个项目:
- 参考 Create a project 创建一个新的项目。Application 选择 App,Interface 选择 Storyboard,Language 选择 Swift。
如果你没有添加过开发团队信息,会看到 Add account… 按钮。点击该按钮并按照屏幕提示登入 Apple ID,点击 Next,完成后即可选择你的 Apple 账户作为开发团队。
-
为你的项目设置自动签名。
-
设置部署你的 App 的目标设备。
-
添加项目的设备权限。
在项目导航栏中打开
info.plist
文件,编辑属性列表,添加以下属性:key type value Privacy - Microphone Usage Description String 使用麦克风的目的,例如:for a call or live interactive streaming。 信息- 如果你的项目中需要添加第三方插件或库,且该插件或库的签名与项目的签名不一致,你还需勾选 Hardened Runtime > Runtime Exceptions 中的 Disable Library Validation。
- 更多注意事项,可以参考 Preparing Your App for Distribution。
集成 SDK
为了减小集成 SDK 后的 App 体积,声网推荐你集成音频 SDK 来实现纯语音互动。
根据实际情况,在以下集成方式中任选一种,在你的项目中集成 SDK。
- 通过 Cocoapods 集成
- 手动集成
- 通过 Swift Package Manager 集成
-
在终端里进入项目根目录,并运行
pod init
命令。项目文件夹下会生成一个Podfile
文本文件。 -
打开
Podfile
文件,修改文件为如下内容。注意将Your App
替换为你的 Target 名称。Shellplatform :ios, '9.0'
target 'Your App' do
# x.y.z 请填写具体的 SDK 版本号,如 4.0.1。
# 可通过发版说明获取最新版本号。
pod 'AgoraAudio_iOS', 'x.y.z'
end -
在终端内运行
pod install
命令安装声网 SDK。成功安装后,Terminal 中会显示Pod installation complete!
。 -
成功安装后,项目文件夹下会生成一个后缀为
.xcworkspace
的文件,通过 Xcode 打开该文件进行后续操作。
-
前往资源获取页面,获取最新版的 SDK,然后解压。
-
将 SDK 包内
libs
路径下的文件,拷贝到你的项目路径下。 -
打开 Xcode,添加对应动态库,确保添加的动态库 Embed 属性设置为 Embed & Sign。
信息声网 SDK 默认使用 libc++ (LLVM),如需使用 libstdc++ (GNU),请联系 sales@shengwang.cn。SDK 提供的库是 FAT Image,包含 32/64 位模拟器、32/64 位真机版本。
-
在 Xcode 中,进入 File > Swift Packages > Add Package Dependencies...,粘贴如下 URL:
HTTPhttps://github.com/AgoraIO/AgoraAudio_iOS.git
-
在 Choose Package Options 中指定你想集成的 SDK 版本。你也可以参考 Apple 官方文档进行设置。
创建用户界面
根据使用场景,为你的项目创建一个用户界面。用以下代码替换 ViewController.swift
文件中的内容:
import UIKit
import AgoraRtcKit
class ViewController: UIViewController{
// 定义 agoraKit
var agoraKit: AgoraRtcEngineKit!
}
实现流程
下图展示了使用声网实时互动 SDK 实现音视频互动的 API 调用时序。
下面列出了一段实现纯语音互动基本流程的完整代码以供参考。复制以下代码到 ViewController.swift
文件中替换原有内容即可。
在 appId
、token
和 channelName
字段中传入你在控制台获取到的 App ID、临时 Token,以及生成临时 Token 时填入的频道名。
// ViewController.swift
import UIKit
import AgoraRtcKit
class ViewController: UIViewController{
// 定义 agoraKit
var agoraKit: AgoraRtcEngineKit!
func initializeAgoraEngine(){
let config = AgoraRtcEngineConfig()
// 在这里输入你的 App ID
config.appId = <#Your App ID#>
// 调用 AgoraRtcEngineDelegate
agoraKit = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
}
func joinChannel(){
let option = AgoraRtcChannelMediaOptions()
// 将频道场景设置为 liveBroadcasting
option.channelProfile = .liveBroadcasting
// 设置用户角色为主播
option.clientRoleType = .broadcaster
// 使用临时 Token 加入频道,在这里传入你的项目的 Token 和频道名
agoraKit?.joinChannel(byToken: <#Your Token#>, channelId: <#Your Channel Name#>, uid: 0, mediaOptions: option)
}
override func viewDidLoad() {
super.viewDidLoad()
// 当加载视图后,你可以进行其他其他设置
// 当调用声网 API 时,以下函数会被调用
initializeAgoraEngine()
joinChannel()
}
func leaveChannel() {
agoraKit?.leaveChannel(nil)
}
}
extension ViewController: AgoraRtcEngineDelegate{
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinedOfUid uid: UInt, elapsed: Int){
}
}
导入声网组件
在 ViewController.swift
文件中引入 AgoraRtcKit
。
import AgoraRtcKit
初始化引擎
调用 sharedEngineWithConfig
方法,创建并初始化 AgoraRtcEngineKit
。
agoraKit = AgoraRtcEngineKit.sharedEngine(with: config, delegate: self)
加入频道并发布音频流
调用 joinChannelByToken
[2/4] 方法、填入你在控制台获取的临时 Token,以及获取 Token 时填入的频道名加入频道,并设置用户角色。
let option = AgoraRtcChannelMediaOptions()
option.channelProfile = .liveBroadcasting
// 设置用户角色为主播
option.clientRoleType = .broadcaster
// 使用临时 Token 加入频道,在这里传入你的项目的 Token 和频道名
agoraKit?.joinChannel(byToken: <#Your Token#>, channelId: <#Your Channel Name#>, uid: 0, mediaOptions: option)
}
启动和关闭 App
至此,你已经成功在你的 App 中添加了纯音频互动功能。当用户启动你的 App 时,互动开始;当用户关闭 App 时,互动结束。
-
当视图加载完成后,调用
viewDidLoad
加入频道。Swiftoverride func viewDidLoad() {
super.viewDidLoad()
// 当加载视图后,你可以进行其他其他设置
// 当调用声网 API 时,以下函数会被调用
initializeAgoraEngine()
joinChannel()
} -
调用
leaveChannel
方法离开频道,与会话相关的资源也会被释放。SwiftagoraKit?.leaveChannel(nil)
注意如果你想释放声网 SDK 使用的所有资源,需调用
destroy
清理你在initializeAgoraEngine
函数中创建的所有资源。
测试 App
参考以下步骤来测试你的 App:
- 将 iOS 设备连接至计算机。
- 点击 Build 来运行你的项目,需等待几秒至 App 安装完成。
- 允许 App 访问设备的麦克风权限。
- (可选)如果设备上弹出不受信任的开发者提示,则首先点击取消关闭该提示,然后在 iOS 设备上打开设置 > 通用 > VPN 与设备管理,在开发者 APP 中选择信任该开发者。
- 使用第二台 iOS 设备,重复以上步骤,在该设备上安装 App,并打开 App 加入频道,观察测试结果:双方可以听到对方的声音。
后续步骤
本文的示例使用了临时 Token 加入频道。在测试或生产环境中,为确保通信安全,声网推荐使用 Token 服务器来生成 Token,详见使用 Token 鉴权。
相关信息
示例项目
声网在 GitHub 上提供了一个开源的纯语音互动示例项目 JoinChannelAudio,你可以前往下载,或查看其中的源代码。