Skip to content

Latest commit

 

History

History
376 lines (313 loc) · 12.7 KB

互动课堂接入文档.md

File metadata and controls

376 lines (313 loc) · 12.7 KB

开发环境

  • Xcode 9.0+
  • OS X 10.10+的Mac真机
  • 项目已配置有效的开发者签名

文件说明

TIC 源码

文件名称 说明 位置
TICDef.h TIC 相关定义 TIC/macOS/SDK/TIC
TICDef.m TIC 相关定义 TIC/macOS/SDK/TIC
TICManager.h TIC 管理类 TIC/macOS/SDK/TIC
TICManager.m TIC 管理类 TIC/macOS/SDK/TIC
TICRenderView.h TIC 渲染视图 TIC/macOS/SDK/TIC
TICRenderView.m TIC 渲染视图 TIC/macOS/SDK/TIC
TICRecorder.h TIC 课后录制对时 TIC/iOS/SDK/TIC
TICRecorder.m TIC 课后录制对时 TIC/iOS/SDK/TIC

依赖 SDK

文件名称 说明 位置
TEduBoard_Mac.framework 白板 SDK 静态库 TIC/macOS/SDK/TEduBoard
ImSDKForMac.framework 云通信 SDK 动态库 TIC/macOS/SDK/TIM
TXLiteAVSDK_Mac.framework 音视频 SDK 静态库 TIC/macOS/SDK/TRTC

快速集成

您可以选择使用 CocoaPods 自动加载的方式,或者先下载 SDK 再将其导入到您当前的工程项目中。

Cocoapods 集成

1. 安装 CocoaPods

在终端窗口中输入如下命令(需要提前在 Mac 中安装 Ruby 环境):

sudo gem install cocoapods

2. 创建 Podfile 文件

进入项目所在路径,然后输入以下命令行,之后项目路径下会出现一个 Podfile 文件。

pod init

3. 编辑 Podfile 文件

编辑 Podfile 文件,按如下方式设置:

platform :macos, '10.10'

target 'TICDemo_Mac' do
  pod 'TEduBoard_Mac'
  pod 'TXIMSDK_Mac'
  pod 'TXLiteAVSDK_TRTC_Mac'
end

4. 更新并安装 SDK

在终端窗口中输入如下命令以更新本地库文件:

pod install

或使用以下命令更新本地库版本:

pod update

pod命令执行完后,双击打开 .xcworkspace 后缀的工程文件即可编译运行。

手动集成

项目配置

Xcode 开发环境下,按如下步骤进行工程配置以及导入依赖SDKTIC源码

  1. TIC/macOS/SDK/TIC目录下的TIC源码导入到工程;
  2. General子配置Linked Frameworks and Libraries中加入TEduBoard_Mac.frameworkTXLiteAVSDK_Mac.framework以及公共库libc++.tbdlibresolv.tbd
  3. General子配置Embedded Binaries中加入ImSDKForMac.framework
  4. Build Settings子配置Enable Bitcode设置为 NO;
  5. Build Settings子配置Other Linker Flags加入配置-ObjC

基本流程接口

初始化

  1. TIC 初始化主要是针对ImSDKForMac.framework的初始化,建议您在应用启动的时候调用。
  2. 用户被强制下线或userSig过期会收到相应回调,建议您在登录之前设置TICStatusListener监听。
//设置用户状态监听
[[TICManager sharedInstance] addStatusListener:self];
//初始化 TIC
[[TICManager sharedInstance] init:sdkAppid callback:^(TICModule module, int code, NSString *desc) {
if(code == 0){
//初始化成功
}
else{
//初始化失败
}
}];

- (void)onTICForceOffline 
{
//被踢下线
}
- (void)onTICUserSigExpired
{
//userSig 过期
}

其中 sdkAppid为需要您自己填写的参数,TICModule为当前操作模块,具体含义如下:

模块名 说明
TICMODULE_IMSDK 0 ImSDKForMac.framework模块
TICMODULE_TRTC 1 TXLiteAVSDK_Mac.framework模块
TICMODULE_BOARD 2 TEduBoard_Mac.framework模块

登录/登出

初始化后您可以使用登录接口登录,如果此时userId已经处于登录中,先登录的设备会被强制下线收到onTICForceOffline回调。

[[TICManager sharedInstance] login:userId userSig:userSig callback:^(TICModule module, int code, NSString *desc) {
if(code == 0){
//登录成功
}
else{
//登录失败
}
}];

