跳到主要内容

iOS SDK (Swift)

基于 LiveKit 的 TgoRTC iOS (Swift) SDK,用于实时音视频通讯。

安装

Swift Package Manager

  1. 在 Xcode 中选择 File → Add Packages...
  2. 输入仓库地址:
https://github.com/TgoRTC/TgoRTCiOS
  1. 选择 Branch: main 或指定版本
  2. 勾选 TgoRTCSDK

依赖说明

SDK 自动包含 LiveKit 依赖。

快速开始

1. 初始化 SDK

import TgoRTCSDK

let options = Options()
options.isDebug = true
options.mirror = false

TgoRTC.shared.configure(options: options)

2. 创建房间信息并加入

import TgoRTCSDK

let roomInfo = RoomInfo(
roomName: "room-name",
token: "your-token",
url: "wss://your-server",
maxParticipants: 4,
rtcType: .video,
isP2P: true,
uidList: ["local-user-id", "remote-user-id"],
timeout: 30,
creatorUid: "creator-user-id",
loginUID: "local-user-id"
)

TgoRTC.shared.roomManager.join(
roomInfo: roomInfo,
micEnabled: true,
cameraEnabled: true,
screenShareEnabled: false
)

说明: 当前 Swift SDK 的 join(...) 是非阻塞方法。 调用后会立即返回,连接状态请通过 addConnectionStatusListener(...) 监听。

3. 监听连接状态

let connectionToken = TgoRTC.shared.roomManager.addConnectionStatusListener { roomName, status in
print("房间 \(roomName) 状态变化: \(status)")

switch status {
case .connecting:
print("正在连接...")
case .connected:
print("已连接到房间")
case .disconnected:
print("已断开连接")
}
}

// 停止监听
connectionToken.cancel()

说明: 当前 iOS SDK 的 ConnectStatus 只有 connecting / connected / disconnected 三个状态。

4. 获取参与者

let local = TgoRTC.shared.participantManager.getLocalParticipant()
let remotes = TgoRTC.shared.participantManager.getRemoteParticipants()
let all = TgoRTC.shared.participantManager.getAllParticipants()

let newParticipantToken = TgoRTC.shared.participantManager.addNewParticipantListener { participant in
print("新参与者加入: \(participant.uid)")
}

5. 媒体控制与事件

TgoParticipant 使用 Combine 的 @Published 属性和 PassthroughSubject 事件。

import Combine
import TgoRTCSDK

var cancellables = Set<AnyCancellable>()

let participant = TgoRTC.shared.participantManager.getLocalParticipant()

Task {
await participant?.setMicrophoneEnabled(true)
await participant?.setCameraEnabled(true)
await participant?.setScreenShareEnabled(true)
await participant?.setSpeakerphoneOn(true)
}

participant?.switchCamera()

participant?.$isMicrophoneOn
.sink { isOn in
print("麦克风状态: \(isOn)")
}
.store(in: &cancellables)

participant?.$isCameraOn
.sink { isOn in
print("摄像头状态: \(isOn)")
}
.store(in: &cancellables)

participant?.$isSpeaking
.sink { speaking in
print("正在说话: \(speaking)")
}
.store(in: &cancellables)

participant?.$audioLevel
.sink { level in
print("音量: \(level)")
}
.store(in: &cancellables)

participant?.$connectionQuality
.sink { quality in
print("连接质量: \(quality)")
}
.store(in: &cancellables)

participant?.$cameraPosition
.sink { position in
print("摄像头位置: \(position)")
}
.store(in: &cancellables)

participant?.$videoInfo
.sink { info in
print("视频信息: \(info.resolutionString), \(info.bitrateString)")
}
.store(in: &cancellables)

participant?.onJoined
.sink {
print("参与者已加入")
}
.store(in: &cancellables)

participant?.onLeave
.sink { reason in
print("参与者离开,原因: \(reason)")
}
.store(in: &cancellables)

participant?.onTrackPublished
.sink {
print("轨道已发布")
}
.store(in: &cancellables)

participant?.onTrackUnpublished
.sink {
print("轨道已取消发布")
}
.store(in: &cancellables)

6. 渲染视频轨道

SDK 提供了 TgoTrackRenderer(SwiftUI View)用于显示视频。

import SwiftUI
import TgoRTCSDK

struct VideoView: View {
@ObservedObject var participant: TgoParticipant

var body: some View {
TgoTrackRenderer(
participant: participant,
source: .camera,
fit: .fill
)
.frame(width: 200, height: 300)
}
}

7. 音频管理

Task {
await TgoRTC.shared.audioManager.toggleSpeakerphone()
await TgoRTC.shared.audioManager.setSpeakerphoneOn(true)
}

Task {
let devices = await TgoRTC.shared.audioManager.getAudioOutputDevices()
print(devices.map { "\($0.name)-\($0.type.rawValue)" })

if let speaker = devices.first(where: { $0.type == .speaker }) {
let success = await TgoRTC.shared.audioManager.selectAudioOutputDevice(speaker)
print("切换扬声器结果: \(success)")
}
}

