- Xcode 9.0+
- OS X 10.10+的Mac真机
- 项目已配置有效的开发者签名
文件名称 | 说明 | 位置 |
---|---|---|
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 |
文件名称 | 说明 | 位置 |
---|---|---|
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 再将其导入到您当前的工程项目中。
在终端窗口中输入如下命令(需要提前在 Mac 中安装 Ruby 环境):
sudo gem install cocoapods
进入项目所在路径,然后输入以下命令行,之后项目路径下会出现一个 Podfile 文件。
pod init
编辑 Podfile 文件,按如下方式设置:
platform :macos, '10.10'
target 'TICDemo_Mac' do
pod 'TEduBoard_Mac'
pod 'TXIMSDK_Mac'
pod 'TXLiteAVSDK_TRTC_Mac'
end
在终端窗口中输入如下命令以更新本地库文件:
pod install
或使用以下命令更新本地库版本:
pod update
pod命令执行完后,双击打开 .xcworkspace 后缀的工程文件即可编译运行。
在 Xcode
开发环境下,按如下步骤进行工程配置以及导入依赖SDK
、TIC源码
:
- 将
TIC/macOS/SDK/TIC
目录下的TIC源码
导入到工程; - 在
General
子配置Linked Frameworks and Libraries
中加入TEduBoard_Mac.framework
和TXLiteAVSDK_Mac.framework
以及公共库libc++.tbd
和libresolv.tbd
; - 在
General
子配置Embedded Binaries
中加入ImSDKForMac.framework
; - 将
Build Settings
子配置Enable Bitcode
设置为 NO; - 在
Build Settings
子配置Other Linker Flags
加入配置-ObjC
。
- TIC 初始化主要是针对
ImSDKForMac.framework
的初始化,建议您在应用启动的时候调用。 - 用户被强制下线或
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{
//登录失败
}
}];
其中 userId
、userSig
(如何获取 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
接口,请参考 互动白板接入文档。
TIC 封装了ImSDKForMac.framework
发消息的常用接口,每个发消息接口在TICMessageListener
监听中都能找到对应的接收消息回调,具体对应关系如下:
发送消息接口 | 接收消息回调 | 参数说明 |
---|---|---|
sendTextMessage | onTICRecvTextMessage | 发送和接收 C2C 文本消息 |
sendCustomMessage | onTICRecvCustomMessage | 发送和接收 C2C 自定义消息 |
sendGroupTextMessage | onTICRecvGroupTextMessage | 发送和接收群文本消息 |
sendGroupCustomMessage | onTICRecvGroupCustomMessage | 发送和接收群自定义消息 |
sendMessage | onTICRecvMessage | 透传房间内除白板外的其他消息 |
sendGroupMessage | onTICRecvMessage | 透传房间内除白板外的其他群消息 |
如果房间内有成员打开或关闭摄像头,其他成员会收到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
。
!
- deno 对时消息 ntp 时间戳是从腾讯云 ntp 服务获取,您可以选择搭建自己的 ntp 服务器。
- 由于 IM 群消息有可能大于10000,当 IM 群消息大于10000时,消息会开始丢弃,导致空洞消息。上报群组后,后台判断,当群组中 IM 消息大于10000时,会自动备份群消息到 COS。