Skip to content

Latest commit

 

History

History
370 lines (305 loc) · 12.7 KB

互动课堂接入文档.md

File metadata and controls

370 lines (305 loc) · 12.7 KB

开发环境

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

文件说明

TIC 源码

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

依赖 SDK

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

快速集成

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

Cocoapods 集成

1. 安装 CocoaPods

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

sudo gem install cocoapods

2. 创建 Podfile 文件

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

pod init

3. 编辑 Podfile 文件

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

platform :ios, '8.0'

target 'TICDemo' do
  pod 'TEduBoard_iOS'
  pod 'TXIMSDK_iOS'
  pod 'TXLiteAVSDK_TRTC'
end

4. 更新并安装 SDK

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

pod install

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

pod update

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

手动集成

项目配置

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

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

基本流程接口

初始化

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

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

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

模块名 说明
TICMODULE_IMSDK 0 ImSDK.framework模块
TICMODULE_TRTC 1 TXLiteAVSDK_TRTC.framework模块
TICMODULE_BOARD 2 TEduBoard.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
renderView UIView 视频渲染视图

退出课堂您需要先移除事件监听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.framework的初始化方法,您可以通过TICManager获取白板控制器做更多TEduBoard.framework的操作。

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

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

IM 收发消息

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

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

TRTC 视频渲染

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

- (void)onTICUserVideoAvailable:(NSString *)userId available:(BOOL)available
{
if(available){
//创建渲染视图(您可以保存此视图,方便查找删除)
TICRenderView *render = [[TICRenderView alloc] init];
render.userId = userId;
render.streamType = TICStreamType_Main;
//设置渲染位置(多人视频时,您需要计算好显示位置,避免视图遮挡)
render.frame = CGRectMake(0, 0, 100, 200);
//添加到父视图
[self.view addSubview:render];
//开始渲染画面
[[[TICManager sharedInstance] getTRTCCloud] startRemoteView:userId view:render];
}
else{
//查找当前 userId 对应的渲染视图(getRenderView 是业务方法,可参考 demo 中的实现)
TICRenderView *render = [self getRenderView:userId streamType:TICStreamType_Main];
//从父视图中移除
[render removeFromSuperview];
//停止渲染画面
[[[TICManager sharedInstance] getTRTCCloud] stopRemoteView:userId];
}
}

- (void)onTICUserSubStreamAvailable:(NSString *)userId available:(BOOL)available
{
if(available){
//创建渲染视图(您可以保存此视图,方便查找删除)
TICRenderView *render = [[TICRenderView alloc] init];
render.userId = userId;
render.streamType = TICStreamType_Sub;
//设置渲染位置(多人视频时,您需要计算好显示位置,避免视图遮挡)
render.frame = CGRectMake(0, 0, 100, 200);
//添加到父视图
[self.view addSubview:render];
//开始渲染画面
[[[TICManager sharedInstance] getTRTCCloud] startRemoteSubStreamView:userId view:render];
}
else{
//查找当前 userId 对应的渲染视图(getRenderView 是业务方法,可参考 demo 中的实现)
TICRenderView *render = [self getRenderView:userId streamType:TICStreamType_Sub];
//从父视图中移除
[render removeFromSuperview];
//停止渲染画面
[[[TICManager sharedInstance] getTRTCCloud] stopRemoteSubStreamView:userId];
}
}

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

//获取 TRTC 实例
TRTCCloud *trtc = [[TICManager sharedInstance] getTRTCCloud];
//开启本地渲染(renderView 为 UIView 实例)
[trtc startLocalPreview:YES view:renderView];
//关闭本地渲染
[trtc stopLocalPreview];
//开启音频
[trtc startLocalAudio];
//关闭音频
[trtc stopLocalAudio];
//切换扬声器和听筒
[trtc setAudioRoute:TRTCAudioModeSpeakerphone];

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

离线白板录制

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

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

!

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