其中 userIduserSig如何获取 UserSig?)为需要您自己填写的参数,登出对应接口如下:

[[TICManager sharedInstance] logout:^(TICModule module, int code, NSString *desc) {
if(code == 0){
//登出成功
}
else{
//登出失败
}
}];

创建/销毁课堂

登录成功后您可以创建课堂,如果课堂已存在,可直接加入课堂。

[[TICManager sharedInstance] createClassroom:classId callback:^(TICModule module, int code, NSString *desc) {
if(code == 0){
//创建课堂成功
}
else if(code == 10021){
//该课堂已被他人创建
}
else if(code == 10025){
//该课堂已创建
}
else{
//该课堂错误
}
}];

其中 classId为需要您自己填写的参数,如果课堂不再使用,可销毁课堂,课堂销毁后,课堂内的成员将会收到TICEventListener中的onTICClassroomDestroy回调。

[[TICManager sharedInstance] destroyClassroom:[classId intValue] callback:^(TICModule module, int code, NSString *desc) {
if(code == 0){
//课堂销毁成功
}
else if(code == 10004){
//课堂不存在
}
else if(code == 10007){
//非创建者没有权限销毁课堂
}
else{
//销毁课堂错误
}
}];

加入/退出课堂

如果课堂已经存在,您可以通过接口addMessageListener设置消息监听,addEventListener设置事件监听,然后加入课堂,已在课堂的其他成员会收到TICEventListener中的onTICMemberJoin回调。

//进房参数
TICClassroomOption *option = [[TICClassroomOption alloc] init];
option.classId = classId;
//消息监听
[[TICManager sharedInstance] addMessageListener:self];
//事件监听
[[TICManager sharedInstance] addEventListener:self];
[[TICManager sharedInstance] joinClassroom:option callback:^(TICModule module, int code, NSString *desc) {
if(code == 0){
//加入课堂成功
}
else if(code == 10015){
//课堂不存在
}
else{
//加入课堂失败
}
}];

其中 classId为需要您自己填写的参数,TICClassroomOption参数说明如下:

参数名 参数类型 参数说明
classId UInt32 课堂 ID
bFrontCamera BOOL 是否开启前置摄像头,默认 NO
bOpenCamera BOOL 是否开启摄像头,默认 NO
bOpenMic BOOL 是否开启麦克风,默认 NO
micId NSString 使用的麦克风设备 ID
cameraId NSString 使用的摄像头设备 ID
renderView NSView 视频渲染视图

退出课堂您需要先移除事件监听removeEventListener和消息监听removeMessageListener,再退出课堂,课堂内的其他成员将会收到TICEventListener中的onTICMemberQuit回调。

//移除事件监听
[[TICManager sharedInstance] removeEventListener:self];
//移除消息监听
[[TICManager sharedInstance] removeMessageListener:self];
//退出课堂,quitClassroom 可以选择是否清空白板数据
[[TICManager sharedInstance] quitClassroom:NO callback:^(TICModule module, int code, NSString *desc) {
if(code = 0){
//退出课堂成功
}
else{
//退出课堂失败
}
}];

!如果用户因为异常退出课堂(如强杀 App、异常 Crash),课堂内其他成员将不会收到onTICMemberQuit回调,由于该成员没有正常退出仍是课堂成员,再次加入课堂时,其他成员将不会收到onTICMemberJoin回调。

白板操作

TIC 只封装TEduBoard_Mac.framework的初始化方法,您可以通过TICManager获取白板控制器做更多TEduBoard_Mac.framework的操作。

//获取白板控制器
TEduBoardController *boardController = [[TICManager sharedInstance] getBoardController];
//获取白板 View
NSView *boardView = [boardController getBoardRenderView];
//设置白板位置,默认白板宽高比为16:9
boardView.frame = CGRectMake(0, 0, 320, 180);
//添加到父视图
[self.view addSubview:boardView];

更多TEduBoard_Mac.framework接口,请参考 互动白板接入文档

IM 收发消息

TIC 封装了ImSDKForMac.framework发消息的常用接口,每个发消息接口在TICMessageListener监听中都能找到对应的接收消息回调,具体对应关系如下:

发送消息接口 接收消息回调 参数说明
sendTextMessage onTICRecvTextMessage 发送和接收 C2C 文本消息
sendCustomMessage onTICRecvCustomMessage 发送和接收 C2C 自定义消息
sendGroupTextMessage onTICRecvGroupTextMessage 发送和接收群文本消息
sendGroupCustomMessage onTICRecvGroupCustomMessage 发送和接收群自定义消息
sendMessage onTICRecvMessage 透传房间内除白板外的其他消息
sendGroupMessage onTICRecvMessage 透传房间内除白板外的其他群消息

