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

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 采用的是多个场景层(PolyvLiveCloudClassScenePolyvLiveEcommerceScenePolyvLiveStreamerScene文件夹)加通用逻辑层(PolyvLiveCommonModule 文件夹)的方式集成。如下图:

通用逻辑层,也叫 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 文件,添加如下内容:

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

5.3 配置 Bitcode

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

5.4 配置隐私权限

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

打开项目的 info.plist 文件,添加如下内容:

<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 文件中,添加以下内容:

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

  • 不能遗漏 use_frameworks!

6 初始化 SDK

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

- (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 进行直播/回放的登录和退登,接口定义如下:

/// 登录直播间
/// @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 回调,可以在登录成功的回调中,选择进入所需的场景页。下面的例子展示了如何登录并进入云课堂场景的直播间页面,代码如下:

//登录直播
__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 进行频道开播的登录,接口定义如下:

/// 登录三分屏开播直播间
/// @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;

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

//登录手机开播
__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分别提供了讲师和学生角色的登录方法进行互动学堂的登录,接口定义如下:

/// 互动学堂讲师登录接口
/// @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项目中PLVHCTeacherLoginViewControllerPLVHCStudentLoginViewController类找到。

Last updated