let deviceToken = TgoRTC.shared.audioManager.addDeviceChangeListener { devices in
print("音频设备变化: \(devices)")
}

8. 离开房间

Task {
await TgoRTC.shared.roomManager.leaveRoom()
}

API 参考

TgoRTC

属性类型描述
sharedTgoRTC单例实例
optionsOptions?SDK 配置
roomManagerRoomManager房间管理
participantManagerParticipantManager参与者管理
audioManagerAudioManager音频管理

RoomManager

方法描述
join(roomInfo, micEnabled, cameraEnabled, screenShareEnabled)加入房间
leaveRoom()离开当前房间
addConnectionStatusListener(listener)添加连接状态监听器
addVideoInfoListener(listener)添加本地视频信息监听器
restartTimeoutCheckerIfNeeded()如有需要重启超时检查器
属性类型描述
currentRoomInfoRoomInfo?当前房间信息
roomRoom?LiveKit 房间实例

ParticipantManager

方法描述
getLocalParticipant()获取本地参与者
getRemoteParticipants()获取远程参与者
getAllParticipants()获取所有参与者
initializePendingParticipants()初始化待加入参与者
syncExistingRemoteParticipants()同步已在房间中的远程参与者
inviteParticipant(roomName, uids)邀请参与者
removePendingParticipants(roomName, uids)移除未加入参与者
setParticipantJoin(participant)标记参与者加入
setParticipantLeave(participant)标记参与者离开
addNewParticipantListener(listener)监听新参与者
clear()清空参与者状态

TgoParticipant

属性

属性类型描述
uidString参与者 ID
createdAtDate创建时间
isLocalBool是否为本地参与者
isDisposedBool是否已销毁

@Published 属性

属性类型描述
isMicrophoneOnBool麦克风是否开启
isCameraOnBool摄像头是否开启
isSpeakingBool是否正在说话
audioLevelFloat音量级别
connectionQualityTgoConnectionQuality连接质量
cameraPositionTgoCameraPosition摄像头位置
isJoinedBool是否已加入
videoInfoVideoInfo当前视频信息

事件

属性类型描述
onJoinedPassthroughSubject<Void, Never>加入事件
onLeavePassthroughSubject<TgoLeaveReason, Never>离开事件
onTrackPublishedPassthroughSubject<Void, Never>轨道发布事件
onTrackUnpublishedPassthroughSubject<Void, Never>轨道取消发布事件

方法

方法描述
getVideoTrack(source)获取指定源的视频轨道
setLocalParticipant(participant)绑定本地参与者
setRemoteParticipant(participant)绑定远程参与者
notifyLeave(reason)通知离开
setSpeakerphoneOn(enabled)设置扬声器
setMicrophoneEnabled(enabled)开启/关闭麦克风
setCameraEnabled(enabled)开启/关闭摄像头
setScreenShareEnabled(enabled)开启/关闭屏幕共享
switchCamera()切换前后摄像头
dispose()释放资源

AudioManager

方法 / 属性描述
isSpeakerOn当前是否使用扬声器
currentOutputDevice当前选中的输出设备
addDeviceChangeListener(listener)监听设备变化
setSpeakerphoneOn(on, forceSpeakerOutput)设置扬声器
toggleSpeakerphone()切换扬声器
getAudioInputDevices()获取音频输入设备
getAudioOutputDevices()获取音频输出设备
selectAudioOutputDevice(device)选择输出设备
dispose()清理资源

TgoTrackRenderer

TgoTrackRenderer(
participant: participant,
source: .camera,
fit: .fill
)

枚举类型

ConnectStatus

public enum ConnectStatus {
case connecting
case connected
case disconnected
}

RTCType

public enum RTCType {
case audio
case video
}

TgoCameraPosition

public enum TgoCameraPosition {
case front
case back
}

TgoConnectionQuality

public enum TgoConnectionQuality {
case unknown
case excellent
case good
case poor
case lost
}

TgoLeaveReason

public enum TgoLeaveReason {
case normal
case timeout
}

RoomInfo

public final class RoomInfo {
var roomName: String
var token: String
var url: String
var maxParticipants: Int
var rtcType: RTCType
var isP2P: Bool
var uidList: [String]
var timeout: Int
var creatorUid: String
var loginUID: String

func isCreator() -> Bool
func getP2PToUID() -> String
}

VideoInfo

public struct VideoInfo {
let width: Int
let height: Int
let bitrate: Int
let frameRate: Double
let layerId: String?
let qualityLimitationReason: String?

var isValid: Bool
var resolutionString: String
var bitrateString: String
}

平台配置

权限设置

Info.plist 中添加以下权限描述:

<key>NSCameraUsageDescription</key>
<string>需要访问摄像头进行视频通话</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风进行语音通话</string>

如果需要支持后台音频通话,请在 Signing & Capabilities 中开启 Background Modes,并勾选 Audio, AirPlay, and Picture in Picture