> For the complete documentation index, see [llms.txt](https://polyv.gitbook.io/document/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://polyv.gitbook.io/document/docs/live/ios/2-kuai-su-ji-cheng.md).

# 以下是第三方依赖库，若需使用Demo源码且您项目中未引入，需添加

* [1 阅读准备](#_1-阅读准备)
* [2 环境要求](#_2-环境要求)
* [3 目录结构](#_3-目录结构)
* [4 场景模块集成](#_4-场景模块集成)
  * [4.1 导入通用模块(必须)](#_41-导入通用模块必须)
  * [4.2 云课堂场景模块集成(可选)](#_42-云课堂场景模块集成可选)
  * [4.3 直播带货场景模块集成(可选)](#_43-直播带货场景模块集成可选)
  * [4.4 手机开播场景模块集成(可选)](#_44-手机开播场景模块集成可选)
  * [4.5 互动学堂场景模块集成(可选)](#_45-互动学堂场景模块集成可选)
* [5 工程配置](#_5-工程配置)
  * [5.1 配置支持系统版本](#_51-配置支持系统版本)
  * [5.2 配置 App Transport Security (ATS)](#_52-配置-app-transport-security-ats)
  * [5.3 配置 Bitcode](#_53-配置-bitcode)
  * [5.4 配置隐私权限](#_54-配置隐私权限)
  * [5.5 配置设备旋转](#_55-配置设备旋转)
  * [5.6 配置 Podfile](#_56-配置-podfile)
* [6 初始化 SDK](#_6-初始化-sdk)
* [7 登录直播/回放及进入不同场景](#_7-登录直播回放及进入不同场景)
  * [7.1 观看端（云课堂场景/直播带货场景）](#_71-观看端（云课堂场景直播带货场景）)
  * [7.2 开播端（手机开播场景）](#_72-开播端（手机开播场景）)
  * [7.3 互动学堂场景](#_73-互动学堂场景)

#### 1 阅读准备

提前下载保利威多场景Demo，请先下载Demo。

准备好一个保利威账号，Demo中登录直播需要账号直播系统中的`appId`（应用ID），`appSecret`（应用密匙），`userId`（账号ID），`channelId`（频道号），登录回放再额外需要频道号对应回放列表里的`videoId`（回放视频id）。

#### 2 环境要求

| 名称        | 要求          |
| --------- | ----------- |
| iOS 系统    | iOS 12.0+   |
| CocoaPods | 1.7.0+      |
| 集成工具      | Xcode 11.0+ |

#### 3 目录结构

| 文件夹                      | 内容                           |
| ------------------------ | ---------------------------- |
| Demo                     | 演示如何初始化 SDK、如何登录进入不同场景       |
| PolyvLiveCloudClassScene | 云课堂场景模块，包含播放、聊天、连麦、互动等功能的演示  |
| PolyvLiveEcommerceScene  | 直播带货场景模块，包含播放、聊天、商品、打赏等功能的演示 |
| PolyvLiveStreamerScene   | 手机开播场景模块，包含推流、连麦、聊天、文档等功能的演示 |
| PolyvLiveCommonModule    | 通用模块，提供给各个场景实现所需依赖的基础库、工具类等  |

#### 4 场景模块集成

多场景 Demo 采用的是多个场景层（`PolyvLiveCloudClassScene`、`PolyvLiveEcommerceScene` 、`PolyvLiveStreamerScene`文件夹）加通用逻辑层（`PolyvLiveCommonModule` 文件夹）的方式集成。如下图：

![图 1](http://repo.polyv.net/ios/documents/resource/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90_1.png)

通用逻辑层，也叫 Common 层，本质是对保利威多场景 SDK 的封装的开源代码。旨在为客户提供更友好统一的API、实现更完整的业务功能。代码均跟多场景 SDK 一样，使用 `PLV` 前缀。关于 Common 层更多的介绍，详见文档 5-1至 5-7。

场景层，也叫 Scene 层，客户可以根据需要，集成具体的场景。Scene 层的代码，根据场景不同，会有不同的前缀进行区分。譬如，云课堂场景的代码前缀为 `PLVLC`，直播带货场景的代码前缀为 `PLVEC`，手机开播场景的代码前缀为 `PLVLS`。

**4.1 导入通用模块(必须)**

拷贝项目中的 `PolyvLiveCommonModule` 文件夹到你项目的根目录下。

**4.2 云课堂场景模块集成(可选)**

拷贝项目中的 `PolyvLiveCloudClassScene` 文件夹到你项目的根目录下。

**4.3 直播带货场景模块集成(可选)**

拷贝项目中的 `PolyvLiveEcommerceScene` 文件夹到你项目的根目录下。

**4.4 手机开播场景模块集成(可选)**

拷贝项目中的 `PolyvLiveStreamerScene` 文件夹到你项目的根目录下。

**4.5 互动学堂场景模块集成(可选)**

拷贝项目中的 `PolyvLiveHiClassScene` 文件夹到你项目的根目录下。

#### 5 工程配置

**5.1 配置支持系统版本**

打开项目的 TARGETS - General - Deployment Info，把 iOS 系统改为 9.0 或更高。

**5.2 配置 App Transport Security (ATS)**

打开项目的 `info.plist` 文件，添加如下内容：

```xml
<key>NSAppTransportSecurity</key>
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
</dict>
```

**5.3 配置 Bitcode**

打开项目的 TARGETS - Build Settings，搜索 `Enable Bitcode`，并设置为 NO。

**5.4 配置隐私权限**

连麦及聊天室的使用，需要获取用户设备的麦克风、摄像头、相册的访问、使用权限。

打开项目的 `info.plist` 文件，添加如下内容：

```xml
<key>NSCameraUsageDescription</key>
<string>请允许我们访问您的摄像头，以便您使用连麦、拍照功能</string>
<key>NSMicrophoneUsageDescription</key>
<string>请允许我们访问您的麦克风，以便您使用连麦功能</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>请允许我们访问您的相册，以便您保存图片到相册中</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>请允许我们访问您的相册，以便您使用发送图片消息、保存图片到相册的功能</string>
```

**5.5 配置设备旋转**

播放器支持全屏播放，需要在 TARGETS - General - Deployment Info 中，勾选支持的横屏旋转方向。

**5.6 配置 Podfile**

在 Podfile 文件中，添加以下内容：

```ruby
use_frameworks!
pod 'PLVLiveScenesSDK', '~> 1.0.0' # polyv 多场景 SDK
pod 'PLVImagePickerController', '~> 0.1.2' # 若不使用Demo源码，不需要添加
    
# 以下是第三方依赖库，若需使用Demo源码且您项目中未引入，需添加
pod 'SDWebImage', '4.4.0'
pod 'MJRefresh', '~> 3.5.0'
pod 'SVGAPlayer', '~> 2.3'

```

注意：

* 我们强烈建议您带上版本号，避免自动升级
* 我们建议使用[最新版本SDK](https://git.polyv.net/help-center/document-center/-/blob/master/live/ios/CHANGELOG/README.md)
* 不能遗漏 use\_frameworks!

#### 6 初始化 SDK

打开项目的 `AppDelegate` 文件，在 `-application:didFinishLaunchingWithOptions:` 方法中进行 SDK 功能配置：

```objective-c
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      // HttpDNS默认开启，如需关闭，解开注释
//    [PLVLiveVideoConfig sharedInstance].enableHttpDNS = NO;
      // 如需启用IPV6，解开注释，启用IPV6之后，将自动选择IP，取消HttpDNS
//    [PLVLiveVideoConfig sharedInstance].enableIPV6 = YES;
    return YES;
}
```

#### 7 登录直播/回放及进入不同场景

**7.1 观看端（云课堂场景/直播带货场景）**

进入不同场景的观看页前，需要先调用登录直播/回放的方法进行校验。登录校验的目的是检验参数是否正确，以及 SDK 内部会保存从登录接口获取到的一些信息。项目的通用模块提供了 `PLVRoomLoginClient` 进行直播/回放的登录和退登，接口定义如下：

```objective-c
/// 登录直播间
/// @param channelType 频道类型，若支持多种类型，可对多个频道类型枚举值使用 | 进行位或
/// @param channelId 频道号
/// @param userId 用户id
/// @param appId 应用id
/// @param appSecret 应用secret
/// @param roomUserHandler 返回带有默认值的观看用户实例对象，可在block中配置viewerId、viewerName、viewerAvatar属性
/// @param completion 登录成功，带上自定义参数对象，用户可在回调里面设置后台统计所需的自定义参数
/// @param failure 登录失败
+ (void)loginLiveRoomWithChannelType:(PLVChannelType)channelType
                           channelId:(NSString *)channelId
                              userId:(NSString *)userId
                               appId:(NSString *)appId
                           appSecret:(NSString *)appSecret
                            roomUser:(void(^ _Nullable)(PLVRoomUser *roomUser))roomUserHandler
                          completion:(void (^)(PLVViewLogCustomParam *customParam))completion
                             failure:(void (^)(NSString *errorMessage))failure;

/// 登录回放直播间
/// @param channelType 频道类型，若支持多种类型，可对多个频道类型枚举值使用 | 进行位或
/// @param channelId 频道号
/// @param vodList 是否请求点播列表视频，默认NO
/// @param vid 视频id（可不填，不填时加载回放/点播列表）
/// @param userId 用户id
/// @param appId 应用id
/// @param appSecret 应用secret
/// @param roomUserHandler 返回带有默认值的观看用户实例对象，可在block中配置viewerId、viewerName、viewerAvatar属性
/// @param completion 登录成功，带上自定义参数对象，用户可在回调里面设置后台统计所需的自定义参数
/// @param failure 登录失败
+ (void)loginPlaybackRoomWithChannelType:(PLVChannelType)channelType
                               channelId:(NSString *)channelId
                                 vodList:(BOOL)vodList
                                     vid:(NSString * _Nullable)vid
                                  userId:(NSString *)userId
                                   appId:(NSString *)appId
                               appSecret:(NSString *)appSecret
                                roomUser:(void(^ _Nullable)(PLVRoomUser *roomUser))roomUserHandler
                              completion:(void (^)(PLVViewLogCustomParam *customParam))completion
                                 failure:(void (^)(NSString *errorMessage))failure;

/// 离开直播间时调用
+ (void)logout;
```

登录过程中，观看者的相关信息可以通过回调 roomUserHandler 进行配置，登录的结果（成功跟失败）会通过 block 回调，可以在登录成功的回调中，选择进入所需的场景页。下面的例子展示了如何登录并进入云课堂场景的直播间页面，代码如下：

```objective-c
//登录直播
__weak typeof(self)weakSelf = self;
[PLVRoomLoginClient loginLiveRoomWithChannelType:PLVChannelTypePPT | PLVChannelTypeAlone
                                       channelId:channelId
                                          userId:userId
                                           appId:appId
                                       appSecret:appSecret
                                        roomUser:^(PLVRoomUser * _Nonnull roomUser) {
        // 可在此处配置自定义的登录用户ID、昵称、头像，不配则均使用默认值
//        roomUser.viewerId = @"用户ID";
//        roomUser.viewerName = @"用户昵称";
//        roomUser.viewerAvatar = @"用户头像";
} completion:^(PLVViewLogCustomParam * _Nonnull customParam) {
    // 登录成功，进入云课堂直播间
    PLVLCCloudClassViewController *cloudClassVC = [[PLVLCCloudClassViewController alloc] init];
    [weakSelf.navigationController pushViewController:cloudClassVC animated:YES];
} failure:^(NSString * _Nonnull errorMessage) {
    // 登录失败
}];
```

上述方法的具体用例可以在项目 Demo 文件夹中的 `PLVLoginViewController` 类中找到。

**7.2 开播端（手机开播场景）**

在进入手机开播页面前，需要先调用登录频道的方法进行校验。登录校验的目的是检验参数是否正确，以及保存从登录接口获取到的一些信息。项目的通用模块提供了 `PLVRoomLoginClient` 进行频道开播的登录，接口定义如下：

```objective-c
/// 登录三分屏开播直播间
/// @param channelType 频道类型，目前只支持 PLVChannelTypeAlone 或者 PLVChannelTypePPT
/// @param channelId 频道号
/// @param password 频道密码
/// @param completion 登录成功
/// @param failure 登录失败
+ (void)loginStreamerRoomWithChannelType:(PLVChannelType)channelType
                               channelId:(NSString *)channelId
                                password:(NSString *)password
                              completion:(void (^)(void))completion
                                 failure:(void (^)(NSString *errorMessage))failure;
```

登录验证的结果会通过 `completion` 或 `failure` block 回调，可以在登录成功的回调中，进入手机开播场景。下面示例如何登录频道并进入手机开播场景，代码如下：

```objective-c
//登录手机开播
__weak typeof(self)weakSelf = self;
[PLVRoomLoginClient loginStreamerRoomWithChannelType:PLVChannelTypePPT 
 										   channelId:channelId 
 										    password:passwordString 
 										  completion:^{
    // 登录成功，进入云课堂直播间
    PLVLSStreamerViewController *vctrl = [[PLVLSStreamerViewController alloc] init];
    vctrl.modalPresentationStyle = UIModalPresentationFullScreen;
    [weakSelf presentViewController:vctrl animated:YES completion:nil];
} failure:^(NSString * _Nonnull errorMessage) {
    // 登录失败
}];
```

上述方法的具体用例可以在项目 Demo 文件夹中的 `PLVLSLoginViewController` 类中找到。

**7.3 互动学堂场景**

互动学堂通过`token`验证机制进行用户身份识别，在进入互动学堂前，需要调用相应登录方法以获取 token。

`PLVLiveVClassAPI`分别提供了讲师和学生角色的登录方法进行互动学堂的登录，接口定义如下：

```objective-c
/// 互动学堂讲师登录接口
/// @param mobile 讲师11位手机号
/// @param password 讲师密码
/// @param code 区号，可为空，默认+86
/// @param userId 机构Id，可为空，讲师重复时不可为空
/// @param mutipleCompanyHandler 讲师重复时，触发该block，返回讲师所属机构列表
/// @param success 登录成功时，触发该block
/// @param failure 登录失败时，触发该block
+ (void)teacherLoginWithMobile:(NSString *)mobile
                      password:(NSString *)password
                          code:(NSString * _Nullable)code
                        userId:(NSString * _Nullable)userId
                mutipleCompany:(void (^)(NSArray *responseArray))mutipleCompanyHandler
                       success:(void (^)(NSDictionary *responseDict, NSArray *lessonArray))success
                       failure:(void (^)(NSError *error))failure;
   
/// 互动学堂讲师登录接口
/// 无条件观看接口，课程号与课节ID必须一个不为空
/// @param courseCode 课程号
/// @param lessonId 课节ID
/// @param name 昵称
/// @param successHandler 调用成功时，触发该block
/// @param failureHandler 调用失败时，触发该block
+ (void)watcherVerifyNoneWithCourseCode:(NSString * _Nullable)courseCode
                               lessonId:(NSString * _Nullable)lessonId
                                   name:(NSString *)name
                                success:(void (^)(NSDictionary *responseDict, NSArray *lessonArray))successHandler
                                failure:(void (^)(NSError *error))failureHandler;

/// 验证码观看接口，课程号与课节ID必须一个不为空
/// @param courseCode 课程号
/// @param lessonId 课节ID
/// @param name 昵称
/// @param code 验证码
/// @param successHandler 调用成功时，触发该block
/// @param failureHandler 调用失败时，触发该block
+ (void)watcherVerifyCodeWithCourseCode:(NSString * _Nullable)courseCode
                               lessonId:(NSString * _Nullable)lessonId
                                   name:(NSString *)name
                                   code:(NSString *)code
                                success:(void (^)(NSDictionary *responseDict, NSArray *lessonArray))successHandler
                                failure:(void (^)(NSError *error))failureHandler;

/// 白名单观看接口，课程号与课节ID必须一个不为空
/// @param courseCode 课程号
/// @param lessonId 课节ID
/// @param studentCode 学生码
/// @param successHandler 调用成功时，触发该block
/// @param failureHandler 调用失败时，触发该block
+ (void)watcherVerifyWhiteListWithCourseCode:(NSString * _Nullable)courseCode
                                    lessonId:(NSString * _Nullable)lessonId
                                 studentCode:(NSString *)studentCode
                                     success:(void (^)(NSDictionary *responseDict, NSArray *lessonArray))successHandler
                                     failure:(void (^)(NSError *error))failureHandler;                       
```

上述方法的具体用例可以在PolyvLiveHiClassDemo项目中`PLVHCTeacherLoginViewController`和`PLVHCStudentLoginViewController`类找到。
