LiveUISDK 接入文档
一、功能简介
直播云iOS LiveUISDK在LiveCoreSDK基础上提供了教室模版,包括一对一教室、小班教室、大班教室。涵盖一对一及多人音视频互动、课件教学、多功能涂鸦绘制、文字聊天、多种教学小工具等功能。在此demo中,包含一套完整的教室UI和功能逻辑,快速接入。
二、产物拉取
直播云新架构iOS端的LiveUISDK、WCRLiveUIDemo等都托管于Github中。
三、Demo
1.运行demo
- 使用终端命令
cd
进入代码根目录,执行命令pod install
。 - 配置直播云为您分配的机构ID,以及您机构可用的Token
- 使用Xcode打开文件
WCRLiveUIDemo-iOS.xcworkspace
。 - 目前仅支持真机调试,在运行前,请先设置证书信息。
- 设置完成后,运行代码。
2.demo效果
- 在demo的首页填写完参数后,点击
进入教室
,进入到教室页面。
3.demo下载
四、引入SDK
1.支持的设备和系统
支持iOS 9及以上,所有32、64位设备。但由于系统性能限制,建议使用设备为iPad4或以上机型,iPhone 6S或以上机型。
2.集成方式
支持Cocoapods方式集成和手动集成
Cocoapods方式集成
- 添加WCRLiveUI依赖库,使用Cocoapods方式引入:
Podfile中设置source
source 'https://github.com/S-Freedom/WCRSpec.git'
source 'https://github.com/CocoaPods/Specs.git'
Podfile中引入依赖库
pod 'WCRLiveUI'
- 在工程目录下执行
pod install
- 再工程目录下添加 TXFFmpeg.xcframework 、TXSoundTouch.xcframework 并选择 Embed & Sign
手动集成
- 在工程中引入以下SDK,并设置为Embed&Sign
WCRLiveUI.framework、ZegoAVKit2.framework
、RTCEngineDylib.framework、TXFFmpeg.xcframework 、 TXSoundTouch.xcframework
TXFFmpeg.xcframework TXSoundTouch.xcframework WCRLiveUI 、ZegoAVKit2、RTCEngineDylib
- 通过Cocoapods添加其他依赖
- 在工程目录下执行
pod install
五、工程设置
1.关闭bitcode。在demo工程的Build Settings设置中搜索bitcode
,关闭设置。(Cocoapods集成可忽略此项)
2.隐私设置。在Info.plist
文件中添加麦克风、摄像头、相册访问权限。
Privacy - Microphone Usage Description 用于音视频
Privacy - Camera Usage Description 用于音视频,聊天拍照
Privacy - Photo Library Usage Description 用于聊天拍照
Privacy - Bluetooth Always Usage Description 用于使用蓝牙智能笔
Privacy - Bluetooth Peripheral Usage Description 用于使用蓝牙智能笔
3.设置APP后台任务。在demo工程中的Capabilties中开启。
六、创建教室
1、准备
引入头文件
#import <WCRLiveUI/WCRLiveUI.h>
定义liveRoomVc
@property (nonatomic, strong) WCRBaseRoomViewController *liveRoomVc;
2、创建当前用户
创建类WCRUserInfo
的实例,可以使用提供的初始化方法:
- (instancetype)initWithUID:(NSString *)uid
token:(nullable NSString *)token
name:(nullable NSString *)name
avatar:(nullable NSString *)avatar
groupId:(nullable NSString *)groupId
role:(WCRUserType)role
code:(nullable NSString *)code
其中必填字段为uid
、role
,token
和code
字段二选一。
3、创建课程信息
创建类WCRClassInfo
的实例,各个字段解释如下
/**
必填 房间ID,最大32位的数字格式的字符串
*/
@property(nonatomic, copy) NSString* roomID;
/**
必填 机构ID,直播云后台分配的机构ID
*/
@property(nonatomic, copy) NSString* appID;
/**
课程名称,可以为空,建议填写
*/
@property(nonatomic, copy, nullable) NSString* classTitle;
/**
必填,老师信息,上课必须有老师
*/
@property(nonatomic, copy, nullable) WCRUserInfo* teacher;
/**
必填 房间类型,一对一、小班等
*/
@property(nonatomic, assign) WCRLiveRoomType roomType;
/**
app名字,在提示打开麦克风摄像权限alert时需要展示,建议填写
*/
@property(nonatomic, copy) NSString* appName;
/**
必填 课程状态
*/
@property(nonatomic, assign) WCRClassStatus classStatus;
/**
回放类型,创建回放教室时必填,建议默认选择Video
*/
@property (nonatomic, assign) WCRRoomPlaybackMode playbackMode;
/**
必填,教室在课堂开始前文档区域默认展现的html地址
*/
@property(nonatomic, copy) NSString* docUrlOnClassWaiting;
/**
必填,教室在课中老师离开教室时文档区域默认展现的html地址
*/
@property(nonatomic, copy) NSString* docUrlOnTeacherLeave;
/**
必填 课表计划开课时间
*/
@property(nonatomic, copy) NSDate* schedualStartTime;
/**
必填 课表计划结束时间
*/
@property(nonatomic, copy) NSDate* schedualEndTime;
/**
课程的实际开始时间,课前拿不到该时间可以不传,课中状态进入必须传
*/
@property(nonatomic, copy) NSDate* actualStartTime;
/**
课程的实际结束时间,拿不到可以不传,如课程已经结束进教室必须传
*/
@property(nonatomic, copy) NSDate* actualEndTime;
/**
离线资源相关信息,选填,若不为空,进入教室后会先下载相关资源,下载完成后再初始化消息信道与音视频相关功能
*/
@property (nonatomic, strong) WCRClassResourceModel *resourceModel;
/**
教室内所有学生列表,小班课必填,其他班型不需要填
*/
@property(nonatomic,copy) NSArray<WCRUserInfo*> *students;
/**
必填 设置环境
*/
@property(nonatomic, assign) WCREnvironment env;
/**
小组课组id, 小组课和同城双师课需要设置
*/
@property (nonatomic, strong) NSString *groupId;
/**
小组课组名字, 小组课和同城双师课需要设置
*/
@property (nonatomic, strong) NSString *groupName;
4、创建教室
调用类WCRBaseRoomViewController
的创建方法
+ (instancetype)createWithClassInfo:(WCRClassInfo *)classInfo
userInfo:(WCRUserInfo *)userInfo
classConfig:(WCRClassConfigModel *)classConfig;
房间创建完成后,会自动进入教室。可监听回调:-roomDidJoin:
获取进入教室结果。例如:
self.liveRoomVc = [WCRBaseRoomViewController createWithClassInfo:classInfo
userInfo:userInfo
classConfig:classConfig];
// 小组课和同城双师课需要设置课程Id
self.liveRoomVc.lessionId = 123456;
5、监听事件
设置delegate
self.liveRoomVc.delegate = self;
- (void)roomDidJoin:(NSError *)error{
// 监听进入教室结果
}
6、展示教室
当房间创建完成后,可调用展示Controller的方法,直接展示,例如:
[self presentViewController:liveRoomVc animated:YES completion:nil];
七、退出教室
调用接口 leaveRoom
。可监听回调:-roomWillLeaveForReason:
获取退出教室原因。例如:
[self.liveRoomVc leaveRoom];
- (void)roomWillLeaveForReason:(WCRLeaveClassRoomReason)reason{
//离开教室原因
//在这里可以做一些推出控制器的操作
[self dismissViewControllerAnimated:YES completion:nil];
}
八、皮肤配置
创建类WCRClassConfigModel
,并配置其中字段。目前支持涂鸦颜色配置、图标更换。
涂鸦颜色配置
设置doodleColorArray
,暂时仅支持以下8种ARGB颜色,由于适配新老架构,只支持调整8种颜色顺序,不支持调整颜色数量。如:
NSArray *doodleColorArray = @[@0xffxd80000,
@0xffff8100,
@0xffff1400,
@0xff33d122,
@0xff02afe9,
@0xffa97b14,
@0xfff035b3,
@0xff000090];
更换图标
设置对应班型的SkinModel
,具体参见SDK头文件。
九、Q&A
1. 是否支持模拟器?
由于底层SDK有不支持模拟器的,本教室SDK暂时不支持模拟器,如果APP里其他页面需要支持模拟器,可以使用宏隔离。如有强烈需要,请联系开发者。
2. iOS13加载不出图片?
acceptableContentTypes增加类型"application/octet-stream"
#import <AFNetworking/UIImageView+AFNetworking.h>
#import <AFNetworking/AFImageDownloader.h>
if (![UIImageView.sharedImageDownloader.sessionManager.responseSerializer.acceptableContentTypes containsObject:@"application/octet-stream"]) {
NSMutableSet<NSString*>* acceptableContentTypes = UIImageView.sharedImageDownloader.sessionManager.responseSerializer.acceptableContentTypes.mutableCopy;
[acceptableContentTypes addObject:@"application/octet-stream"];
UIImageView.sharedImageDownloader.sessionManager.responseSerializer.acceptableContentTypes = acceptableContentTypes;
}
3. 上传App Store Connect时出现“Invalid Segment Alignment. The app binary at '.app/Frameworks/.framework/*' does not have proper segment alignment. Try rebuilding the app with the latest Xcode version."
解决方法是生成binary的时候使用一段script来去掉那些不支持的结构。
在Xcode中选择项目->targets->Build Phases, 找到Embed Framework。
然后在Xcode的菜单栏Editor->Add Build Phase->Add Run Scrip Build Phase。
填入下面这段script
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done