iOS SDK (Objective-C)
基于 LiveKit 的 TgoRTC iOS (Objective-C) SDK,用于实时音视频通讯。SDK 通过 Swift Bridge 提供 Objective-C 兼容的接口。
安装与配置
1. 添加 SPM 依赖
- 在 Xcode 中,选择 File → Add Packages...。
- 输入以下仓库地址:
https://github.com/TgoRTC/TgoRTCiOS - 在 Dependency Rule 中选择 Branch: main。
- 点击 Add Package,并勾选 TgoRTCSDK。
2. 创建 Swift 桥接文件 (可选)
由于 SDK 使用 Swift 编写,Objective-C 项目通常需要一个桥接头文件。
- 在项目中新建一个 Swift 文件(如
TgoBridge.swift)。 - 当 Xcode 询问是否创建 Bridging Header 时,点击 Create Bridging Header。
- 在需要使用 SDK 的 Objective-C 文件中导入生成的头文件:
#import "YourProjectName-Swift.h"
3. Build Settings 配置
确保以下设置已正确配置:
- Defines Module:
Yes - Swift Language Version:
Swift 5或更高
快速开始
1. 初始化 SDK
TgoOptionsObjC *options = [[TgoOptionsObjC alloc] init];
options.isDebug = YES;
options.mirror = NO;
[[TgoRTCBridge shared] configureWithO:options];
2. 创建房间信息并加入
TgoRoomInfoObjC *roomInfo = [[TgoRoomInfoObjC alloc] init];
roomInfo.roomName = @"room-name";
roomInfo.token = @"your-token";
roomInfo.url = @"wss://your-server";
roomInfo.loginUID = @"local-user-id";
roomInfo.rtcType = TgoRTCTypeObjCVideo;
// 加入房间
[[TgoRTCBridge shared].room joinWithRoomInfo:roomInfo
micEnabled:YES
cameraEnabled:YES
completion:^(BOOL success) {
if (success) {
NSLog(@"加入房间成功");
}
}];
3. 监听连接状态 (Delegate)
// 设置代理
[TgoRTCBridge shared].room.delegate = self;
// 实现代理方法
- (void)room:(NSString *)roomName didChangeStatus:(TgoConnectStatusObjC)status {
switch (status) {
case TgoConnectStatusObjCConnected:
NSLog(@"已连接到房间: %@", roomName);
break;
case TgoConnectStatusObjCDisconnected:
NSLog(@"连接已断开");
break;
case TgoConnectStatusObjCConnecting:
NSLog(@"正在连接...");
break;
}
}
4. 获取参与者
// 获取本地参与者
TgoParticipantBridge *local = [[TgoRTCBridge shared] getLocalParticipant];
// 获取所有远程参与者
NSArray<TgoParticipantBridge *> *remotes = [[TgoRTCBridge shared] getRemoteParticipantsWithIncludeTimeout:NO];
// 监听新参与者加入 (通过全局代理)
[TgoRTCBridge shared].participantDelegate = self;
- (void)participantDidJoin:(TgoParticipantBridge *)participant {
NSLog(@"新用户加入: %@", participant.uid);
}
5. 媒体控制与事件
TgoParticipantBridge *local = [[TgoRTCBridge shared] getLocalParticipant];
// ========== 媒体控制 (仅本地) ==========
// 开启/关闭麦克风
[local setMicrophoneEnabled:YES completion:nil];
// 开启/关闭摄像头
[local setCameraEnabled:YES completion:nil];
// 切换前后摄像头
[local switchCamera];
// ========== 状态监听 (Delegate) ==========
local.delegate = self;
- (void)participant:(TgoParticipantBridge *)participant didUpdateMicrophoneOn:(BOOL)isOn {
NSLog(@"用户 %@ 麦克风状态: %@", participant.uid, isOn ? @"开" : @"关");
}
- (void)participant:(TgoParticipantBridge *)participant didUpdateSpeaking:(BOOL)isSpeaking {
NSLog(@"用户 %@ 正在说话: %@", participant.uid, isSpeaking ? @"是" : @"否");
}
6. 渲染视频轨道 (UIKit)
在 Objective-C 中,推荐使用 TgoVideoView (基于 UIKit) 进行渲染。
// 1. 创建视频视图
self.videoView = [[TgoVideoView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
[self.view addSubview:self.videoView];
// 2. 将参与者视频附加到视图上
TgoParticipantBridge *participant = ...;
[participant attachCameraTo:self.videoView];
// 3. 配置视图
[self.videoView setLayoutMode:TgoVideoLayoutModeFill];
[self.videoView setMirrorMode:TgoVideoMirrorModeMirror]; // 本地视频建议镜像
7. 音频管理
// 切换扬声器/听筒
[[TgoRTCBridge shared].audio toggleSpeakerphoneWithCompletion:nil];
// 获取输出设备列表
[[TgoRTCBridge shared].audio getAudioOutputDevicesWithCompletion:^(NSArray<TgoAudioOutputDeviceObjC *> *devices) {
for (TgoAudioOutputDeviceObjC *device in devices) {
NSLog(@"发现音频设备: %@ (类型: %@)", device.name, device.typeString);
}
}];
8. 离开房间
[[TgoRTCBridge shared].room leaveRoomWithCompletion:^{
NSLog(@"已离开房间");
}];
API 参考
TgoRTCBridge (Objective-C 入口)
| 属性 | 类型 | 描述 |
|---|---|---|
shared | TgoRTCBridge | 单例实例 |
room | TgoRoomBridge | 房间管理 |
audio | TgoAudioBridge | 音频管理 |
participantDelegate | id<TgoParticipantDelegateObjC> | 全局参与者事件代理 |
TgoParticipantBridge
| 属性 | 类型 | 描述 |
|---|---|---|
uid | NSString * | 用户唯一 ID |
isMicrophoneOn | BOOL | 麦克风状态 |
isCameraOn | BOOL | 摄像头状态 |
isSpeaking | BOOL | 是否正在说话 |
isJoined | BOOL | 是否已加入 |
videoInfo | TgoVideoInfoObjC * | 视频流信息 (分辨率/码率) |
平台配置
权限设置 (Info.plist)
<key>NSCameraUsageDescription</key>
<string>需要访问摄像头进行视频通话</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风进行语音通话</string>