TRTC 视频渲染

如果房间内有成员打开或关闭摄像头,其他成员会收到TICEventListener监听中的onTICUserVideoAvailable回调,如果房间内有成员打开或关闭屏幕分享,其他成员会收到TICEventListener监听中的onTICUserSubStreamAvailable回调,您需要在回调中调用TRTC的相关方法开启或关闭渲染。

- (void)onTICUserVideoAvailable:(NSString *)userId available:(BOOL)available
{
if(available){
for (int i = 0; i < self.renderViews.count; ++i){
//self.renderViews是可用渲染 view 数组,具体可参考 demo
TICRenderView *view = self.renderViews[i];
if(view.userId.length == 0){
view.userId = userId;
view.streamType = TICStreamType_Main;
[[[TICManager sharedInstance] getTRTCCloud] startRemoteView:userId view:view];
[[[TICManager sharedInstance] getTRTCCloud] setRemoteViewFillMode:userId mode:TRTCVideoFillMode_Fit];
break;
}
}
}
else{
for (int i = 0; i < self.renderViews.count; ++i){
TICRenderView *view = self.renderViews[i];
if([view.userId isEqualToString:userId] && view.streamType == TICStreamType_Main){
view.userId = nil;
self.renderViews[i] = view;
break;
}
}
[[[TICManager sharedInstance] getTRTCCloud] stopRemoteView:userId];
}
}

- (void)onTICUserSubStreamAvailable:(NSString *)userId available:(BOOL)available
{
if(available){
//self.renderViews是可用渲染 view 数组,具体可参考 demo
for (TICRenderView *view in self.renderViews) {
if(view.userId.length == 0){
view.userId = userId;
view.streamType = TICStreamType_Sub;
[[[TICManager sharedInstance] getTRTCCloud] startRemoteSubStreamView:userId view:view];
break;
}
}
}
else{
for (TICRenderView *view in self.renderViews) {
if([view.userId isEqualToString:userId] && view.streamType == TICStreamType_Sub){
view.userId = nil;
break;
}
}
[[[TICManager sharedInstance] getTRTCCloud] stopRemoteSubStreamView:userId];
}
}

TIC 只封装TXLiteAVSDK_Mac.framework进房退房方法,您可以通过TICManager获取TRTC实例做更多TXLiteAVSDK_Mac.framework的操作。

//获取 TRTC 实例
TRTCCloud *trtc = [[TICManager sharedInstance] getTRTCCloud];
//获取摄像头设备 ID
NSArray<TRTCMediaDeviceInfo *> *cameras = [trtc getCameraDevicesList];
//设置使用的摄像头设备 ID
[trtc setCurrentCameraDevice:cameras[0].deviceId];
//开启本地渲染(renderView 为 NSView 实例)
[trtc startLocalPreview:renderView];
//关闭本地渲染
[trtc stopLocalPreview];
//获取麦克风设备 ID
NSArray<TRTCMediaDeviceInfo *> *mics = [trtc getMicDevicesList];
//设置使用的麦克风设备 ID
[trtc setCurrentMicDevice:mics[0].deviceId];
//开启音频
[trtc startLocalAudio];
//关闭音频
[trtc stopLocalAudio];

以上只列出了TRTC常用方法,更多TRTC相关内容,请参考 腾讯云 TRTC 文档

离线白板录制

文件名称 说明 位置
TICRecorder.h 录制功能定义 TIC/macOS/SDK/TIC
TICRecorder.m 录制功能实现 TIC/macOS/SDK/TIC
第三方库 说明 位置
ios-ntp 获取 ntp 时间 TIC/macOS/SDK/TIC/ios-ntp
CocoaAsyncSocket ios-ntp 依赖的 Socket 库 TIC/macOS/SDK/TIC/CocoaAsyncSocket

TIC 源码进房成功后自动发送离线录制需要的对时消息并上报群组 ID,对时消息发送成功您会收到TICEventListener的回调onTICSendOfflineRecordInfo

!

  1. deno 对时消息 ntp 时间戳是从腾讯云 ntp 服务获取,您可以选择搭建自己的 ntp 服务器。
  2. 由于 IM 群消息有可能大于10000,当 IM 群消息大于10000时,消息会开始丢弃,导致空洞消息。上报群组后,后台判断,当群组中 IM 消息大于10000时,会自动备份群消息到 COS。