|
|
云直播观看端SDK开发指南
|
|
|
1.概述
|
|
|
1.1 阅读对象
|
|
|
1.2 功能特性
|
|
|
2.开发准备
|
|
|
2.1 开发环境
|
|
|
2.2 SDK配置
|
|
|
2.2.1 CocoaPods集成
|
|
|
2.2.2 手动集成
|
|
|
2.3 日志存储
|
|
|
2.4 错误码
|
|
|
2.5 打包上线报错
|
|
|
3.快速集成
|
|
|
3.1 配置参数
|
|
|
3.2 观看直播
|
|
|
3.3 文档功能
|
|
|
3.4 房间信息
|
|
|
3.5 聊天功能
|
|
|
3.6 问答功能
|
|
|
3.7 连麦功能
|
|
|
3.8 切换线路和清晰度
|
|
|
3.9 答题卡功能
|
|
|
3.10 问卷功能
|
|
|
3.11 广播功能
|
|
|
3.12 签到功能
|
|
|
3.13 抽奖功能
|
|
|
3.14 修改昵称
|
|
|
3.15 在线人数
|
|
|
3.16 随堂测功能
|
|
|
3.17 公告
|
|
|
3.18 跑马灯
|
|
|
3.19 播放器状态
|
|
|
3.20 视频缓存速度
|
|
|
3.21 用户进出直播间提醒
|
|
|
3.22 抽奖2.0功能 (该功能需单独开启)
|
|
|
4.常见问题
|
|
|
4.1 旋转屏错误
|
|
|
4.2 Swift实现代理错误
|
|
|
4.3 查看手机日志
|
|
|
4.4 编译失败和打包上架打包失败
|
|
|
4.5 提交问卷的格式
|
|
|
|
|
|
云直播观看端SDK开发指南
|
|
|
|
|
|
1.概述
|
|
|
|
|
|
1.1 阅读对象
|
|
|
# 1.概述
|
|
|
|
|
|
本文档为技术文档,需要阅读者:
|
|
|
|
|
|
具备基本的iOS开发能力
|
|
|
|
|
|
准备接入CC视频的直播SDK相关功能
|
|
|
## 1.1 阅读对象
|
|
|
|
|
|
对CC云直播产品使用方法有基础的了解,使用帮助地址
|
|
|
本文档为技术文档,需要阅读者:
|
|
|
|
|
|
1.2 功能特性
|
|
|
- 具备基本的iOS开发能力
|
|
|
- 准备接入CC视频的直播SDK相关功能
|
|
|
- 对CC云直播产品使用方法有基础的了解,[使用帮助地址](https://doc.bokecc.com/live/)
|
|
|
|
|
|
功能 描述
|
|
|
直播视频 观看直播视频
|
|
|
文档展示 能够观看当前直播文档,文档添加水印
|
|
|
线路更换 观看卡顿请换个线路
|
|
|
清晰度 支持直播多清晰度切换播放
|
|
|
答题卡 支持实时检测课堂学生的掌握程度
|
|
|
问答 能够发送问题和接受回答信息
|
|
|
简介 支持对直播间的信息展示
|
|
|
问卷 支持对观看直播的人进行信息采集
|
|
|
广播 支持发送全体消息
|
|
|
连麦 支持与直播人员进行音视频沟通
|
|
|
签到 支持签到功能
|
|
|
抽奖 支持抽奖功能
|
|
|
随堂测 支持随堂测互动
|
|
|
修改昵称 支持自定义昵称
|
|
|
聊天互动 支持与房间内的其他人聊天互动和一对一私聊
|
|
|
跑马灯 支持直播防录屏功能
|
|
|
2.开发准备
|
|
|
## 1.2 功能特性
|
|
|
|
|
|
2.1 开发环境
|
|
|
| 功能 | 描述 |
|
|
|
| -------- | ---------------------------------------- |
|
|
|
| 直播视频 | 观看直播视频 |
|
|
|
| 文档展示 | 能够观看当前直播文档,文档添加水印 |
|
|
|
| 线路更换 | 观看卡顿请换个线路 |
|
|
|
| 清晰度 | 支持直播多清晰度切换播放 |
|
|
|
| 答题卡 | 支持实时检测课堂学生的掌握程度 |
|
|
|
| 问答 | 能够发送问题和接受回答信息 |
|
|
|
| 简介 | 支持对直播间的信息展示 |
|
|
|
| 问卷 | 支持对观看直播的人进行信息采集 |
|
|
|
| 广播 | 支持发送全体消息 |
|
|
|
| 连麦 | 支持与直播人员进行音视频沟通 |
|
|
|
| 签到 | 支持签到功能 |
|
|
|
| 抽奖 | 支持抽奖功能 |
|
|
|
| 随堂测 | 支持随堂测互动 |
|
|
|
| 修改昵称 | 支持自定义昵称 |
|
|
|
| 聊天互动 | 支持与房间内的其他人聊天互动和一对一私聊 |
|
|
|
| 跑马灯 | 支持直播防录屏功能 |
|
|
|
|
|
|
Xcode 10.0 或以上版本
|
|
|
|
|
|
支持 iOS 9.0 或以上版本的 iOS 设备
|
|
|
# 2.开发准备
|
|
|
|
|
|
有效的 获得场景视频 云直播账号
|
|
|
## 2.1 开发环境
|
|
|
|
|
|
2.2 SDK配置
|
|
|
- Xcode 10.0 或以上版本
|
|
|
- 支持 iOS 9.0 或以上版本的 iOS 设备
|
|
|
- 有效的 获得场景视频 云直播账号
|
|
|
|
|
|
2.2.1 CocoaPods集成
|
|
|
## 2.2 SDK配置
|
|
|
|
|
|
已安装CocoaPods
|
|
|
### 2.2.1 CocoaPods集成
|
|
|
|
|
|
**已安装CocoaPods**
|
|
|
|
|
|
```
|
|
|
如果是有连麦的SDK:
|
|
|
pod 'CCLivePlaySDK', '~> 3.8.0'
|
|
|
如果是无连麦的SDK:
|
... | ... | @@ -97,134 +52,168 @@ v3.11.2 之前的版本请用如下链接: |
|
|
pod 'CCLivePlaySDK', :podspec => 'https://raw.githubusercontent.com/CCVideo/Live_iOS_Play_SDK/3.8.0/CCLivePlaySDK.podspec'
|
|
|
v3.11.2 之后的版本请用如下链接:
|
|
|
pod 'CCLivePlaySDK', :podspec => 'https://hdgit.bokecc.com/ccvideo/Live_iOS_Play_SDK/raw/3.11.2/CCLivePlaySDK.podspec'
|
|
|
|
|
|
|
|
|
PS:其中3.8.0与3.11.2为SDK版本号可自行更改。
|
|
|
未安装CocoaPods
|
|
|
```
|
|
|
|
|
|
安装CocoaPods
|
|
|
**未安装CocoaPods**
|
|
|
|
|
|
打开终端:>_
|
|
|
1、查看当前Ruby版本
|
|
|
1. 安装CocoaPods
|
|
|
|
|
|
打开终端:>_
|
|
|
1、查看当前Ruby版本
|
|
|
|
|
|
ruby -v
|
|
|
2、升级Ruby环境,首先需要安装rvm(第一步要下载一些东西等两分钟左右)
|
|
|
```
|
|
|
ruby -v
|
|
|
```
|
|
|
|
|
|
2、升级Ruby环境,首先需要安装rvm(第一步要下载一些东西等两分钟左右)
|
|
|
|
|
|
curl -L get.rvm.io | bash -s stable
|
|
|
source ~/.bashrc
|
|
|
source ~/.bash_profile
|
|
|
3、查看rvm版本
|
|
|
```
|
|
|
curl -L get.rvm.io | bash -s stable
|
|
|
source ~/.bashrc
|
|
|
source ~/.bash_profile
|
|
|
```
|
|
|
|
|
|
3、查看rvm版本
|
|
|
|
|
|
rvm -v
|
|
|
|
|
|
显示如下(或者是其他版本)
|
|
|
rvm 1.29.3 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
|
|
|
4、列出ruby可安装的版本信息
|
|
|
```
|
|
|
rvm -v
|
|
|
|
|
|
显示如下(或者是其他版本)
|
|
|
rvm 1.29.3 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
|
|
|
```
|
|
|
|
|
|
rvm list known
|
|
|
|
|
|
显示如下
|
|
|
# MRI Rubies
|
|
|
[ruby-]1.8.6[-p420]
|
|
|
[ruby-]1.8.7[-head] # security released on head
|
|
|
[ruby-]1.9.1[-p431]
|
|
|
[ruby-]1.9.2[-p330]
|
|
|
[ruby-]1.9.3[-p551]
|
|
|
[ruby-]2.0.0[-p648]
|
|
|
[ruby-]2.1[.10]
|
|
|
[ruby-]2.2[.10]
|
|
|
[ruby-]2.3[.7]
|
|
|
[ruby-]2.4[.4]
|
|
|
[ruby-]2.5[.1] // 重点在这里 重点在这里 重点在这里
|
|
|
[ruby-]2.6[.0-preview2] // 测试版
|
|
|
ruby-head
|
|
|
.....
|
|
|
5、安装一个ruby版本
|
|
|
|
|
|
|
|
|
rvm install 2.5.1
|
|
|
// 注意:安装过程中需要两次按下 Enter 键, 第二次按下后需要输入电脑访问密码(不可见,只管输入就行);
|
|
|
// 如果你电脑没有安装Xcode和Command Line Tools for Xcode以及Homebrew 会自动下载安装,建议提前安装这三者.
|
|
|
|
|
|
|
|
|
这里很多小伙伴会遇到错误,大部分是因为没有安装Homebrew造成,所以所以所以要提前安装比较好
|
|
|
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
|
|
6、设置为默认版本
|
|
|
4、列出ruby可安装的版本信息
|
|
|
|
|
|
```
|
|
|
rvm list known
|
|
|
|
|
|
rvm use 2.5.1 --default
|
|
|
7、更换源
|
|
|
显示如下
|
|
|
# MRI Rubies
|
|
|
[ruby-]1.8.6[-p420]
|
|
|
[ruby-]1.8.7[-head] # security released on head
|
|
|
[ruby-]1.9.1[-p431]
|
|
|
[ruby-]1.9.2[-p330]
|
|
|
[ruby-]1.9.3[-p551]
|
|
|
[ruby-]2.0.0[-p648]
|
|
|
[ruby-]2.1[.10]
|
|
|
[ruby-]2.2[.10]
|
|
|
[ruby-]2.3[.7]
|
|
|
[ruby-]2.4[.4]
|
|
|
[ruby-]2.5[.1] // 重点在这里 重点在这里 重点在这里
|
|
|
[ruby-]2.6[.0-preview2] // 测试版
|
|
|
ruby-head
|
|
|
.....
|
|
|
```
|
|
|
|
|
|
5、安装一个ruby版本
|
|
|
|
|
|
sudo gem update --system
|
|
|
|
|
|
gem sources --remove https://rubygems.org/
|
|
|
|
|
|
gem sources --add https://gems.ruby-china.com/
|
|
|
8、为了验证你的Ruby镜像是并且仅是ruby-china,执行以下命令查看
|
|
|
```
|
|
|
rvm install 2.5.1
|
|
|
// 注意:安装过程中需要两次按下 Enter 键, 第二次按下后需要输入电脑访问密码(不可见,只管输入就行);
|
|
|
// 如果你电脑没有安装Xcode和Command Line Tools for Xcode以及Homebrew 会自动下载安装,建议提前安装这三者.
|
|
|
|
|
|
|
|
|
gem sources -l
|
|
|
|
|
|
|
|
|
如果是以下结果说明正确,如果有其他的请自行百度解决
|
|
|
*** CURRENT SOURCES ***
|
|
|
|
|
|
https://gems.ruby-china.com/
|
|
|
9、这时候才正式开始安装CocoaPods
|
|
|
这里很多小伙伴会遇到错误,大部分是因为没有安装Homebrew造成,所以所以所以要提前安装比较好
|
|
|
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
|
|
```
|
|
|
|
|
|
6、设置为默认版本
|
|
|
|
|
|
```
|
|
|
rvm use 2.5.1 --default
|
|
|
```
|
|
|
|
|
|
7、更换源
|
|
|
|
|
|
```
|
|
|
sudo gem update --system
|
|
|
|
|
|
sudo gem install -n /usr/local/bin cocoapods
|
|
|
10、如果安装了多个Xcode使用下面的命令选择(一般需要选择最近的Xcode版本)
|
|
|
gem sources --remove https://rubygems.org/
|
|
|
|
|
|
gem sources --add https://gems.ruby-china.com/
|
|
|
```
|
|
|
|
|
|
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
|
|
|
11、安装本地库
|
|
|
8、为了验证你的Ruby镜像是并且仅是ruby-china,执行以下命令查看
|
|
|
|
|
|
```
|
|
|
gem sources -l
|
|
|
|
|
|
pod setup
|
|
|
12、执行以上命令后
|
|
|
|
|
|
如果是以下结果说明正确,如果有其他的请自行百度解决
|
|
|
*** CURRENT SOURCES ***
|
|
|
|
|
|
Setting up CocoaPods master repo
|
|
|
https://gems.ruby-china.com/
|
|
|
```
|
|
|
|
|
|
9、这时候才正式开始安装CocoaPods
|
|
|
|
|
|
```
|
|
|
sudo gem install -n /usr/local/bin cocoapods
|
|
|
```
|
|
|
|
|
|
10、如果安装了多个Xcode使用下面的命令选择(一般需要选择最近的Xcode版本)
|
|
|
|
|
|
```
|
|
|
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
|
|
|
```
|
|
|
|
|
|
11、安装本地库
|
|
|
|
|
|
```
|
|
|
pod setup
|
|
|
```
|
|
|
|
|
|
12、执行以上命令后
|
|
|
|
|
|
```
|
|
|
Setting up CocoaPods master repo
|
|
|
$ /usr/bin/git clone https://github.com/CocoaPods/Specs.git master --progress
|
|
|
Cloning into 'master'...
|
|
|
remote: Counting objects: 1879515, done.
|
|
|
remote: Compressing objects: 100% (321/321), done.
|
|
|
Receiving objects: 21% (404525/1879515), 73.70 MiB | 22.00 KiB/
|
|
|
然后就是漫长的等待,当然,网络好的情况下会更快
|
|
|
在Podfile文件中添加
|
|
|
```
|
|
|
|
|
|
2. 在Podfile文件中添加
|
|
|
|
|
|
如果是有连麦的SDK:
|
|
|
pod 'CCLivePlaySDK', '~> 3.8.0'
|
|
|
如果是无连麦的SDK:
|
|
|
v3.11.2 之前的版本请用如下链接:
|
|
|
pod 'CCLivePlaySDK', :podspec => 'https://raw.githubusercontent.com/CCVideo/Live_iOS_Play_SDK/3.8.0/CCLivePlaySDK.podspec'
|
|
|
v3.11.2 之后的版本请用如下链接:
|
|
|
pod 'CCLivePlaySDK', :podspec => 'https://hdgit.bokecc.com/ccvideo/Live_iOS_Play_SDK/raw/3.11.2/CCLivePlaySDK.podspec'
|
|
|
|
|
|
PS:其中3.8.0与3.11.2为SDK版本号可自行更改。
|
|
|
在终端中执行
|
|
|
```
|
|
|
如果是有连麦的SDK:
|
|
|
pod 'CCLivePlaySDK', '~> 3.8.0'
|
|
|
如果是无连麦的SDK:
|
|
|
v3.11.2 之前的版本请用如下链接:
|
|
|
pod 'CCLivePlaySDK', :podspec => 'https://raw.githubusercontent.com/CCVideo/Live_iOS_Play_SDK/3.8.0/CCLivePlaySDK.podspec'
|
|
|
v3.11.2 之后的版本请用如下链接:
|
|
|
pod 'CCLivePlaySDK', :podspec => 'https://hdgit.bokecc.com/ccvideo/Live_iOS_Play_SDK/raw/3.11.2/CCLivePlaySDK.podspec'
|
|
|
|
|
|
PS:其中3.8.0与3.11.2为SDK版本号可自行更改。
|
|
|
```
|
|
|
|
|
|
pod install
|
|
|
ps:目前CocoaPods集成仅支持3.8.0及以后的版本,旧版本暂不支持CocoaPods集成
|
|
|
3. 在终端中执行
|
|
|
|
|
|
2.2.2 手动集成
|
|
|
```
|
|
|
pod install
|
|
|
```
|
|
|
|
|
|
1.将SDK文件夹内的所有文件拖到项目中
|
|
|
**ps:目前CocoaPods集成仅支持3.8.0及以后的版本,旧版本暂不支持CocoaPods集成**
|
|
|
|
|
|
|
|
|
|
|
|
### 2.2.2 手动集成
|
|
|
|
|
|
1.将SDK文件夹内的所有文件拖到项目中
|
|
|
|
|
|
```
|
|
|
command + b 编译,如果报错" file '...xxx/IJKMediaFramework.framework/IJKMediaFramework' for architecture arm64 "
|
|
|
解决方案:
|
|
|
Targets -> Build Settings -> 搜索 "Enable Bitcode" 设置为 "NO"
|
|
|
2.command + r 运行
|
|
|
```
|
|
|
|
|
|
2.command + r 运行
|
|
|
|
|
|
```
|
|
|
如果报错" dyld: Library not loaded: @rpath/XXX.framework "
|
|
|
解决方案:
|
|
|
Targets -> Build Phases ->
|
... | ... | @@ -233,17 +222,22 @@ Targets -> Build Phases -> |
|
|
点击新添加的 Copy Files 前面的下拉箭头 ->
|
|
|
Destination 选择 "Frameworks" ->
|
|
|
点击当前目录下的 "+" 将SDK包含的.framework 包添加即可
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.3 日志存储
|
|
|
## 2.3 日志存储
|
|
|
|
|
|
在AppDelegate.m文件导入头文件
|
|
|
|
|
|
|
|
|
```
|
|
|
#import "CCSDK/SaveLogUtil.h"
|
|
|
在启动方法中添加日志存储
|
|
|
```
|
|
|
|
|
|
在启动方法中添加日志存储
|
|
|
|
|
|
```
|
|
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
|
|
/**
|
|
|
* @brief 是否存储日志
|
... | ... | @@ -251,19 +245,23 @@ Destination 选择 "Frameworks" -> |
|
|
[[SaveLogUtil sharedInstance]isNeedToSaveLog:YES];
|
|
|
return YES;
|
|
|
}
|
|
|
2.4 错误码
|
|
|
```
|
|
|
|
|
|
服务错误类型
|
|
|
## 2.4 错误码
|
|
|
|
|
|
服务错误类型
|
|
|
|
|
|
```
|
|
|
ERROR_SERVICE_TYPE
|
|
|
|
|
|
ERROR_ROOM_STATE = 1001 直播间状态不可用,可能没有开始推流
|
|
|
ERROR_USELESS_INFO = 1002 没有获取到有用的视频信息
|
|
|
ERROR_PASSWORD = 1003 密码错误
|
|
|
系统错误类型
|
|
|
```
|
|
|
|
|
|
系统错误类型
|
|
|
|
|
|
```
|
|
|
ERROR_SYSTEM_TYPE
|
|
|
|
|
|
ERROR_RETURNDATA = 1004 返回内容格式错误
|
... | ... | @@ -283,27 +281,33 @@ Destination 选择 "Frameworks" -> |
|
|
ERROR_PUNCH = 1018 获取打卡信息失败
|
|
|
ERROR_PUNCHCOMMIT = 1019 获取打卡提交结果失败
|
|
|
ERROR_DRMURL = 1020 获取加密地址失败
|
|
|
2.5 打包上线报错
|
|
|
```
|
|
|
|
|
|
打包上线过程出现以下错误,关于不支持 x86_64 和 i386 等情况.
|
|
|
|
|
|
|
|
|
## 2.5 打包上线报错
|
|
|
|
|
|
打包上线过程出现以下错误,关于不支持 x86_64 和 i386 等情况.
|
|
|
|
|
|
```
|
|
|
The following issues occurred while distributing your application.
|
|
|
|
|
|
|
|
|
App Store Connect Operation Error
|
|
|
ERROR ITMS-90097:"Unsupported Architectures. The executable for CCLiveCloud.app/Frameworks/CCSDK.framework contains unsupported architectures '[x86_64]."
|
|
|
|
|
|
|
|
|
App Store Connect Operation Error
|
|
|
ERROR ITMS-90097:"Unsupported Architectures. The executable for CCLiveCloud.app/Frameworks/DWDrmServer.framework contains unsupported architectures '[x86_64]."
|
|
|
|
|
|
|
|
|
App Store Connect Operation Error
|
|
|
ERROR ITMS-90097:"Unsupported Architectures. The executable for CCLiveCloud.app/Frameworks/IJKMediaFramework.framework contains unsupported architectures '[x86_64]."
|
|
|
|
|
|
|
|
|
App Store Connect Operation Error
|
|
|
ERROR ITMS-90097:"Unsupported Architectures. The executable for CCLiveCloud.app/Frameworks/WebRTC.framework contains unsupported architectures '[x86_64,i386]."
|
|
|
解决方案: Target --> Build Phases --> 点击"+"按钮,选择"New Run Script Phase",在 Run Script 内添加以下脚本方法:
|
|
|
```
|
|
|
|
|
|
解决方案: Target --> Build Phases --> 点击"+"按钮,选择"New Run Script Phase",在 Run Script 内添加以下脚本方法:
|
|
|
|
|
|
```
|
|
|
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
|
|
|
|
|
|
# This script loops through the frameworks embedded in the application and
|
... | ... | @@ -332,15 +336,17 @@ rm "$FRAMEWORK_EXECUTABLE_PATH" |
|
|
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
|
|
|
|
|
|
done
|
|
|
```
|
|
|
|
|
|
添加上之后,重新打包上线即可.
|
|
|
|
|
|
3.快速集成
|
|
|
# 3.快速集成
|
|
|
|
|
|
3.1 配置参数
|
|
|
## 3.1 配置参数
|
|
|
|
|
|
3.1.1 调用方法
|
|
|
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 登录房间
|
|
|
* @param parameter 配置参数信息
|
... | ... | @@ -376,9 +382,11 @@ done |
|
|
* (选填参数)viewercustomua; //用户自定义参数,需和后台协商,没有定制传@""
|
|
|
*/
|
|
|
- (id)initWithParameter:(PlayParameter *)parameter;
|
|
|
代理方法
|
|
|
```
|
|
|
|
|
|
代理方法
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 登录成功
|
|
|
*/
|
... | ... | @@ -387,7 +395,7 @@ done |
|
|
* @brief 登录失败
|
|
|
*/
|
|
|
-(void)loginFailed:(NSError *)error reason:(NSString *)reason;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 请求成功
|
|
|
*/
|
... | ... | @@ -396,19 +404,27 @@ done |
|
|
* @brief 登录请求失败
|
|
|
*/
|
|
|
-(void)requestFailed:(NSError *)error reason:(NSString *)reason;
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
3.1.2 集成
|
|
|
|
|
|
导入头文件
|
|
|
|
|
|
|
|
|
```
|
|
|
#import "CCSDK/RequestData.h"//SDK
|
|
|
声明变量
|
|
|
```
|
|
|
|
|
|
声明变量
|
|
|
|
|
|
```
|
|
|
@property (nonatomic,strong)RequestData * requestData;//sdk
|
|
|
配置参数:PlayParameter的属性如下
|
|
|
```
|
|
|
|
|
|
配置参数:PlayParameter的属性如下
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 用户ID
|
|
|
*/
|
... | ... | @@ -521,7 +537,7 @@ done |
|
|
* 抽奖2.0 抽奖去重, 默认开启YES.(不开启时(NO),收到同一重复抽奖,代理方法会响应多次)
|
|
|
*/
|
|
|
@property(assign, nonatomic)BOOL LotteryRepetition;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 视频播放状态
|
|
|
* HDMoviePlaybackStateStopped 播放停止
|
... | ... | @@ -539,7 +555,7 @@ typedef NS_ENUM(NSUInteger, HDMoviePlaybackState) { |
|
|
HDMoviePlaybackStateSeekingForward,
|
|
|
HDMoviePlaybackStateSeekingBackward,
|
|
|
};
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 视频加载状态
|
|
|
* HDMovieLoadStateUnknown 未知状态
|
... | ... | @@ -553,7 +569,7 @@ typedef NS_ENUM(NSUInteger, HDMovieLoadState) { |
|
|
HDMovieLoadStatePlaythroughOK,
|
|
|
HDMovieLoadStateStalled,
|
|
|
};
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 视频播放完成原因
|
|
|
* HDMovieFinishReasonPlaybackEnded 自然播放结束
|
... | ... | @@ -565,9 +581,11 @@ typedef NS_ENUM(NSUInteger, HDMovieFinishReason) { |
|
|
HDMovieFinishReasonUserExited,
|
|
|
HDMovieFinishReasonPlaybackError,
|
|
|
};
|
|
|
新增 RemindModel 类 (用户进出直播间代理模型类)
|
|
|
```
|
|
|
|
|
|
新增 RemindModel 类 (用户进出直播间代理模型类)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* 用户进出通知
|
|
|
* HDUSER_IN_REMIND 进入直播间
|
... | ... | @@ -577,7 +595,7 @@ typedef NS_ENUM(NSUInteger, HDUSER_REMIND) { |
|
|
HDUSER_IN_REMIND,//进入直播间
|
|
|
HDUSER_OUT_REMIND,//退出直播间
|
|
|
};
|
|
|
|
|
|
|
|
|
/** 用户id */
|
|
|
@property (nonatomic, copy) NSString *userId;
|
|
|
/** 昵称 */
|
... | ... | @@ -596,9 +614,11 @@ typedef NS_ENUM(NSUInteger, HDUSER_REMIND) { |
|
|
@property (nonatomic, copy) NSString *prefixContent;
|
|
|
/** 发送内容后缀 */
|
|
|
@property (nonatomic, copy) NSString *suffixContent;
|
|
|
新增 BanChatModel 类(用户禁言群发消息通知模型类)
|
|
|
```
|
|
|
|
|
|
新增 BanChatModel 类(用户禁言群发消息通知模型类)
|
|
|
|
|
|
```
|
|
|
/** 用户id */
|
|
|
@property (nonatomic, copy) NSString *userId;
|
|
|
/** 昵称 */
|
... | ... | @@ -609,9 +629,11 @@ typedef NS_ENUM(NSUInteger, HDUSER_REMIND) { |
|
|
@property (nonatomic, copy) NSString *userAvatar;
|
|
|
/** 分组id */
|
|
|
@property (nonatomic, copy) NSString *groupId;
|
|
|
新增 NewLotteryMessageModel 类 (抽奖2.0 该功能需要单独开启)
|
|
|
```
|
|
|
|
|
|
新增 NewLotteryMessageModel 类 (抽奖2.0 该功能需要单独开启)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* 抽奖2.0 抽奖消息类别
|
|
|
* NEW_LOTTERY_NULL 无抽奖
|
... | ... | @@ -644,18 +666,24 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* userInfos (NSArray 必须) 中奖名单 例:@[@{@"userAvatar":头像,@"userName":用户名,@"userId":用户id,@"prizeCode":中奖码}]
|
|
|
*/
|
|
|
@property (nonnull, strong) NSDictionary *infos;
|
|
|
新增 LineModel 类 (切换线路清晰度类)
|
|
|
```
|
|
|
|
|
|
新增 LineModel 类 (切换线路清晰度类)
|
|
|
|
|
|
```
|
|
|
/** 清晰度 0-原画;200-流畅;300-标清; */
|
|
|
@property (nonatomic, copy) NSArray * _Nonnull quality;
|
|
|
/** 视频线路数 */
|
|
|
@property (nonatomic, assign) NSInteger videoLine;
|
|
|
/** 音频线路数 */
|
|
|
@property (nonatomic, assign) NSInteger audioLine;
|
|
|
开始配置
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
开始配置
|
|
|
|
|
|
```
|
|
|
第一步:实例化参数类
|
|
|
PlayParameter *parameter = [[PlayParameter alloc] init];
|
|
|
//配置PlayParameter里面的属性,如userId,roomId等!
|
... | ... | @@ -663,42 +691,52 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
_requestData = [[RequestData alloc] initWithParameter:parameter];
|
|
|
第三步添加代理
|
|
|
_requestData.delegate = self;
|
|
|
添加代理
|
|
|
```
|
|
|
|
|
|
添加代理
|
|
|
|
|
|
```
|
|
|
@interface 您的控制器 ()<RequestDataDelegate>
|
|
|
实现代理
|
|
|
```
|
|
|
|
|
|
实现代理
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 请求成功
|
|
|
*/
|
|
|
-(void)requestSucceed {
|
|
|
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
* @brief 登录请求失败
|
|
|
*/
|
|
|
-(void)requestFailed:(NSError *)error reason:(NSString *)reason {
|
|
|
|
|
|
|
|
|
}
|
|
|
至此您的项目已经可以运行了,并且已经集成好了视频和文档基本功能;如果不需要文档功能则不配置文档相关属性即可
|
|
|
```
|
|
|
|
|
|
3.2 观看直播
|
|
|
|
|
|
3.2.1 代理方法(可选)
|
|
|
|
|
|
**至此您的项目已经可以运行了,并且已经集成好了视频和文档基本功能;如果不需要文档功能则不配置文档相关属性即可**
|
|
|
|
|
|
|
|
|
|
|
|
## 3.2 观看直播
|
|
|
|
|
|
3.2.1 代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 主讲开始推流
|
|
|
*/
|
|
|
- (void)onLiveStatusChangeStart;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 停止直播,endNormal表示是否异常停止推流,这个参数对观看端影响不大
|
|
|
*/
|
|
|
- (void)onLiveStatusChangeEnd:(BOOL)endNormal;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 收到踢出消息,停止推流并退出播放(被主播踢出)(change)
|
|
|
* dictionary[@"kick_out_type"] 踢出类型
|
... | ... | @@ -709,22 +747,22 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
*
|
|
|
*/
|
|
|
- (void)onKickOut:(NSDictionary *)dictionary;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 收到播放直播状态 0.正在直播 1.未开始直播
|
|
|
*/
|
|
|
- (void)getPlayStatue:(NSInteger)status;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 直播间被禁
|
|
|
*/
|
|
|
- (void)theRoomWasBanned;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 直播间解禁
|
|
|
*/
|
|
|
- (void)theRoomWasCleared;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 客户端关闭摄像头
|
|
|
数据源类型 数据源值 数据源类型描述 数据源类型描述值
|
... | ... | @@ -746,7 +784,7 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
当以上场景无法满足要求时,主播可自定义场景,用户不需要关心自定义场景细节内容
|
|
|
*/
|
|
|
- (void)receivedSwitchSource:(NSDictionary *)dic;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 视频或者文档大窗
|
|
|
* isMain 1为视频为主,0为文档为主"
|
... | ... | @@ -776,50 +814,52 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
获取已播放时长,调用后会响应onLivePlayedTime方法,调用间隔三秒
|
|
|
*/
|
|
|
- (void)getLivePlayedTime;
|
|
|
3.2.2 主动方法(可选)
|
|
|
```
|
|
|
|
|
|
3.2.2 主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 改变播放器frame
|
|
|
*/
|
|
|
- (void)changePlayerFrame:(CGRect) playerFrame;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 改变播放器父窗口
|
|
|
*/
|
|
|
- (void)changePlayerParent:(UIView *) playerParent;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 播放器暂停
|
|
|
*/
|
|
|
- (void)pausePlayer;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 播放器播放
|
|
|
*/
|
|
|
- (void)startPlayer;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 播放器关闭并移除
|
|
|
*/
|
|
|
- (void)shutdownPlayer;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 播放器停止
|
|
|
*/
|
|
|
- (void)stopPlayer;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 重新加载视频,参数force表示是否强制重新加载视频,
|
|
|
* 一般重新加载视频的时间间隔应该超过3秒,如果强制重新加载视频,时间间隔可以在3S之内
|
|
|
*/
|
|
|
-(void)reloadVideo:(BOOL)force;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 播放器是否播放
|
|
|
*/
|
|
|
- (BOOL)isPlaying;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 设置后台是否可播放
|
|
|
*/
|
... | ... | @@ -828,16 +868,18 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @brief 销毁文档和视频,清除视频和文档的时候需要调用,退出播放页面的时候也需要调用
|
|
|
*/
|
|
|
- (void)requestCancel;
|
|
|
3.3 文档功能
|
|
|
```
|
|
|
|
|
|
3.3.1 代理方法(可选)
|
|
|
## 3.3 文档功能
|
|
|
|
|
|
3.3.1 代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 获取文档内白板或者文档本身的宽高,来进行屏幕适配用的
|
|
|
*/
|
|
|
- (void)getDocAspectRatioOfWidth:(CGFloat)width height:(CGFloat)height;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 获取ppt当前页数和总页数 (会多次回调)
|
|
|
*
|
... | ... | @@ -851,12 +893,12 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* pageNum 文档页码}
|
|
|
*/
|
|
|
- (void)onPageChange:(NSDictionary *) dictionary;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 双击ppt
|
|
|
*/
|
|
|
- (void)doubleCllickPPTView;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 获取所有文档列表
|
|
|
* @param listDic [{ docId //文档ID
|
... | ... | @@ -868,7 +910,7 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
title //当前页标题 }]}]
|
|
|
*/
|
|
|
- (void)receivedDocsList:(NSDictionary *)listDic;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 视频或者文档大窗
|
|
|
* isMain 1为视频为主,0为文档为主"
|
... | ... | @@ -886,31 +928,33 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* 6画板加载失败
|
|
|
*/
|
|
|
- (void)docLoadCompleteWithIndex:(NSInteger)index;
|
|
|
3.3.2 主动方法(可选)
|
|
|
```
|
|
|
|
|
|
3.3.2 主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 获取文档区域内白板或者文档本身的宽高比,返回值即为宽高比,做屏幕适配用
|
|
|
*/
|
|
|
- (CGFloat)getDocAspectRatio;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 改变文档区域大小,主要用在文档生成后改变文档窗口的frame
|
|
|
*/
|
|
|
- (void)changeDocFrame:(CGRect) docFrame;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 改变文档父窗口
|
|
|
*/
|
|
|
- (void)changeDocParent:(UIView *) docParent;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 切换当前的文档模式
|
|
|
* 1.切换至跟随模式(默认值)值为0,
|
|
|
* 2.切换至自由模式;值为1,
|
|
|
*/
|
|
|
- (void)changeDocMode:(NSInteger)mode;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 查找并获取当前文档的信息
|
|
|
* @param docId 文档的docId
|
... | ... | @@ -923,7 +967,7 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
- (void)docReload;
|
|
|
/**
|
|
|
改变文档背景颜色
|
|
|
|
|
|
|
|
|
@param hexColor 字符串,传颜色的HEXColor 如:#000000
|
|
|
*/
|
|
|
- (void)changeDocWebColor:(NSString *)hexColor;
|
... | ... | @@ -950,11 +994,15 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* 3 = 等比填充:PPT内容保持原始比例,以横向或纵向适应显示区域,另一方向将会超出显示区域,超出部分会被裁减,不会存在黑边
|
|
|
*/
|
|
|
- (void)changeDocPPTScalingMode:(NSInteger)pptScalingMode;
|
|
|
3.4 房间信息
|
|
|
```
|
|
|
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
## 3.4 房间信息
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 获取房间信息,主要是要获取直播间模版来类型,根据直播间模版类型来确定界面布局
|
|
|
* 房间简介:dic[@"desc"];
|
... | ... | @@ -968,7 +1016,7 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* 模版类型为6: 聊天互动: 无 直播文档: 无 直播问答: 有
|
|
|
*/
|
|
|
-(void)roomInfo:(NSDictionary *)dic;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 服务器端给自己设置的信息
|
|
|
* viewerId 服务器端给自己设置的UserId
|
... | ... | @@ -991,11 +1039,13 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @brief 服务器端给自己设置的UserId
|
|
|
*/
|
|
|
-(void)setMyViewerId:(NSString *)viewerId;
|
|
|
3.5 聊天功能
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
## 3.5 聊天功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 历史聊天数据 (会多次回调)
|
|
|
* @param chatLogArr [{ chatId //聊天ID
|
... | ... | @@ -1075,9 +1125,11 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @param model BanChatModel 详情
|
|
|
*/
|
|
|
- (void)HDBanChatBroadcastWithModel:(BanChatModel *)model;
|
|
|
主动方法(可选)
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 发送公聊信息
|
|
|
* @param message 发送的消息内容
|
... | ... | @@ -1093,11 +1145,15 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* completion 发送回调 成功或者失败
|
|
|
*/
|
|
|
- (void)sendChatMessage:(NSString *)message completion:(void (^)(BOOL success))completion;
|
|
|
3.6 问答功能
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
|
|
|
## 3.6 问答功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 收到提问,用户观看时和主讲的互动问答信息
|
|
|
* @param questionDic { groupId //分组ID
|
... | ... | @@ -1144,19 +1200,25 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @brief 发布问答的id
|
|
|
*/
|
|
|
- (void)publish_question:(NSString *)publishId;
|
|
|
主动方法(可选)
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 提问
|
|
|
* @param message 提问内容
|
|
|
*/
|
|
|
- (void)question:(NSString *)message;
|
|
|
3.7 连麦功能
|
|
|
```
|
|
|
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
## 3.7 连麦功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 本房间为允许连麦的房间,会回调此方法,在此方法中主要设置UI的逻辑,
|
|
|
* 在断开推流,登录进入直播间和改变房间是否允许连麦状态的时候,都会回调此方法
|
... | ... | @@ -1185,11 +1247,12 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @brief 主播端发送断开连麦的消息,收到此消息后做断开连麦操作
|
|
|
*/
|
|
|
-(void)speak_disconnect:(BOOL)isAllow;
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 设置远程连麦窗口的大小,连麦成功后调用才生效,连麦不成功调用不生效
|
|
|
*/
|
... | ... | @@ -1219,20 +1282,26 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @brief 观看端主动断开连麦时候需要调用的接口
|
|
|
*/
|
|
|
- (void)disConnectSpeak;
|
|
|
|
|
|
3.8 切换线路和清晰度
|
|
|
|
|
|
代理方法(可选)
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 3.8 切换线路和清晰度
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 房间的音视频线路
|
|
|
* @param model LineModel 详情
|
|
|
*/
|
|
|
- (void)HDReceivedVideoAudioLinesWithModel:(LineModel *)model;
|
|
|
主动方法(可选)
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 切换线路 监听HDReceivedVideoAudioLinesWithModel代理获取线路/清晰度等信息
|
|
|
* @param quality 清晰度 0-原画;200-流畅;300-标清;音频传空字符串
|
... | ... | @@ -1243,11 +1312,15 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* }
|
|
|
*/
|
|
|
- (void)changeLineWithQuality:(NSString *)quality Stream:(NSInteger)stream completion:(void (^)(NSDictionary * results))completion;
|
|
|
3.9 答题卡功能
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
|
|
|
## 3.9 答题卡功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 开始答题
|
|
|
*/
|
... | ... | @@ -1301,9 +1374,12 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
}
|
|
|
*/
|
|
|
-(void)hdReceivedEndPunchWithDict:(NSDictionary *)dic;
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 答单选题
|
|
|
*/
|
... | ... | @@ -1313,11 +1389,15 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
@param IndexArray [题目index,题目index] 例:[1,2]
|
|
|
*/
|
|
|
-(void)reply_vote_multiple:(NSMutableArray *)indexArray;
|
|
|
3.10 问卷功能
|
|
|
```
|
|
|
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
## 3.10 问卷功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 发布问卷
|
|
|
*/
|
... | ... | @@ -1352,9 +1432,11 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @brief 问卷功能
|
|
|
*/
|
|
|
- (void)questionnaireWithTitle:(NSString *)title url:(NSString *)url;
|
|
|
主动方法(可选)
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 提交问卷结果
|
|
|
* @param dic{subjectsAnswer[{selectedOptionId //选中选项ID
|
... | ... | @@ -1365,11 +1447,15 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @brief 主动请求问卷
|
|
|
*/
|
|
|
-(void)getPublishingQuestionnaire;
|
|
|
3.11 广播功能
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
|
|
|
## 3.11 广播功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 接收到发送的广播
|
|
|
* @param dic {content //广播内容
|
... | ... | @@ -1388,7 +1474,7 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
}]
|
|
|
*/
|
|
|
- (void)broadcastLast_msg:(NSArray *)array;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 删除广播
|
|
|
* @param dic 删除数据
|
... | ... | @@ -1396,26 +1482,32 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
id //广播id }
|
|
|
*/
|
|
|
- (void)broadcast_delete:(NSDictionary *)dic;
|
|
|
|
|
|
3.12 签到功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 3.12 签到功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 开始签到
|
|
|
*/
|
|
|
- (void)start_rollcall:(NSInteger)duration;
|
|
|
主动方法(可选)
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 签到
|
|
|
*/
|
|
|
-(void)answer_rollcall;
|
|
|
/**
|
|
|
提交打卡
|
|
|
|
|
|
|
|
|
@param punchId 打卡id
|
|
|
*/
|
|
|
- (void)hdCommitPunchWithPunchId:(NSString *)punchId;
|
... | ... | @@ -1423,11 +1515,15 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
查询打卡信息
|
|
|
*/
|
|
|
- (void)hdInquirePunchInformation;
|
|
|
3.13 抽奖功能
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
|
|
|
## 3.13 抽奖功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 开始抽奖
|
|
|
*/
|
... | ... | @@ -1441,28 +1537,38 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @brief 退出抽奖
|
|
|
*/
|
|
|
- (void)stop_lottery;
|
|
|
3.14 修改昵称
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
|
|
|
## 3.14 修改昵称
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 修改昵称
|
|
|
*/
|
|
|
- (void)onChangeNickname:(NSString *)nickNime;
|
|
|
主动方法(可选)
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 修改昵称
|
|
|
* @param nickName 修改后的昵称
|
|
|
*/
|
|
|
- (void)changeNickName:(NSString *)nickName;
|
|
|
3.15 在线人数
|
|
|
```
|
|
|
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
## 3.15 在线人数
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 收到在线人数
|
|
|
*/
|
... | ... | @@ -1479,9 +1585,11 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
);
|
|
|
*/
|
|
|
-(void)onOnlineTeachers:(NSDictionary *)dic;
|
|
|
主动放法(可选)
|
|
|
```
|
|
|
|
|
|
主动放法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 获取在线房间人数,当登录成功后即可调用此接口,登录不成功或者退出登录后就不可以调用了,如果要求实时性比较强的话,可以写一个定时器,不断调用此接口,几秒钟发一次就可以,然后在代理回调函数中,处理返回的数据,15秒响应一次
|
|
|
*/
|
... | ... | @@ -1490,12 +1598,15 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
获取老师列表
|
|
|
*/
|
|
|
- (void)getOnlineTeachers;
|
|
|
```
|
|
|
|
|
|
3.16 随堂测功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
## 3.16 随堂测功能
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 接收到随堂测
|
|
|
* rseultDic 随堂测内容
|
... | ... | @@ -1524,7 +1635,7 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
*
|
|
|
*/
|
|
|
-(void)receivePracticeWithDic:(NSDictionary *) resultDic;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @brief 随堂测提交结果
|
|
|
* rseultDic 提交结果,调用commitPracticeWithPracticeId:(NSString *)practiceId options:(NSArray *)options后执行
|
... | ... | @@ -1593,9 +1704,11 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* "viewerId": 获奖用户ID
|
|
|
*/
|
|
|
-(void)prize_sendWithDict:(NSDictionary *)dic;
|
|
|
主动方法(可选)
|
|
|
```
|
|
|
|
|
|
主动方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 提交随堂测
|
|
|
* @param practiceId 随堂测ID
|
... | ... | @@ -1617,11 +1730,13 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
* @param practiceId 随堂测ID(没有传@"")
|
|
|
*/
|
|
|
-(void)getPracticeInformation:(NSString *)practiceId;
|
|
|
3.17 公告
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
## 3.17 公告
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 公告
|
|
|
*/
|
... | ... | @@ -1632,11 +1747,13 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
announcement //公告内容}
|
|
|
*/
|
|
|
- (void)on_announcement:(NSDictionary *)dict;
|
|
|
3.18 跑马灯
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
## 3.18 跑马灯
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 跑马灯
|
|
|
* @param dic action [{ //事件
|
... | ... | @@ -1661,11 +1778,13 @@ typedef NS_ENUM(NSUInteger, NEW_LOTTERY) { |
|
|
type //当前类型 text 文本 image 图片
|
|
|
*/
|
|
|
-(void)receivedMarqueeInfo:(NSDictionary *)dic;
|
|
|
3.19 播放器状态
|
|
|
```
|
|
|
|
|
|
播放器状态类型
|
|
|
## 3.19 播放器状态
|
|
|
|
|
|
播放器状态类型
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* 视频播放状态
|
|
|
* HDMoviePlaybackStateStopped 播放停止
|
... | ... | @@ -1683,7 +1802,7 @@ typedef NS_ENUM(NSUInteger, HDMoviePlaybackState) { |
|
|
HDMoviePlaybackStateSeekingForward,
|
|
|
HDMoviePlaybackStateSeekingBackward,
|
|
|
};
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 视频加载状态
|
|
|
* HDMovieLoadStateUnknown 未知状态
|
... | ... | @@ -1697,9 +1816,11 @@ typedef NS_ENUM(NSUInteger, HDMovieLoadState) { |
|
|
HDMovieLoadStatePlaythroughOK,
|
|
|
HDMovieLoadStateStalled,
|
|
|
};
|
|
|
代理方法(可选)
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 视频状态改变
|
|
|
* @param state
|
... | ... | @@ -1724,39 +1845,49 @@ typedef NS_ENUM(NSUInteger, HDMovieLoadState) { |
|
|
* @brief 播放器初始化完成 (会多次回调)
|
|
|
*/
|
|
|
- (void)HDMediaPlaybackIsPreparedToPlayDidChange:(NSDictionary *)dict;
|
|
|
3.20 视频缓存速度
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
## 3.20 视频缓存速度
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 视频加载速度
|
|
|
* @param speed 视频加载速度字符串
|
|
|
*/
|
|
|
- (void)onBufferSpeed:(NSString *)speed;
|
|
|
3.21 用户进出直播间提醒
|
|
|
```
|
|
|
|
|
|
代理方法(可选)
|
|
|
## 3.21 用户进出直播间提醒
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 用户进出直播间提示
|
|
|
* @param model RemindModel 详情
|
|
|
*/
|
|
|
- (void)HDUserRemindWithModel:(RemindModel *)model;
|
|
|
3.22 抽奖2.0功能 (该功能需单独开启)
|
|
|
```
|
|
|
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
## 3.22 抽奖2.0功能 (该功能需单独开启)
|
|
|
|
|
|
代理方法(可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 抽奖2.0 抽奖信息回调 (该功能需要单独开启)
|
|
|
* @param model NewLotteryMessageModel 详情
|
|
|
*/
|
|
|
- (void)HDOnLotteryWithModel:(NewLotteryMessageModel *)model;
|
|
|
主动方法 (可选)
|
|
|
```
|
|
|
|
|
|
主动方法 (可选)
|
|
|
|
|
|
```
|
|
|
/**
|
|
|
* @brief 抽奖2.0 查询抽奖状态
|
|
|
*/
|
... | ... | @@ -1769,9 +1900,13 @@ typedef NS_ENUM(NSUInteger, HDMovieLoadState) { |
|
|
* @param completion 请求结果回调
|
|
|
*/
|
|
|
- (void)commitLottery:(NSArray *)collectInfos lotteryId:(NSString *)lotteryId completion:(void (^)(BOOL success))completion;
|
|
|
4.常见问题
|
|
|
```
|
|
|
|
|
|
4.1 旋转屏错误
|
|
|
|
|
|
|
|
|
# 4.常见问题
|
|
|
|
|
|
## 4.1 旋转屏错误
|
|
|
|
|
|
常用的旋转屏方式
|
|
|
|
... | ... | @@ -1783,28 +1918,32 @@ typedef NS_ENUM(NSUInteger, HDMovieLoadState) { |
|
|
|
|
|
HD云直播的页面跳转均是采用模态形式跳转
|
|
|
|
|
|
|
|
|
```
|
|
|
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);
|
|
|
在每个控制器或者基类控制器设置旋转选项
|
|
|
```
|
|
|
|
|
|
在每个控制器或者基类控制器设置旋转选项
|
|
|
|
|
|
```
|
|
|
#pragma mark - 屏幕旋转
|
|
|
- (BOOL)shouldAutorotate{
|
|
|
return NO;//该旋转的页面自己变量控制
|
|
|
}
|
|
|
|
|
|
|
|
|
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
|
|
|
{
|
|
|
return UIInterfaceOrientationPortrait;
|
|
|
}
|
|
|
|
|
|
|
|
|
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
|
|
|
{
|
|
|
return UIInterfaceOrientationMaskPortrait;
|
|
|
}
|
|
|
4.2 Swift实现代理错误
|
|
|
```
|
|
|
|
|
|
## 4.2 Swift实现代理错误
|
|
|
|
|
|
```
|
|
|
//初始化
|
|
|
let parameter = PlayParameter.init()
|
|
|
/**
|
... | ... | @@ -1814,12 +1953,16 @@ HD云直播的页面跳转均是采用模态形式跳转 |
|
|
guard let player = RequestData else {
|
|
|
return}
|
|
|
player.delegate = self
|
|
|
4.3 查看手机日志
|
|
|
```
|
|
|
|
|
|
首先: 在AppDelegate中写如下代码(仅限CCSDK);
|
|
|
## 4.3 查看手机日志
|
|
|
|
|
|
首先: 在AppDelegate中写如下代码(仅限CCSDK);
|
|
|
|
|
|
```
|
|
|
[[SaveLogUtil sharedInstance]isNeedToSaveLog:YES];
|
|
|
```
|
|
|
|
|
|
第一步:选择Windows下面的Devices and Simulators
|
|
|
|
|
|
第二步:点击Devices and Simulators 会出现手机信息以及测试的INSTALLED APPS, 点击设置(齿轮图标) 会出现三个选项, 选择Download Container...
|
... | ... | @@ -1828,13 +1971,15 @@ player.delegate = self |
|
|
|
|
|
第四步:这里可以看到相关的请求信息和打印日志, 也可以判断错误原因
|
|
|
|
|
|
4.4 编译失败和打包上架打包失败
|
|
|
## 4.4 编译失败和打包上架打包失败
|
|
|
|
|
|
错误大意为
|
|
|
|
|
|
|
|
|
```
|
|
|
Failed to verify bitcode in xxxxx
|
|
|
error: Bundle only contains bitcode-marker /var/folders/s5/lnk362pd4cs0lmtn_43ppjzw0000gn/T/XcodeDistPipeline.2TS/Root/Payload/268YK.appxxxxxxxxxx (armv7)
|
|
|
```
|
|
|
|
|
|
解决办法:
|
|
|
|
|
|
第一步: xcode -> file -> Workspace Settings
|
... | ... | @@ -1843,13 +1988,15 @@ error: Bundle only contains bitcode-marker /var/folders/s5/lnk362pd4cs0lmtn_43pp |
|
|
|
|
|
第三步:Build System -> Legacy Build System
|
|
|
|
|
|
4.5 提交问卷的格式
|
|
|
## 4.5 提交问卷的格式
|
|
|
|
|
|
主动提交问卷这个方法参数格式
|
|
|
|
|
|
|
|
|
```
|
|
|
-(void)commitQuestionnaire:(NSDictionary *)dic
|
|
|
```
|
|
|
|
|
|
```
|
|
|
{
|
|
|
subjectsAnswer = (
|
|
|
{
|
... | ... | @@ -1869,3 +2016,5 @@ error: Bundle only contains bitcode-marker /var/folders/s5/lnk362pd4cs0lmtn_43pp |
|
|
}
|
|
|
);
|
|
|
}
|
|
|
```
|
|
|
|