开发环境要求
Xcode 14
前置准备
步骤一:创建新的应用
1. 登录 实时互动-教育版 控制台,进入左侧导航栏的概览,选择新建应用。
2. 若尚未创建应用,则默认进入“创建应用”界面,输入应用名称,例如 TestLCIC。

若您已创建应用,可前往应用管理中,选择使用已有应用即可。

步骤二:获取 SDKAppId 和密钥(SecretKey)
1. 进入 应用管理 > 应用配置,获取应用 ID(SDKAppId)。
2. 进入 访问管理(CAM)控制台 获取密钥,若无密钥,需要在 API 密钥管理中进行新建,具体可参考 访问密钥管理 。


步骤三:获取进入课堂所需参数
1. 通过调用云 API 接口 RegisterUser 注册用户,可以获取到对应的用户 ID(userId)信息。
2. 通过云 API 接口 LoginUser 登录,可以获取到用户鉴权 token 信息。
3. 通过云 API 接口 CreateRoom 创建课堂,可以获取到课堂号(classId)信息。
字段 | 类型 | 必填 | 含义 | 备注 |
userid | string | 是 | 用户名。 | |
classid | string | 是 | 课堂 ID。 | |
token | string | 是 | 后台鉴权参数。 | |
role | string | 否 | 进入课堂角色,默认空。 | 可选参数 supervisor(巡课/内容审查) ,只有已注册应用内巡课用户才有权限。 |
lng | string | 否 | 语言参数,默认 zh-CN。 | 当前支持中文(简体)、中文(繁体) 、English、韩语、日语、阿拉伯语、越南语。可拼接相应参数,展示对应语种。参数:zh-CN、zh-TW、en-US、ka、ja、ar、vi。 |
location | boolean | 否 | 是否上报经纬度位置信息。 | 默认 false 不上报。 |
layout | string | 否 | 页面布局。 | 默认顶部布局(top),当前仅视频文档模式有效,支持双排布局(double)、右侧布局(right)、左侧布局(left)、三分布局(three)。 |
boardColor | string | 否 | 白板颜色。 | 白板颜色设置,默认为:#182E25 ,支持 Hex 格式,也支持 rgba(0, 0, 0, .3)设置。 |
noEndClass | boolean | 否 | 禁用下课。 | 助教进房时带上这个参数,在助教点击退出时,将隐藏「下课」,仅展示「离开」按钮。 |
快速跑通
步骤一:安装依赖
在您的 Podfile 中导入依赖文件。
// framework 使用静态集成use_frameworks! :linkage => :static// 根据不同的版本号,修改链接,下方示例为使用1.0.1 版本pod 'tcic_ios', :podspec => 'https://ios.qcloudclass.com/1.0.4/tcic_ios.podspec'
如果没有
Podfile
,请使用 pod init
生成Podfile
文件。User Script Sandboxing
设置为 No
。
说明:
请使用真机进行调试,音视频等插件在模拟器上无法看到效果。
步骤二:权限配置
在教学场景中,通常我们会用到音视频互动,屏幕共享等功能,因此需要应用配置对应的权限。
在
Info.plist
中添加以下权限描述:<!-- 相册权限 --><key>NSPhotoLibraryUsageDescription</key><string>Video calls require photo library permission.</string><!-- 相机权限 --><key>NSCameraUsageDescription</key><string>Video calls require camera permission.</string><!-- 麦克风权限 --><key>NSMicrophoneUsageDescription</key><string>Voice calls require microphone permission.</string><!-- 网络配置 --><key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict><!-- 后台模式 --><key>UIBackgroundModes</key><array><string>fetch</string></array><!-- 屏幕录制扩展 --><key>com.apple.security.application-groups</key><array><string>group.com.tencent.comm.tcic.sharescreen</string></array>
步骤三:初始化 SDK
在您的页面首次进入的时候需要初始化 TCIC SDK,您可以根据您的实际业务来处理。
import SwiftUIimport tcic_ios@mainstruct tcic_ios_simple_demoApp: App {init() {// 初始化SDKTCICManager.shared.initialize();}var body: some Scene {WindowGroup {ContentView()}}}
步骤四:设置回调事件
如果您需要监听课堂相关的事件,可添加相关回调,同初始化一样,您只需要添加一次即可。
@State private var callback: TCICCallback = TCICCallback() // 初始化回调事件self.callback.afterExitedClassBlock = {print("dismiss page");}self.callback.onJoinedClassFailedBlock = {print("joined class failed");}TCICManager.shared.setCallback(callback);
步骤五:设置进入课堂的必要参数
您可以根据您的场景进入课堂页面,参数如下。
let headerConfig = TCICHeaderComponentConfig();let messageConfig = TCICMessageComponentConfig();headerConfig.headerLeftBuilder = headerLeftBuilder;let config = TCICConfig(token: "", /// 通过云API获取的tokenclassId: "", /// 课堂iduserId: "", /// 用户userIdrole: 1, /// 用户角色,0: 学生,1: 老师, 3: 助教, 4: 巡课headerComponentConfig: headerConfig, /// Header 组件配置, 具体参数请参考TCICHeaderComponentConfigmessageComponentConfig: messageConfig /// Message 组件配置,具体参数请参考TCICMessageComponentConfig...config, /// 您还可以设置其他组件的自定义配置);TCICManager.shared.setConfig(config)
步骤六:进入课堂页面
您可以根据业务需要在合适的时机打开课堂页面,如下展示点击按钮后,打开课堂页面。
Button(action: {let headerLeftBuilder: TCICHeaderComponentConfig.HeaderBuilder = {return MyHeaderLeftView(messenger: TCICManager.shared.Tengine.binaryMessenger);}let headerConfig = TCICHeaderComponentConfig();let messageConfig = TCICMessageComponentConfig();headerConfig.headerLeftBuilder = headerLeftBuilder;headerConfig.headerLeftBuilderWidth = 200;headerConfig.headerLeftBuilderHeight = 40let config = TCICConfig(token: "", /// 通过云API获取的tokenclassId: "", /// 课堂iduserId: "", /// 用户userIdrole: 1, /// 用户角色,0: 学生,1: 老师, 3: 助教, 4: 巡课headerComponentConfig: headerConfig, /// Header 组件配置, 具体参数请参考TCICHeaderComponentConfigmessageComponentConfig: messageConfig /// Message 组件配置,具体参数请参考TCICMessageComponentConfig...config, /// 您还可以设置其他组件的自定义配置);TCICManager.shared.setConfig(config)isActive = true}) {Text("打开TCIC页面").frame(maxWidth: .infinity).padding().background(Color.blue).foregroundColor(.white).cornerRadius(8)}.padding(.horizontal).fullScreenCover(isPresented: $isActive, onDismiss: {TCICManager.shared.Tengine.viewController = nil}) {TCICManager.TPage().edgesIgnoringSafeArea(.all)}
步骤七:自定义 View
创建 Native View
import Foundationimport UIKitimport tcic_iosimport Flutterclass MyHeaderLeftView: TCICViewFactory {override init(messenger: FlutterBinaryMessenger) {super.init(messenger: messenger)}override func createNativeView(frame: CGRect, viewId: Int64, args: Any?) -> UIView {let view = UIView(frame: frame)view.backgroundColor = .bluelet label = UILabel(frame: CGRect(x: 0, y: 0, width: 180, height: 48))label.text = "My Header Left View From Ios"label.textColor = .whitelabel.textAlignment = .centerview.addSubview(label)return view}}
将 Native View 注册到 SDK
在设置课堂参数部分,可以传入`headerComponentConfig`,您只需要将您的自定义`native view` 传入即可。
let headerConfig = TCICHeaderComponentConfig();let headerLeftBuilder: TCICHeaderComponentConfig.HeaderBuilder = {return MyHeaderLeftView(messenger: TCICManager.shared.Tengine.binaryMessenger);}headerConfig.headerLeftBuilder = headerLeftBuilder; // builderheaderConfig.headerLeftBuilderWidth = 200; // 宽headerConfig.headerLeftBuilderHeight = 40 // 高let config = TCICConfig(token: "", /// 通过云API获取的tokenclassId: "", /// 课堂iduserId: "", /// 用户userIdrole: 1, /// 用户角色,0: 学生,1: 老师, 3: 助教, 4: 巡课headerComponentConfig: headerConfig, /// Header 组件配置, 具体参数请参考TCICHeaderComponentConfig...config, /// 您还可以设置其他组件的自定义配置);TCICManager.shared.setConfig(config)
TCICConfig 配置类
基础配置
public class TCICConfig {let token: String // 用户认证令牌let classId: String // 课程IDlet userId: String // 用户IDlet role: Int // 用户角色let langConfig: String? // 语言配置let isLatestBackend: Bool // 是否使用最新后端let isTestBackend: Bool // 是否使用测试后端}
组件配置
public class TCICConfig {let headerComponentConfig: TCICHeaderComponentConfig? // 头部组件配置let messageComponentConfig: TCICMessageComponentConfig? // 消息组件配置let videoComponentConfig: TCICVideoComponentConfig? // 视频组件配置let fontConfig: TCICFontConfig? // 字体配置let settingComponentConfig: TCICSettingComponentConfig? // 设置组件配置let whiteBoardComponentConfig: TCICWhiteBoardComponentConfig? // 白板组件配置let membersComponentConfig: TCICMembersComponentConfig? // 成员组件配置}
callbacks
public class TCICCallback {/*** 加入课堂成功回调*/public var onJoinedClassSuccessBlock: (() -> Void)?/*** 退出课堂回调*/public var afterExitedClassBlock: (() -> Void)?/*** 加入课堂失败回调*/public var onJoinedClassFailedBlock: (() -> Void)?/*** 被踢出课堂回调*/public var onKickedOffClassBlock: (() -> Void)?/*** 成员加入课堂回调* @param userId 用户信息*/public var onMemberJoinedClassBlock: (([String: Any]) -> Void)?/*** 成员离开课堂回调* @param userId 用户信息*/public var onMemberLeaveClassBlock: (([String: Any]) -> Void)?/*** 收到消息回调* @param messageJson 消息内容*/public var onReceivedMessageBlock: (([String: Any]) -> Void)?/*** 发生错误回调* @param code 错误代码* @param message 错误信息*/public var onErrorBlock: ((String, String) -> Void)?}
组件配置系统
头部组件配置 (TCICHeaderComponentConfig)
let headerConfig = TCICHeaderComponentConfig()// 设置左侧视图headerConfig.headerLeftBuilder = {return MyHeaderLeftView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}headerConfig.headerLeftBuilderWidth = 200headerConfig.headerLeftBuilderHeight = 40// 设置头部视图headerConfig.headerBuilder = {return MyHeaderView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}headerConfig.headerBuilderWidth = 300headerConfig.headerBuilderHeight = 50// 设置头部操作视图headerConfig.headerActionsBuilder = {return MyHeaderActionsView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}headerConfig.headerActionsBuilderWidth = 150headerConfig.headerActionsBuilderHeight = 40// 设置右侧视图headerConfig.headerRightBuilder = {return MyHeaderRightView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}headerConfig.headerRightBuilderWidth = 200headerConfig.headerRightBuilderHeight = 40
消息组件配置 (TCICMessageComponentConfig)
let messageConfig = TCICMessageComponentConfig()// 设置消息头部视图messageConfig.messageHeaderBuilder = {return MyMessageHeaderView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}messageConfig.messageHeaderBuilderWidth = 200messageConfig.messageHeaderBuilderHeight = 30// 设置消息气泡视图messageConfig.messageBubbleBuilder = {return MyMessageBubbleView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}messageConfig.messageBubbleBuilderWidth = 250messageConfig.messageBubbleBuilderHeight = 80// 设置消息项视图messageConfig.messageItemBuilder = {return MyMessageItemView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}messageConfig.messageItemBuilderWidth = 300messageConfig.messageItemBuilderHeight = 60// 设置消息行视图messageConfig.messageRowBuilder = {return MyMessageRowView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}messageConfig.messageRowBuilderWidth = 350messageConfig.messageRowBuilderHeight = 40
音视频组件配置 (TCICVideoComponentConfig)
let videoConfig = TCICVideoComponentConfig()// 设置视频操作视图videoConfig.videoActionBuilder = {return MyVideoActionView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}videoConfig.videoActionBuilderWidth = 200videoConfig.videoActionBuilderHeight = 50// 设置视频浮动视图videoConfig.videoFloatBuilder = {return MyVideoFloatView(messenger: TCICManager.shared.flutterEngine.binaryMessenger)}videoConfig.videoFloatBuilderWidth = 120videoConfig.videoFloatBuilderHeight = 80
技术支持
如果您在使用过程中遇到问题,可以通过以下方式获取技术支持:
腾讯云开发者社区