iOS JVaas SDK API文档
最近更新:2021-12-15

iOS JVaas SDK API文档

Vaas

一、 SDK接口类说明

  1. JVSService:包含SDK功能服务的大部分接口。
  2. JVSVideoDelegate: 视频流页面的代理回调,包含三个方面的回调。一个是视频播放相关事件,包含开始播放、暂停、播放结束、播放失败、;另个一个方面是用户对视频操作相关行为回调,包含点赞、取消点赞、分享;还有一个方面是广告相关的回调,包含,广告展现、广告点击、广告获取成功、广告获取失败。
  3. JVSRootViewController:横视频UI页入口,带频道和水平导航的UI,UIViewController类型,可以方便的嵌入用户App中,频道里面是feed流视频列表。
  4. JVSFeeJVSFeedListViewController:某单一频道fee流页面。
  5. JVSLittleVideoViewController: 类似抖音的竖屏视频页面。
  6. JVSLittleVideoListController:小视频瀑布流布局,类似快手的竖屏视频列表页面。
  7. JVSLittleVideoWaterFallViewController:小视频瀑布流布局,类似快手的竖屏视频列表页面,不规则。
  8. JVSFeedVideoData:单个视频具体信息类
  9. JVSVideoProvider:视频内容提供者类
  10. JVSUIConfig:UI界面配置类,设置视频UI界面
  11. JVSDoubleLittleVideoViewController: 类似抖音的竖屏视频页面+关注页面。

1.1 在使用SDK的类中添加引用:

只需在类中添加如下引用即可使用SDK所有功能,无需引用JVSService等对应的类。

OC项目: #import <JVaasContent/JVaasContent-Swift.h>

Swift项目: import JVaasContent

1.2 初始化SDK及SDK配置等

在程序刚启动时, 调JVaasContent SDK其他功能之前,调初始化代码。

/// 初始化SDK /// - Parameters: /// - appkey: 极光平台申请的appkey /// - channelId: 渠道id JVSService.setAppkey(appkey: "您在极光官网申请的Appkey", channelId: "apple") /** 保存用户标签 @param uid:用户id @param userInfo:用户信息 示例: { "gender": "1", 0-未知,1-男性,2-女性 "age": "18,28" 年龄所在的区间段,以逗号分隔,年龄段的开始和结束值可以相同 } */ JVSService.setUserTag(uid:"",userInfo:["gender": "1", "age":"18"]) /// 检查业务是否可用,回调结果有缓存,24小时更新一次,setAppkey接口调用之后使用才生效。 /// - Parameter callBack: 回调信息,result 是否可用,eror错误信息 JVSService.checkBussinessEnable { (result, eror) in }
              /// 初始化SDK
    /// - Parameters:
    ///   - appkey: 极光平台申请的appkey
    ///   - channelId: 渠道id
    JVSService.setAppkey(appkey: "您在极光官网申请的Appkey", channelId: "apple")
    
        /**
     保存用户标签
     @param uid:用户id
     @param userInfo:用户信息
        示例:
        {
            "gender": "1",     0-未知,1-男性,2-女性
            "age": "18,28"    年龄所在的区间段,以逗号分隔,年龄段的开始和结束值可以相同
        }
     */

    JVSService.setUserTag(uid:"",userInfo:["gender": "1", "age":"18"])
    
    /// 检查业务是否可用,回调结果有缓存,24小时更新一次,setAppkey接口调用之后使用才生效。
    /// - Parameter callBack: 回调信息,result 是否可用,eror错误信息
    JVSService.checkBussinessEnable { (result, eror) in
            
    }

        
此代码块在浮窗中显示

1.3 接入用户系统

/// 用户登录接口 /// - Parameters: /// - nickname: 昵称 /// - avatar: 头像 url地址 /// - phone: 手机号 /// - userid: 用户 id /// - callback: 结果回调,成功失败,msg详细信息 JVSService.login(nickname: "Alan", avatar: "头像 url地址", phone: ""手机号,未传手机号不可评论", userid: "用户ID") { (result, msg) in } // 用户退出登录 JVSService.logout() // 查询用户登录状态 BOOL isLogin = JVSService.isLogin // 切换用户时单独调用 JVSService.setUid("xxx")
              /// 用户登录接口
    /// - Parameters:
    ///   - nickname: 昵称
    ///   - avatar: 头像 url地址
    ///   - phone: 手机号
    ///   - userid: 用户 id
    ///   - callback: 结果回调,成功失败,msg详细信息

    JVSService.login(nickname: "Alan", avatar: "头像 url地址", phone: ""手机号,未传手机号不可评论", userid: "用户ID") { (result, msg) in
            
    }
    
    // 用户退出登录
    JVSService.logout()
    // 查询用户登录状态
    BOOL isLogin = JVSService.isLogin
    
    // 切换用户时单独调用
    JVSService.setUid("xxx")


        
此代码块在浮窗中显示

1.4嵌入UI

接入JVSRootViewController、JVSLittleVideoViewController、JVSDoubleLittleVideoViewController等类时,建议使用childViewController的方式接入,以便调整frame来快速适配不同的项目结构。

// 为兼容iOS9设备中,scrollView特定情况下自动向下偏移一段距离的问题,建议使用时在viewController中加入以下代码 self.automaticallyAdjustsScrollViewInsets = NO;
          // 为兼容iOS9设备中,scrollView特定情况下自动向下偏移一段距离的问题,建议使用时在viewController中加入以下代码
self.automaticallyAdjustsScrollViewInsets = NO;

        
此代码块在浮窗中显示
1.4.1 自定义UI设置

JVSUIConfig是UI界面配置类,设置视频UI界面可以通过下面的示例配置

// CP信息页是否显示关注按钮(默认隐藏) JVSUIConfig.showFollow = true; /*----------------- 横版视频配置项 -----------------*/ // 播放页类型(默认:相关视频;局部信息流不支持当前页播放形式) JVSUIConfig.playPageType = .relation // 是否响应点击头像跳转CP页(默认响应) JVSUIConfig.cpInfoResponse = true // 评论展示类型(默认不显示) JVSUIConfig.commentType = .none // 是否显示分享按钮(默认不显示) JVSUIConfig.showShare = true /*----------------- 竖版视频配置项 -----------------*/ // 评论展示类型(默认不显示) JVSUIConfig.littleCommentType = .none // 播放器填充类型(默认resizeAspect) JVSUIConfig.playerContentMode = .resizeAspectFill // 点赞等按钮位于底部(默认右边) JVSUIConfig.bottomPanel = false; // 是否显示分享按钮(默认不显示) JVSUIConfig.littleShowShare = true // 是否响应点击头像跳转CP页(默认响应) JVSUIConfig.littleCpInfoResponse = true
          
// CP信息页是否显示关注按钮(默认隐藏)
JVSUIConfig.showFollow = true;
/*-----------------  横版视频配置项  -----------------*/
// 播放页类型(默认:相关视频;局部信息流不支持当前页播放形式)
JVSUIConfig.playPageType = .relation
// 是否响应点击头像跳转CP页(默认响应)
JVSUIConfig.cpInfoResponse = true
// 评论展示类型(默认不显示)
JVSUIConfig.commentType = .none
// 是否显示分享按钮(默认不显示)
JVSUIConfig.showShare = true

/*-----------------  竖版视频配置项  -----------------*/
// 评论展示类型(默认不显示)
JVSUIConfig.littleCommentType = .none
// 播放器填充类型(默认resizeAspect)
JVSUIConfig.playerContentMode = .resizeAspectFill
// 点赞等按钮位于底部(默认右边)
JVSUIConfig.bottomPanel = false;
// 是否显示分享按钮(默认不显示)
JVSUIConfig.littleShowShare = true
// 是否响应点击头像跳转CP页(默认响应)
JVSUIConfig.littleCpInfoResponse = true

        
此代码块在浮窗中显示
1.4.2 嵌入多个频道导航的类:JVSRootViewController
1.4.2.1 添加 rootViewController
var channelVC: JVSRootViewController! //// delegate 是横版视频状态等回调信息(详见3.6),self 是UIViewController的一个实例 self.channelVC = JVSService.getChannelListViewController(delegate: self) self.channelVC.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) self.view.addSubview((self.channelVC.view)!) self.addChild(self.channelVC);
          var channelVC: JVSRootViewController!
//// delegate 是横版视频状态等回调信息(详见3.6),self 是UIViewController的一个实例
self.channelVC =  JVSService.getChannelListViewController(delegate: self) 

self.channelVC.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
self.view.addSubview((self.channelVC.view)!) self.addChild(self.channelVC);

        
此代码块在浮窗中显示
1.4.2.2 feed流滑动控制

控制feed流滑动到顶部,并设置是否刷新feed数据。

self.channelVC.scrollToTop(pullRefresh: false)
          self.channelVC.scrollToTop(pullRefresh: false)

        
此代码块在浮窗中显示
1.4.3 单一频道类:JVSFeeJVSFeedListViewController
1.4.3.1 添加单个频道
var channel: JVSFeeJVSFeedListViewController! //// delegate 是横版视频状态等回调信息(详见3.6),self 是UIViewController的一个实例 self.channel = JVSService.getOneChannelViewController(delegate: self) self.channel.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) self.view.addSubview((self.channel.view)!) self.addChild(self.channel); channel.channelID = "23e234"
          var channel: JVSFeeJVSFeedListViewController!
//// delegate 是横版视频状态等回调信息(详见3.6),self 是UIViewController的一个实例
self.channel = JVSService.getOneChannelViewController(delegate: self)
self.channel.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
self.view.addSubview((self.channel.view)!)
self.addChild(self.channel);
channel.channelID = "23e234"

        
此代码块在浮窗中显示
1.4.3.2 feed流滑动控制:同4.2.1
self.channel.scrollToTop(pullRefresh: false)
          self.channel.scrollToTop(pullRefresh: false)

        
此代码块在浮窗中显示
1.4.4 横版视频状态等回调信息:JVSVideoDelegate
//视频开始播放(isAD: 是否是广告) func playerStart(videoInfo: JVSFeedVideoData, isAD: Bool) { print(">>>>>>>>> playerStart videoID:\(videoInfo.video_id ?? "")") } // 视频播放暂停状态变化 func playerPause(videoInfo: JVSFeedVideoData, isPause: Bool, isAD: Bool) { print(">>>>>>>>> playerPause videoID:\(videoInfo.video_id ?? "") isPause:\(isPause)") logData.append("\(isPause ? "视频暂停" : "视频播放")") logTableView.reloadData() } // 视频播放结束 func playerEnd(videoInfo: JVSFeedVideoData, isAD: Bool) { print(">>>>>>>>> playerEnd videoID:\(videoInfo.video_id ?? "")") } // 视频播放失败 func playerError(videoInfo: JVSFeedVideoData, error: Error?, isAD: Bool) { print(">>>>>>>>> playerError videoID:\(videoInfo.video_id ?? "")") } //点击分享按钮(isMain: 竖版视频用来标记是否是首页,仅首页支持负反馈功能) func clickShareBtn(videoInfo: JVSFeedVideoData, isMain: Bool) { if isMain { self.channelVC.disLikeVideo(feed: videoInfo) } print(">>>>>>>>> clickShareBtn videoID:\(videoInfo.video_id ?? "") isMain: \(isMain)") } // 点赞(isPraise:true - 点赞,false - 取消点赞) func clickPraiseBtn(videoInfo: JVSFeedVideoData, isPraise: Bool, isAD: Bool) { print(">>>>>>>>> clickPraiseBtn videoID:\(videoInfo.video_id ?? "") isPraise: \(isPraise)") logData.append("\(isPraise ? "点赞" : "取消点赞")") logTableView.reloadData() } // 进入CP页 func gotoCPPage(videoInfo: JVSFeedVideoData) { print(">>>>>>>>> gotoCPPage cpID:\(videoInfo.provider?.id ?? "")") logData.append("进入CP页") logTableView.reloadData() UIApplication.shared.windows.last?.addSubview(logTableView) } // 进入播放页 func gotoPlayerPage(videoInfo: JVSFeedVideoData) { print(">>>>>>>>> gotoPlayerPage videoID:\(videoInfo.video_id ?? "")") logData.append("进入播放页") logTableView.reloadData() UIApplication.shared.windows.last?.addSubview(logTableView) } // 进入Feed页 func gotoFeedPage(channelID: String) { logData.append("进入feed页:\(channelID)") logTableView.reloadData() } //广告展现 func adShowWith(ylID: String, reqId: String, type: Int) { print(">>>>>>>>> adShow ylid: \(ylID) reqid: \(reqId) type: \(type)") } // 广告被点击 func adClickWith(ylID: String, reqId: String, type: Int) { print(">>>>>>>>> adClick ylid: \(ylID) reqid: \(reqId) type: \(type)") }
              //视频开始播放(isAD: 是否是广告)
    func playerStart(videoInfo: JVSFeedVideoData, isAD: Bool) {
        print(">>>>>>>>> playerStart videoID:\(videoInfo.video_id ?? "")")
    }
    // 视频播放暂停状态变化
    func playerPause(videoInfo: JVSFeedVideoData, isPause: Bool, isAD: Bool) {
        print(">>>>>>>>> playerPause videoID:\(videoInfo.video_id ?? "")  isPause:\(isPause)")
        logData.append("\(isPause ? "视频暂停" : "视频播放")")
        logTableView.reloadData()
    }
    // 视频播放结束
    func playerEnd(videoInfo: JVSFeedVideoData, isAD: Bool) {
        print(">>>>>>>>> playerEnd videoID:\(videoInfo.video_id ?? "")")
    }
    // 视频播放失败
    func playerError(videoInfo: JVSFeedVideoData, error: Error?, isAD: Bool) {
        print(">>>>>>>>> playerError videoID:\(videoInfo.video_id ?? "")")
    }
    //点击分享按钮(isMain: 竖版视频用来标记是否是首页,仅首页支持负反馈功能)
    func clickShareBtn(videoInfo: JVSFeedVideoData, isMain: Bool) {
        if isMain {
            self.channelVC.disLikeVideo(feed: videoInfo)
        }
        print(">>>>>>>>> clickShareBtn videoID:\(videoInfo.video_id ?? "")  isMain: \(isMain)")
    }
    // 点赞(isPraise:true - 点赞,false - 取消点赞)
    func clickPraiseBtn(videoInfo: JVSFeedVideoData, isPraise: Bool, isAD: Bool) {
        print(">>>>>>>>> clickPraiseBtn videoID:\(videoInfo.video_id ?? "")  isPraise: \(isPraise)")
        logData.append("\(isPraise ? "点赞" : "取消点赞")")
        logTableView.reloadData()
    }
    // 进入CP页
    func gotoCPPage(videoInfo: JVSFeedVideoData) {
        print(">>>>>>>>> gotoCPPage cpID:\(videoInfo.provider?.id ?? "")")
        logData.append("进入CP页")
        logTableView.reloadData()
        UIApplication.shared.windows.last?.addSubview(logTableView)
    }
    // 进入播放页
    func gotoPlayerPage(videoInfo: JVSFeedVideoData) {
        print(">>>>>>>>> gotoPlayerPage videoID:\(videoInfo.video_id ?? "")")
        logData.append("进入播放页")
        logTableView.reloadData()
        UIApplication.shared.windows.last?.addSubview(logTableView)
    }
    // 进入Feed页
    func gotoFeedPage(channelID: String) {
        logData.append("进入feed页:\(channelID)")
        logTableView.reloadData()
    }
    //广告展现
    func adShowWith(ylID: String, reqId: String, type: Int) {
        print(">>>>>>>>> adShow ylid: \(ylID)  reqid: \(reqId)  type: \(type)")
    }
    // 广告被点击
    func adClickWith(ylID: String, reqId: String, type: Int) {
        print(">>>>>>>>> adClick ylid: \(ylID)  reqid: \(reqId)  type: \(type)")
    }

        
此代码块在浮窗中显示
1.4.5 类似抖音的竖屏视频页面:JVSLittleVideoViewController
var doubleLittleVideoViewController: JVSLittleVideoViewController! // delegate小视频视频状态及广告加载等回调信息(详见4.7),self是UIviewController的一个实例 littleVc = JVSService.getLittleVideoViewController(delegate: self) littleVc!.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height - statusBarHeight - gSafeAreaInsets.bottom - 49) self.view.addSubview(littleVc.view) self.addChild(littleVc)
              var doubleLittleVideoViewController: JVSLittleVideoViewController!
    // delegate小视频视频状态及广告加载等回调信息(详见4.7),self是UIviewController的一个实例
    littleVc = JVSService.getLittleVideoViewController(delegate: self)
        
    littleVc!.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height - statusBarHeight - gSafeAreaInsets.bottom - 49)
    self.view.addSubview(littleVc.view)
    self.addChild(littleVc)

        
此代码块在浮窗中显示
1.4.6 类似快手的竖屏视频列表页面+关注页面:JVSDoubleLittleVideoViewController
var doubleLittleVideoViewController:JVSDoubleLittleVideoViewController! self.doubleLittleVideoViewController = JVSService.getDoubleLittleVideoViewController(delegate: self) doubleLittleVideoViewController!.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height - gSafeAreaInsets.bottom - 49) self.view.addSubview(doubleLittleVideoViewController.view) self.addChild(doubleLittleVideoViewController)
              var doubleLittleVideoViewController:JVSDoubleLittleVideoViewController!

    self.doubleLittleVideoViewController = JVSService.getDoubleLittleVideoViewController(delegate: self)
    doubleLittleVideoViewController!.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height  - gSafeAreaInsets.bottom - 49)
    self.view.addSubview(doubleLittleVideoViewController.view)
    self.addChild(doubleLittleVideoViewController)

        
此代码块在浮窗中显示
1.4.7 类似快手的竖屏视频列表页面:JVSLittleVideoListController
var littleListVc: JVSLittleVideoListController! // delegate 小视频视频状态及广告加载等回调信息(详见4.7) littleListVc = JVSService.getLittleListVideoViewController(delegate: self) littleListVc!.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height - statusBarHeight - gSafeAreaInsets.bottom - 49) self.view.addSubview(littleListVc.view) self.addChild(littleListVc)
              var littleListVc: JVSLittleVideoListController!

    // delegate 小视频视频状态及广告加载等回调信息(详见4.7)
    littleListVc = JVSService.getLittleListVideoViewController(delegate: self) 
    littleListVc!.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height - statusBarHeight - gSafeAreaInsets.bottom - 49)
    self.view.addSubview(littleListVc.view)
    self.addChild(littleListVc)

        
此代码块在浮窗中显示
1.4.8 小视频视频状态及广告加载等回调信息:JVSVideoDelegate
// 首个视频开始播放(isAD: 是否是广告) func firstPlayerStart(videoInfo: JVSFeedVideoData, isAD: Bool) { print(">>>>>>>>> firstPlayerStart videoID:\(videoInfo.video_id ?? "")") } //视频开始播放(isAD: 是否是广告) func playerStart(videoInfo: JVSFeedVideoData, isAD: Bool) { print(">>>>>>>>> playerStart videoID:\(videoInfo.video_id ?? "")") } // 视频播放暂停状态变化 func playerPause(videoInfo: JVSFeedVideoData, isPause: Bool, isAD: Bool) { print(">>>>>>>>> playerPause videoID:\(videoInfo.video_id ?? "") isPause:\(isPause)") logData.append("\(isPause ? "视频暂停" : "视频播放")") logTableView.reloadData() } // 视频播放结束 func playerEnd(videoInfo: JVSFeedVideoData, isAD: Bool) { print(">>>>>>>>> playerEnd videoID:\(videoInfo.video_id ?? "")") } // 视频播放失败 func playerError(videoInfo: JVSFeedVideoData, error: Error?, isAD: Bool) { print(">>>>>>>>> playerError videoID:\(videoInfo.video_id ?? "")") } // 广告信息获取成功 func ylADInfoLoadSuccess(adID: String) { print(">>>>>>>>> ylADInfoLoadSuccess videoID:\(adID)") } //广告信息获取失败 func ylADInfoLoadFail(adID: String, error: Error?) { print(">>>>>>>>> ylADInfoLoadFail videoID:\(adID)") } //点击分享按钮(isMain: 竖版视频用来标记是否是首页,仅首页支持负反馈功能) func clickShareBtn(videoInfo: JVSFeedVideoData, isMain: Bool) { if isMain { self.channelVC.disLikeVideo(feed: videoInfo) } print(">>>>>>>>> clickShareBtn videoID:\(videoInfo.video_id ?? "") isMain: \(isMain)") } // 点赞(isPraise:true - 点赞,false - 取消点赞) func clickPraiseBtn(videoInfo: JVSFeedVideoData, isPraise: Bool, isAD: Bool) { print(">>>>>>>>> clickPraiseBtn videoID:\(videoInfo.video_id ?? "") isPraise: \(isPraise)") logData.append("\(isPraise ? "点赞" : "取消点赞")") logTableView.reloadData() } // 进入CP页 func gotoCPPage(videoInfo: JVSFeedVideoData) { print(">>>>>>>>> gotoCPPage cpID:\(videoInfo.provider?.id ?? "")") logData.append("进入CP页") logTableView.reloadData() UIApplication.shared.windows.last?.addSubview(logTableView) } // 进入播放页 func gotoPlayerPage(videoInfo: JVSFeedVideoData) { print(">>>>>>>>> gotoPlayerPage videoID:\(videoInfo.video_id ?? "")") logData.append("进入播放页") logTableView.reloadData() UIApplication.shared.windows.last?.addSubview(logTableView) } // 进入Feed页 func gotoFeedPage(channelID: String) { logData.append("进入feed页:\(channelID)") logTableView.reloadData() } //广告展现 func adShowWith(ylID: String, reqId: String, type: Int) { print(">>>>>>>>> adShow ylid: \(ylID) reqid: \(reqId) type: \(type)") } // 广告被点击 func adClickWith(ylID: String, reqId: String, type: Int) { print(">>>>>>>>> adClick ylid: \(ylID) reqid: \(reqId) type: \(type)") }
           //   首个视频开始播放(isAD: 是否是广告) 
    func firstPlayerStart(videoInfo: JVSFeedVideoData, isAD: Bool) {
        print(">>>>>>>>> firstPlayerStart videoID:\(videoInfo.video_id ?? "")")
    }
    //视频开始播放(isAD: 是否是广告)
    func playerStart(videoInfo: JVSFeedVideoData, isAD: Bool) {
        print(">>>>>>>>> playerStart videoID:\(videoInfo.video_id ?? "")")
    }
    // 视频播放暂停状态变化
    func playerPause(videoInfo: JVSFeedVideoData, isPause: Bool, isAD: Bool) {
        print(">>>>>>>>> playerPause videoID:\(videoInfo.video_id ?? "")  isPause:\(isPause)")
        logData.append("\(isPause ? "视频暂停" : "视频播放")")
        logTableView.reloadData()
    }
    // 视频播放结束
    func playerEnd(videoInfo: JVSFeedVideoData, isAD: Bool) {
        print(">>>>>>>>> playerEnd videoID:\(videoInfo.video_id ?? "")")
    }
    // 视频播放失败
    func playerError(videoInfo: JVSFeedVideoData, error: Error?, isAD: Bool) {
        print(">>>>>>>>> playerError videoID:\(videoInfo.video_id ?? "")")
    }
    // 广告信息获取成功
    func ylADInfoLoadSuccess(adID: String) {
        print(">>>>>>>>> ylADInfoLoadSuccess videoID:\(adID)")
    }
    //广告信息获取失败
    func ylADInfoLoadFail(adID: String, error: Error?) {
        print(">>>>>>>>> ylADInfoLoadFail videoID:\(adID)")
    }
    //点击分享按钮(isMain: 竖版视频用来标记是否是首页,仅首页支持负反馈功能)
    func clickShareBtn(videoInfo: JVSFeedVideoData, isMain: Bool) {
        if isMain {
            self.channelVC.disLikeVideo(feed: videoInfo)
        }
        print(">>>>>>>>> clickShareBtn videoID:\(videoInfo.video_id ?? "")  isMain: \(isMain)")
    }
    // 点赞(isPraise:true - 点赞,false - 取消点赞)
    func clickPraiseBtn(videoInfo: JVSFeedVideoData, isPraise: Bool, isAD: Bool) {
        print(">>>>>>>>> clickPraiseBtn videoID:\(videoInfo.video_id ?? "")  isPraise: \(isPraise)")
        logData.append("\(isPraise ? "点赞" : "取消点赞")")
        logTableView.reloadData()
    }
    // 进入CP页
    func gotoCPPage(videoInfo: JVSFeedVideoData) {
        print(">>>>>>>>> gotoCPPage cpID:\(videoInfo.provider?.id ?? "")")
        logData.append("进入CP页")
        logTableView.reloadData()
        UIApplication.shared.windows.last?.addSubview(logTableView)
    }
    // 进入播放页
    func gotoPlayerPage(videoInfo: JVSFeedVideoData) {
        print(">>>>>>>>> gotoPlayerPage videoID:\(videoInfo.video_id ?? "")")
        logData.append("进入播放页")
        logTableView.reloadData()
        UIApplication.shared.windows.last?.addSubview(logTableView)
    }
    // 进入Feed页
    func gotoFeedPage(channelID: String) {
        logData.append("进入feed页:\(channelID)")
        logTableView.reloadData()
    }
    //广告展现
    func adShowWith(ylID: String, reqId: String, type: Int) {
        print(">>>>>>>>> adShow ylid: \(ylID)  reqid: \(reqId)  type: \(type)")
    }
    // 广告被点击
    func adClickWith(ylID: String, reqId: String, type: Int) {
        print(">>>>>>>>> adClick ylid: \(ylID)  reqid: \(reqId)  type: \(type)")
    }

        
此代码块在浮窗中显示

1.5 局部信息流

1.5.1 获取实时热点视频
// 获取热门视频,详细参数参考API文档或者demo实现 JVSService.getHotVideoList(beginTime: 0, endTime: 0, videoType:type ,page: 1,size: 10) { (list,error) in if list.count == 0{ print("没有数据") }else{ self.data = list self.tableView.reloadData() } } override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { let video = self.data[indexPath.row] //视频展现上报 JVSService.reportVideoShowEvent(videoInfo: video, pos: indexPath.row) } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let video = self.data[indexPath.row] //播放视频 JVSService.openPlayer(videoType: self.type, videoData: video, viewController: self) //视频点击上报 JVSService.reportVideoClickEvent(videoInfo: video, pos: indexPath.row) }
          // 获取热门视频,详细参数参考API文档或者demo实现
JVSService.getHotVideoList(beginTime: 0, endTime: 0, videoType:type ,page: 1,size: 10) { (list,error) in
    if list.count == 0{
        print("没有数据")
    }else{
        self.data = list
        self.tableView.reloadData()
    }
}


override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let video = self.data[indexPath.row]
    //视频展现上报
    JVSService.reportVideoShowEvent(videoInfo: video, pos: indexPath.row)
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let video = self.data[indexPath.row]
    //播放视频
    JVSService.openPlayer(videoType: self.type, videoData: video, viewController: self)
    //视频点击上报
    JVSService.reportVideoClickEvent(videoInfo: video, pos: indexPath.row)
}


        
此代码块在浮窗中显示
1.5.2 单卡片信息流
//小视频单卡片,参数给定宽度,高度自适应,详细参数参考API文档或者demo实现 JVSService.showLittleVideoCard(width: width, delegate: self){ (card, error) in if error == .noError{ self.littleCard?.removeFromSuperview() self.littleCard = card let y = CGFloat(298.0) let x = (self.view.frame.size.width - width)/2 self.littleCard?.frame = CGRect.init(origin: CGPoint.init(x: x, y: y), size: CGSize.init(width: width,height: 300)) self.view.addSubview(self.littleCard!) }else{ print("网络错误") } } //横版feed视频单卡片,参数给定宽度,高度自适应,详细参数参考API文档,给定宽度高,度自适应 JVSService.showFeedCard(width: 300, delegate: self) { (card, error) in if error == .noError{ self.feedCard?.removeFromSuperview() self.feedCard = card let x = (self.view.frame.size.width - 300)/2 self.feedCard?.frame = CGRect.init(origin: CGPoint.init(x: x, y: 88), size: CGSize.init(width: 300,height: 200)) self.view.addSubview(self.feedCard!) }else{ print("网络错误") } }
          //小视频单卡片,参数给定宽度,高度自适应,详细参数参考API文档或者demo实现
JVSService.showLittleVideoCard(width: width, delegate: self){ (card, error) in
    if error == .noError{
        self.littleCard?.removeFromSuperview()
        self.littleCard = card
        let y = CGFloat(298.0)
        let x = (self.view.frame.size.width - width)/2
        self.littleCard?.frame = CGRect.init(origin: CGPoint.init(x: x, y: y), size: CGSize.init(width: width,height: 300))
        self.view.addSubview(self.littleCard!)
    }else{
        print("网络错误")
    }
}

//横版feed视频单卡片,参数给定宽度,高度自适应,详细参数参考API文档,给定宽度高,度自适应
JVSService.showFeedCard(width: 300, delegate: self) { (card, error) in
    if error == .noError{
        self.feedCard?.removeFromSuperview()
        self.feedCard = card
        let x = (self.view.frame.size.width - 300)/2
        self.feedCard?.frame = CGRect.init(origin: CGPoint.init(x: x, y: 88), size: CGSize.init(width: 300,height: 200))
        self.view.addSubview(self.feedCard!)
    }else{
        print("网络错误")
    }
}



        
此代码块在浮窗中显示
1.5.3 多卡片信息流

该功能是往自己的tableView列表中插入小视频信息流,具体使用详见demo

//小视频(竖版视频)多卡片,详细参数参考API文档 JVSService.showLittleVideoCards(num: 5, width: 400, delegate: self) { (card, error) in if error == .noError{ self.data.insert(card!, at: 3) self.tableView.reloadData() }else{ print("网络错误") } }
          //小视频(竖版视频)多卡片,详细参数参考API文档
JVSService.showLittleVideoCards(num: 5, width: 400, delegate: self)  { (card, error) in
    if error == .noError{
        self.data.insert(card!, at: 3)
        self.tableView.reloadData()
    }else{
        print("网络错误")
    }
}


        
此代码块在浮窗中显示

1.6 登录用户关注页面(v1.1.0 新增)

override func viewDidLoad() { super.viewDidLoad() let vc = JVSService.getFollowPageViewController(delegate: self) self.addChild(vc) self.view.addSubview(vc.view) }
          override func viewDidLoad() {
    super.viewDidLoad()
    let vc =  JVSService.getFollowPageViewController(delegate: self)
    self.addChild(vc)
    self.view.addSubview(vc.view)
}

        
此代码块在浮窗中显示

二、详细API说明

2.1 JVSService 类API

/// 1、初始化SDK /// - Parameters: /// - appkey: 极光平台申请的appkey /// - channelId: 渠道id @objc public class func setAppkey(appkey:String, channelId:String) /// 2、开启debug日志接口 /// - Parameter enable: 默认false @objc public class func setDebug(enable:Bool) /// 3、检查业务是否可用,回调结果有缓存,24小时更新一次 /// - Parameter callBack: 回调信息 @objc public class func checkBussinessEnable(callBack: @escaping (_ result:Bool,Error?)->Void) /// 4、获取多频道导航页面 /// - Parameter delegate: 视频广告状态相关的回调 /// - Returns:JVSRootViewController 多频道导航 根视图控制器 @objc public class func getChannelListViewController(delegate:JVSVideoDelegate) -> JVSRootViewController /// 5、单个频道feed流 /// - Parameters: /// - delegate: 视频和广告状态相关的回调 /// - channelID:频道id /// - Returns: JVSFeedListViewController feed流控制器 @objc public class func getOneChannelViewController(delegate:JVSVideoDelegate,channelID:String? = "") -> JVSFeedListViewController /// 6、类似抖音小视频、单个视频全屏布局 /// - Parameters: /// - delegate: 视频和广告状态相关的回调 /// - single: 是否是单个视频 默认false /// - cpInfo: 是否是cp视频 默认false /// - cpId: cp id /// - Returns: JVSLittleVideoViewController小视频控制器 @objc public class func getLittleVideoViewController(delegate:JVSVideoDelegate,single:Bool = false,cpInfo:Bool = false,cpId:String? = "") -> JVSLittleVideoViewController /// 7、类似与快手小视频瀑布流视图布局 /// - Parameter delegate: 视频和广告状态相关的回调 /// - Returns: JVSLittleVideoListController 小视频控制器 @objc public class func getLittleListVideoViewController(delegate:JVSVideoDelegate) -> JVSLittleVideoListController /// 8、类似与快手小视频瀑布流视图布局-不规则 /// - Parameter delegate: 视频和广告状态相关的回调 /// - Returns: JVSLittleVideoWaterFallViewController 小视频控制器 @objc public class func getWaterLittleListVideoViewController(delegate:JVSVideoDelegate) -> JVSLittleVideoWaterFallViewController /// 9、用户登录接口 /// - Parameters: /// - nickname: 昵称 /// - avatar: 头像 /// - phone: 手机号 /// - uid: user id /// - callback: 结果回调 @objc public class func login(nickname: String, avatar: String, phone: String, uid: String,callback: @escaping (Bool, String) -> Void) { /// 10、用户登出 @objc public class func logout() /// 11、保存用户标签 /// - Parameters: /// - uid: 用户id /// - userInfo: 用户信息 /// 示例 /// { /// "gender": "1", 0-未知,1-男性,2-女性 // "age": "18,28" 年龄所在的区间段,以逗号分隔,年龄段的开始和结束值可以相同 // } @objc public class func setUserTag(uid: String, userInfo: [String: String]) /// 12、切换用户时单独调用 @objc public class func setUid(_ uid: String){ ///13、 查询用户登录状态 @objc public class var isLogin:Bool //14、查询版SDK版本号 @objc public static let sdkVer /// 15、用户关注的视频主页面,需要调用登录接口,登录成功之后才有数据显示 /// - Parameter delegate: 视频播放相关回调 /// - Returns:JVSFeedListViewController 视图控制器 @objc public class func getFollowPageViewController(delegate:JVSVideoDelegate) -> JVSFeedListViewController //MARK:-局部信息流 ///16、 插入feed信息流卡片 /// - Parameters: /// - width: 卡片视图宽度,高度自适应 /// - chanleId: 频道id /// - delegate: 视频播放开始暂停失败等事件的代理 /// - callBack: 回调结果 @objc public class func showFeedCard(width:CGFloat, chanelId:String = "",delegate:JVSVideoDelegate,callBack:@escaping(_ cardView:UIView?,_ error:JVSVideosCardError)->Void) /// 17、插入只有一个小视频的卡片 /// - Parameters: /// - width: 卡片视图宽度,高度自适应 /// - delegate: 视频播放开始暂停失败等事件的代理 /// - callBack: 回调结果 @objc public class func showLittleVideoCard(width:CGFloat,delegate:JVSVideoDelegate,callBack:@escaping(_ cardView:UIView?,_ error:JVSVideosCardError)->Void) ///18、 插入含有4个以上小视频的卡片 /// - Parameters: /// - num: 卡片数量(4-8个 小于4默认4,大于8默认8) /// - width: 卡片视图宽度,高度自适应 /// - delegate: 视频播放开始暂停失败等事件的代理 /// - callBack: 回调结果 @objc public class func showLittleVideoCards(num:Int = 4,width:CGFloat,delegate:JVSVideoDelegate,callBack:@escaping(_ cardView:UIView?,_ error:JVSVideosCardError)->Void) // 19、实时热点视频 /** 获取实时热点视频 @param beginTime : 开始时间戳,单位秒(小数点后数值内部自动忽略),默认传0,代表获取最新数据 @param endTime : 结束时间戳,单位秒(小数点后数值内部自动忽略),默认传0,代表获取最新数据 @param videoType : 视频类型 horizontal-横版视频视频 vertical -竖版视频,热点竖视频需要联系商务申请 @param key : 内容池key名,默认传空 @param page : 页数 @param size : 每页返回的内容条数,取值范围:1-100 */ @objc public class func getHotVideoList(beginTime: TimeInterval, endTime: TimeInterval, videoType:JVSVideoType, key: String = "", page: Int = 1, size: Int = 10, callback: @escaping ([JVSFeedVideoData],_ error:JVSResponseError) -> Void) ///20、 播放视频接口 /// - Parameters: /// - videoType: 视频类型 /// - videoData: 视频内容数据源 /// - delegate: 代理回调 /// - viewController: 控制器 @objc public class func openPlayer(videoType:JVSVideoType, videoData: JVSFeedVideoData, delegate: JVSVideoDelegate? = nil, viewController: UIViewController) // MARK:-视频上报相关事件 /// 21、 上报视频显示事件 /// - Parameters: /// - videoInfo: 视频数据源 /// - pos: 视频显示位置 @objc public class func reportVideoShowEvent(videoInfo: JVSFeedVideoData, pos: Int) ///22、 上报视频点击事件 /// - Parameters: /// - videoInfo: 视频数据源 /// - pos: 视频显示位置 @objc public class func reportVideoClickEvent(videoInfo: JVSFeedVideoData, pos: Int) ///23、 获取频道列表 /// - Parameters: /// - videoType: 视频类型 /// - callback: 返回 @objc public func getChannels(videoType:String,callback: @escaping (Bool, [JVSChannelModel]?) -> Void) ///24、 获取小视频信息流 /// - Parameters: /// - loadType: 加载方式 /// - callback: 返回 @objc public func getLittleVideoList(loadType: JVSFeedLoadType,callback: @escaping (Bool, [JVSFeedVideoData]) -> Void)
              /// 1、初始化SDK
    /// - Parameters:
    ///   - appkey: 极光平台申请的appkey
    ///   - channelId: 渠道id
    @objc public class func setAppkey(appkey:String, channelId:String)
    
    /// 2、开启debug日志接口
    /// - Parameter enable: 默认false
    @objc public class func setDebug(enable:Bool)

    /// 3、检查业务是否可用,回调结果有缓存,24小时更新一次
    /// - Parameter callBack: 回调信息
    @objc public class func checkBussinessEnable(callBack: @escaping (_ result:Bool,Error?)->Void)
    
    /// 4、获取多频道导航页面
    /// - Parameter delegate: 视频广告状态相关的回调
    /// - Returns:JVSRootViewController   多频道导航 根视图控制器
    @objc public class func getChannelListViewController(delegate:JVSVideoDelegate) -> JVSRootViewController

    /// 5、单个频道feed流
    /// - Parameters:
    ///   - delegate: 视频和广告状态相关的回调
    ///   - channelID:频道id
    /// - Returns: JVSFeedListViewController  feed流控制器
    @objc public class func getOneChannelViewController(delegate:JVSVideoDelegate,channelID:String? = "") -> JVSFeedListViewController
    
    /// 6、类似抖音小视频、单个视频全屏布局
    /// - Parameters:
    ///   - delegate: 视频和广告状态相关的回调
    ///   - single: 是否是单个视频 默认false
    ///   - cpInfo: 是否是cp视频 默认false
    ///   - cpId: cp id
    /// - Returns: JVSLittleVideoViewController小视频控制器
    @objc public class func getLittleVideoViewController(delegate:JVSVideoDelegate,single:Bool = false,cpInfo:Bool = false,cpId:String? = "") -> JVSLittleVideoViewController

    /// 7、类似与快手小视频瀑布流视图布局
    /// - Parameter delegate: 视频和广告状态相关的回调
    /// - Returns: JVSLittleVideoListController 小视频控制器
    @objc public class func getLittleListVideoViewController(delegate:JVSVideoDelegate) -> JVSLittleVideoListController
    
    /// 8、类似与快手小视频瀑布流视图布局-不规则
    /// - Parameter delegate: 视频和广告状态相关的回调
    /// - Returns: JVSLittleVideoWaterFallViewController 小视频控制器
    @objc public class func getWaterLittleListVideoViewController(delegate:JVSVideoDelegate) -> JVSLittleVideoWaterFallViewController
    
    /// 9、用户登录接口
    /// - Parameters:
    ///   - nickname: 昵称
    ///   - avatar: 头像
    ///   - phone: 手机号
    ///   - uid: user id
    ///   - callback: 结果回调
    @objc public class func login(nickname: String, avatar: String, phone: String, uid: String,callback: @escaping (Bool, String) -> Void) {

    /// 10、用户登出
    @objc public class func logout()

    /// 11、保存用户标签
    /// - Parameters:
    ///   - uid: 用户id
    ///   - userInfo: 用户信息
    ///   示例
    ///     {
    ///      "gender": "1",     0-未知,1-男性,2-女性
    //        "age": "18,28"    年龄所在的区间段,以逗号分隔,年龄段的开始和结束值可以相同
    //       }
    @objc public class func setUserTag(uid: String, userInfo: [String: String])
    
    /// 12、切换用户时单独调用
    @objc public class func setUid(_ uid: String){


    ///13、 查询用户登录状态
    @objc public class var isLogin:Bool
    
    //14、查询版SDK版本号
    @objc public static let sdkVer 


    /// 15、用户关注的视频主页面,需要调用登录接口,登录成功之后才有数据显示
    /// - Parameter delegate: 视频播放相关回调
    /// - Returns:JVSFeedListViewController 视图控制器
    @objc public class func getFollowPageViewController(delegate:JVSVideoDelegate) -> JVSFeedListViewController


    //MARK:-局部信息流
    ///16、 插入feed信息流卡片
    /// - Parameters:
    ///   - width: 卡片视图宽度,高度自适应
    ///   - chanleId: 频道id
    ///   - delegate: 视频播放开始暂停失败等事件的代理
    ///   - callBack:  回调结果
    @objc public class func showFeedCard(width:CGFloat, chanelId:String = "",delegate:JVSVideoDelegate,callBack:@escaping(_ cardView:UIView?,_ error:JVSVideosCardError)->Void)
    
    /// 17、插入只有一个小视频的卡片
    /// - Parameters:
    ///   - width: 卡片视图宽度,高度自适应
    ///   - delegate: 视频播放开始暂停失败等事件的代理
    ///   - callBack: 回调结果
    @objc public class func showLittleVideoCard(width:CGFloat,delegate:JVSVideoDelegate,callBack:@escaping(_ cardView:UIView?,_ error:JVSVideosCardError)->Void)
    
    
    ///18、 插入含有4个以上小视频的卡片
    /// - Parameters:
    ///   - num: 卡片数量(4-8个 小于4默认4,大于8默认8)
    ///   - width: 卡片视图宽度,高度自适应
    ///   - delegate: 视频播放开始暂停失败等事件的代理
    ///   - callBack:  回调结果
    @objc public class func showLittleVideoCards(num:Int = 4,width:CGFloat,delegate:JVSVideoDelegate,callBack:@escaping(_ cardView:UIView?,_ error:JVSVideosCardError)->Void)

    
    // 19、实时热点视频
    /**
     获取实时热点视频
     @param beginTime : 开始时间戳,单位秒(小数点后数值内部自动忽略),默认传0,代表获取最新数据
     @param endTime : 结束时间戳,单位秒(小数点后数值内部自动忽略),默认传0,代表获取最新数据
     @param videoType : 视频类型  horizontal-横版视频视频  vertical -竖版视频,热点竖视频需要联系商务申请
     @param key : 内容池key名,默认传空
     @param page : 页数
     @param size : 每页返回的内容条数,取值范围:1-100
     */
    @objc public class func getHotVideoList(beginTime: TimeInterval, endTime: TimeInterval, videoType:JVSVideoType, key: String = "", page: Int = 1, size: Int = 10, callback: @escaping ([JVSFeedVideoData],_ error:JVSResponseError) -> Void)


    ///20、 播放视频接口
    /// - Parameters:
    ///   - videoType: 视频类型
    ///   - videoData: 视频内容数据源
    ///   - delegate: 代理回调
    ///   - viewController: 控制器
    @objc public class func openPlayer(videoType:JVSVideoType, videoData: JVSFeedVideoData, delegate: JVSVideoDelegate? = nil, viewController: UIViewController)

    // MARK:-视频上报相关事件
    /// 21、 上报视频显示事件
    /// - Parameters:
    ///   - videoInfo: 视频数据源
    ///   - pos: 视频显示位置
    @objc public class func reportVideoShowEvent(videoInfo: JVSFeedVideoData, pos: Int)

    ///22、 上报视频点击事件
    /// - Parameters:
    ///   - videoInfo: 视频数据源
    ///   - pos: 视频显示位置
    @objc public class func reportVideoClickEvent(videoInfo: JVSFeedVideoData, pos: Int)
    
    ///23、 获取频道列表
    /// - Parameters:
    ///   - videoType: 视频类型
    ///   - callback: 返回
    @objc public func getChannels(videoType:String,callback: @escaping (Bool, [JVSChannelModel]?) -> Void)

      ///24、 获取小视频信息流
    /// - Parameters:
    ///   - loadType: 加载方式
    ///   - callback: 返回
   @objc public func getLittleVideoList(loadType: JVSFeedLoadType,callback: @escaping (Bool, [JVSFeedVideoData]) -> Void)

        
此代码块在浮窗中显示

2.2 JVSVideoDelegate 视频和广告状态相关的回调

/// 首个视频开始播放(isAD: 是否是广告) @objc optional func firstPlayerStart(videoInfo: JVSFeedVideoData, isAD: Bool) /// 视频开始播放 @objc optional func playerStart(videoInfo: JVSFeedVideoData, isAD: Bool) /// 视频播放暂停状态变化 @objc optional func playerPause(videoInfo: JVSFeedVideoData, isPause: Bool, isAD: Bool) /// 视频播放结束 @objc optional func playerEnd(videoInfo: JVSFeedVideoData, isAD: Bool) /// 视频播放失败 @objc optional func playerError(videoInfo: JVSFeedVideoData, error: Error?, isAD: Bool) /// 广告信息获取成功 @objc optional func ylADInfoLoadSuccess(adID: String) /// 广告信息获取失败 @objc optional func ylADInfoLoadFail(adID: String, error: Error?) /// 点击分享按钮(isMain: 竖版视频用来标记是否是首页,仅首页支持负反馈功能) @objc optional func clickShareBtn(videoInfo: JVSFeedVideoData, isMain: Bool) /// 点赞(isPraise:true - 点赞,false - 取消点赞) @objc optional func clickPraiseBtn(videoInfo: JVSFeedVideoData, isPraise: Bool, isAD: Bool) /// 进入CP页 @objc optional func gotoCPPage(videoInfo: JVSFeedVideoData) /// 进入播放页 @objc optional func gotoPlayerPage(videoInfo: JVSFeedVideoData) /// 进入Feed页 @objc optional func gotoFeedPage(channelID: String) /// YLLittleVideoListController列表滑动 @objc optional func yl_scrollViewDidScroll(_ scrollView: UIScrollView) /// 广告展现 @objc optional func adShowWith(ylID: String, reqId: String, type: Int) /// 广告点击 @objc optional func adClickWith(ylID: String, reqId: String, type: Int)
          
    /// 首个视频开始播放(isAD: 是否是广告)
    @objc optional func firstPlayerStart(videoInfo: JVSFeedVideoData, isAD: Bool)
    /// 视频开始播放
    @objc optional func playerStart(videoInfo: JVSFeedVideoData, isAD: Bool)
    /// 视频播放暂停状态变化
    @objc optional func playerPause(videoInfo: JVSFeedVideoData, isPause: Bool, isAD: Bool)
    /// 视频播放结束
    @objc optional func playerEnd(videoInfo: JVSFeedVideoData, isAD: Bool)
    /// 视频播放失败
    @objc optional func playerError(videoInfo: JVSFeedVideoData, error: Error?, isAD: Bool)
    /// 广告信息获取成功
    @objc optional func ylADInfoLoadSuccess(adID: String)
    /// 广告信息获取失败
    @objc optional func ylADInfoLoadFail(adID: String, error: Error?)
    /// 点击分享按钮(isMain: 竖版视频用来标记是否是首页,仅首页支持负反馈功能)
    @objc optional func clickShareBtn(videoInfo: JVSFeedVideoData, isMain: Bool)
    /// 点赞(isPraise:true - 点赞,false - 取消点赞)
    @objc optional func clickPraiseBtn(videoInfo: JVSFeedVideoData, isPraise: Bool, isAD: Bool)
    /// 进入CP页
    @objc optional func gotoCPPage(videoInfo: JVSFeedVideoData)
    /// 进入播放页
    @objc optional func gotoPlayerPage(videoInfo: JVSFeedVideoData)
    /// 进入Feed页
    @objc optional func gotoFeedPage(channelID: String)
    /// YLLittleVideoListController列表滑动
    @objc optional func yl_scrollViewDidScroll(_ scrollView: UIScrollView)
    /// 广告展现
    @objc optional func adShowWith(ylID: String, reqId: String, type: Int)
    /// 广告点击
    @objc optional func adClickWith(ylID: String, reqId: String, type: Int)

        
此代码块在浮窗中显示

2.3 JVSRootViewController类API

是横视频UI页入口类,带多频道水平导航的UI界面,UIViewController类型,可以方便的嵌入用户App中,频道里面是feed流视频列表

// 1、视频和广告状态相关回调代理 @objc public weak var delegate: JVSVideoDelegate? /// 2、当前频道滚动到顶部,设置是否刷新 /// pullRefresh: 是否刷新 @objc public func scrollToTop(pullRefresh: Bool = false) /// 3、视频负反馈接口 @objc public func disLikeVideo(feed: JVSFeedVideoData)
              // 1、视频和广告状态相关回调代理
    @objc public weak var delegate: JVSVideoDelegate?
    
    /// 2、当前频道滚动到顶部,设置是否刷新
    /// pullRefresh: 是否刷新
    @objc public func scrollToTop(pullRefresh: Bool = false)
    
    /// 3、视频负反馈接口 
    @objc public func disLikeVideo(feed: JVSFeedVideoData)

        
此代码块在浮窗中显示

2.4 JVSFeedListViewController 类API

某单一频道fee流页面视图控制器类,可单独使用。

// 1、频道id ,用来获取频道内容feed流 @objc public var channelID: String? // 2、视频和广告状态相关回调代理 @objc public weak var delegate: JVSVideoDelegate? /// 3、当前频道滚动到顶部,设置是否刷新 /// pullRefresh: 是否刷新 @objc public func scrollToTop(pullRefresh: Bool = false) /// 4、视频负反馈接口 @objc public func disLikeVideo(feed: JVSFeedVideoData)
              // 1、频道id ,用来获取频道内容feed流
    @objc public var channelID: String?
    // 2、视频和广告状态相关回调代理
    @objc public weak var delegate: JVSVideoDelegate?

    /// 3、当前频道滚动到顶部,设置是否刷新
    /// pullRefresh: 是否刷新
    @objc public func scrollToTop(pullRefresh: Bool = false)

    /// 4、视频负反馈接口 
    @objc public func disLikeVideo(feed: JVSFeedVideoData)

        
此代码块在浮窗中显示

2.5 JVSLittleVideoViewController 类API

类似抖音的竖屏视频页面的视图控制器

// 1、视频和广告状态相关回调代理 @objc public weak var delegate: JVSVideoDelegate? // 2、是否播放单个视频 var single = false //3、是否是cp视频 var cpInfo = false //4、为cp视频时的cpid var cpID: String? // 5、对当前视频进行负反馈 @objc public func disLikeVideo()
              // 1、视频和广告状态相关回调代理
    @objc public weak var delegate: JVSVideoDelegate?
    // 2、是否播放单个视频
    var single = false  
    //3、是否是cp视频
    var cpInfo = false
    //4、为cp视频时的cpid
    var cpID: String?
    // 5、对当前视频进行负反馈
    @objc public func disLikeVideo()

        
此代码块在浮窗中显示

2.6 JVSLittleVideoListController 类API

小视频瀑布流布局,类似快手的竖屏视频列表页面。

// 1、视频和广告状态相关回调代理 @objc public weak var delegate: JVSVideoDelegate?
              // 1、视频和广告状态相关回调代理
    @objc public weak var delegate: JVSVideoDelegate?

        
此代码块在浮窗中显示

2.7 JVSFeedVideoData 类API

单个视频具体信息类

/// 1、视频ID @objc public var video_id: String? /// 2、标题 @objc public var title: String? /// 3、标签 @objc public var tags: String? /// 4、分类 @objc public var category: String? /// 5、频道ID @objc public var channel_id: String? /// 6、 是否精选 @objc public var is_choice: String? /// 7、分享时H5播放页 @objc public var shareUrl: String /// 8、封面图 @objc public var image: String? /// 9、播放时长 @objc public var duration: String? /// 10、内容提供者 @objc public var provider: JVSVideoProvider? /// 11、视频内容宽 @objc public var video_w: String? /// 12、视频内容高 @objc public var video_h: String? /// 13、播放数 @objc public var play_num: String? /// 14、点赞数 @objc public var like_num: String? /// 15、评论数 @objc public var comment_num: String? /// 16、是否点赞 @objc public var is_like: String?
              /// 1、视频ID
    @objc public var video_id: String?
    /// 2、标题
    @objc public var title: String?
    /// 3、标签
    @objc public var tags: String?
    /// 4、分类
    @objc public var category: String?
    /// 5、频道ID
    @objc public var channel_id: String?
    /// 6、 是否精选
    @objc public var is_choice: String?
    /// 7、分享时H5播放页
    @objc public var shareUrl: String
  
    /// 8、封面图
    @objc public var image: String?
    /// 9、播放时长
    @objc public var duration: String?
    /// 10、内容提供者
    @objc public var provider: JVSVideoProvider?
    /// 11、视频内容宽
    @objc public var video_w: String?
    /// 12、视频内容高
    @objc public var video_h: String?
    /// 13、播放数
    @objc public var play_num: String?
    /// 14、点赞数
    @objc public var like_num: String?
    /// 15、评论数
    @objc public var comment_num: String?
    /// 16、是否点赞
    @objc public var is_like: String?

        
此代码块在浮窗中显示

2.8 JVSVideoProvider 类API

视频内容提供者类

/// 1、视频提供者ID @objc public var id: String? /// 2、名字 @objc public var name: String? /// 3、头像 @objc public var avatar: String? /// 4、简介 @objc public var aword: String? /// 5、视频数 @objc public var videos: String? /// 6、粉丝数 @objc public var fans: String? /// 7、是否已关注 @objc public var islike: String? /// 8、CP类型(1:短视频,2:小视频) @objc public var type: String?
              /// 1、视频提供者ID
    @objc public var id: String?
    /// 2、名字
    @objc public var name: String?
    /// 3、头像
    @objc public var avatar: String?
    /// 4、简介
    @objc public var aword: String?
    /// 5、视频数
    @objc public var videos: String?
    /// 6、粉丝数
    @objc public var fans: String?
    /// 7、是否已关注
    @objc public var islike: String?
    /// 8、CP类型(1:短视频,2:小视频)
    @objc public var type: String?

        
此代码块在浮窗中显示

2.9 JVSUIConfig 类API

UI界面配置类,设置视频UI界面

/// 播放页类型 @objc public enum JVSPlayPageType: Int { /// 播放页类型-h5 case web /// 播放页类型-相关视频 case relation /// 播放页类型-feed流 case feed /// 当前页播放 case direct /// 当前页自动播放 case auto } /// 评论展示类型 @objc public enum JVSLittleCommentType: Int { /// 只能看不能评论 case read /// 支持看和写评论 case readWrite /// 不显示评论功能 case none } /// 小视频播放器填充类型 @objc public enum JVSLittlePlayerContentMode: Int { /// 非等比例填充,拉伸视频直至两个维度填满播放器区域 case resize /// 等比例填充,直到一个维度填满播放器区域,其中一个维度可能会出现黑边 case resizeAspect /// 等比例填充,直到两个维度都填满播放器区域,其中一个维度部分区域可能会被裁剪 case resizeAspectFill } /*----------------- 横版视频配置项 -----------------*/ /// 播放页类型(默认:相关视频;局部信息流不支持当前页播放形式) @objc public static var playPageType: JVSPlayPageType = .relation /// 是否响应点击头像跳转CP页(默认响应) @objc public static var cpInfoResponse = true /// 评论展示类型(默认不显示) @objc public static var commentType: JVSLittleCommentType = .none /// 是否显示分享按钮 @objc public static var showShare = false /// 是否显示关注按钮 @objc public static var showFollow = false /// 是否显示关注页面 @objc public static var showFollowPage = false // 是否显示横屏按钮(默认显示 v1.1.0新增) JVSUIConfig.showFullBtn = true /*----------------- 竖版视频配置项 -----------------*/ /// 小视频评论展示类型(默认不显示) @objc public static var littleCommentType: JVSLittleCommentType = .none /// 小视频播放器填充类型(默认resizeAspect) @objc public static var playerContentMode: JVSLittlePlayerContentMode = .resizeAspect /// 小视频点赞等按钮位于底部(默认右边) @objc public static var bottomPanel = false /// 小视频是否显示分享按钮 @objc public static var littleShowShare = false /// 小视频是否响应点击头像跳转CP页(默认响应) @objc public static var littleCpInfoResponse = true /*-----------------以下为v1.1.0竖版视频配置新增属性-----------------*/ // 小视频是否显示相关视频按钮(默认显示) JVSUIConfig.littleShowRelation = true //小视频是否自动播放下一个(默认自动播放) JVSUIConfig.littleAutoPlayNext = true // 小视频title和description距离底部的距离,默认57 JVSUIConfig.littleTitleMargin = 57.0 // 小视频右边按钮最下面的按钮距离底部的距离,默认42 JVSUIConfig.littleRightMargin = 42.0 // 小视频底部话题距离底部的距离,默认0 JVSUIConfig.littleTopicMargin = 0.0
          /// 播放页类型
@objc public enum JVSPlayPageType: Int {
    /// 播放页类型-h5
    case web
    /// 播放页类型-相关视频
    case relation
    /// 播放页类型-feed流
    case feed
    /// 当前页播放
    case direct
    /// 当前页自动播放
    case auto
}

/// 评论展示类型
@objc public enum JVSLittleCommentType: Int {
    /// 只能看不能评论
    case read
    /// 支持看和写评论
    case readWrite
    /// 不显示评论功能
    case none
}
/// 小视频播放器填充类型
@objc public enum JVSLittlePlayerContentMode: Int {
    /// 非等比例填充,拉伸视频直至两个维度填满播放器区域
    case resize
    /// 等比例填充,直到一个维度填满播放器区域,其中一个维度可能会出现黑边
    case resizeAspect
    /// 等比例填充,直到两个维度都填满播放器区域,其中一个维度部分区域可能会被裁剪
    case resizeAspectFill
}

    /*-----------------  横版视频配置项  -----------------*/
    /// 播放页类型(默认:相关视频;局部信息流不支持当前页播放形式)
    @objc public static var playPageType: JVSPlayPageType = .relation
    /// 是否响应点击头像跳转CP页(默认响应)
    @objc public static var cpInfoResponse = true
    /// 评论展示类型(默认不显示)
    @objc public static var commentType: JVSLittleCommentType = .none
    /// 是否显示分享按钮
    @objc public static var showShare = false
    /// 是否显示关注按钮
    @objc public static var showFollow = false
    /// 是否显示关注页面
    @objc public static var showFollowPage = false
     // 是否显示横屏按钮(默认显示 v1.1.0新增)
        JVSUIConfig.showFullBtn = true
    
    /*-----------------  竖版视频配置项  -----------------*/
    /// 小视频评论展示类型(默认不显示)
    @objc public static var littleCommentType: JVSLittleCommentType = .none
    /// 小视频播放器填充类型(默认resizeAspect)
    @objc public static var playerContentMode: JVSLittlePlayerContentMode = .resizeAspect
    /// 小视频点赞等按钮位于底部(默认右边)
    @objc public static var bottomPanel = false
    /// 小视频是否显示分享按钮
    @objc public static var littleShowShare = false
    /// 小视频是否响应点击头像跳转CP页(默认响应)
    @objc public static var littleCpInfoResponse = true
         /*-----------------以下为v1.1.0竖版视频配置新增属性-----------------*/
     // 小视频是否显示相关视频按钮(默认显示)
    JVSUIConfig.littleShowRelation = true
    //小视频是否自动播放下一个(默认自动播放)
    JVSUIConfig.littleAutoPlayNext = true
    // 小视频title和description距离底部的距离,默认57
    JVSUIConfig.littleTitleMargin = 57.0
    // 小视频右边按钮最下面的按钮距离底部的距离,默认42
    JVSUIConfig.littleRightMargin = 42.0
    // 小视频底部话题距离底部的距离,默认0
    JVSUIConfig.littleTopicMargin = 0.0

        
此代码块在浮窗中显示

2.10 插入自定义view

2.10.1 横视频插入

需要继承实现代理: JVSFeedInsertCustomViewDelegate

/** * 由于顶部刷新而清空数据源 */ @objc optional func ylFeedwasRemoveAll() /** * 已经占位 */ @objc optional func ylFeeddidInsertCustomViewModel(index:Int) /** * 返回具体View */ @objc optional func ylFeedcustomViewForRowAt(index:Int)->UIView /** * customView展现的高度 */ @objc optional func ylFeedheightForRowAt(index:Int)->CGFloat /** * 点击了customView所在的Cell */ @objc optional func ylFeeddidSelectCustomview(index:Int)
              /**
      * 由于顶部刷新而清空数据源
      */
    @objc optional func ylFeedwasRemoveAll()
    /**
      * 已经占位
      */
    @objc optional func ylFeeddidInsertCustomViewModel(index:Int)
    /**
      * 返回具体View
      */
    @objc optional func ylFeedcustomViewForRowAt(index:Int)->UIView
    /**
      * customView展现的高度
      */
    @objc optional func ylFeedheightForRowAt(index:Int)->CGFloat
    /**
      * 点击了customView所在的Cell
      */
    @objc optional func  ylFeeddidSelectCustomview(index:Int)

        
此代码块在浮窗中显示

2.10.1.1 横视频插入(多频道)

JVSRootViewController

/// -insertDelegate: 插入自定义View相关的回调 JVSFeedInsertCustomViewDelegate self.channelVC = JVSService.getChannelListViewController(delegate: self,insertDelegate: self) // 插入自定义UI的起始位置 self.channelVC.startInsertOffset = 2; // 插入自定义UI的间隔 self.channelVC.insertInterval = 2;
          /// -insertDelegate: 插入自定义View相关的回调 JVSFeedInsertCustomViewDelegate
self.channelVC = JVSService.getChannelListViewController(delegate: self,insertDelegate: self)
// 插入自定义UI的起始位置
self.channelVC.startInsertOffset = 2;
// 插入自定义UI的间隔
self.channelVC.insertInterval = 2;

        
此代码块在浮窗中显示

2.10.1.2 横视频插入(单频道)

JVSFeedListViewController

/// - Parameter insertDelegate: 插入自定义View相关的回调 JVSFeedInsertCustomViewDelegate self.channelVC = JVSService.getOneChannelViewController(delegate: self,insertDelegate: self) // 插入自定义UI的起始位置 self.channelVC.startInsertOffset = 2; // 插入自定义UI的间隔 self.channelVC.insertInterval = 2;
          /// - Parameter insertDelegate: 插入自定义View相关的回调 JVSFeedInsertCustomViewDelegate
self.channelVC = JVSService.getOneChannelViewController(delegate: self,insertDelegate: self)
// 插入自定义UI的起始位置
self.channelVC.startInsertOffset = 2;
// 插入自定义UI的间隔
self.channelVC.insertInterval = 2;

        
此代码块在浮窗中显示
2.10.2 竖视频插入

需要继承实现代理: JVSLittleInsertCustomViewDelegate

/** * 由于顶部刷新而清空数据源 */ @objc optional func ylLittlewasRemoveAll() /** * 已经占位 */ @objc optional func ylLittledidInsertCustomViewModel(index:Int) /** * 返回具体View */ @objc optional func ylLittlecustomViewForRowAt(index:Int)->UIView /** * 点击了customView所在的Cell */ @objc optional func ylLittledidSelectCustomview(index:Int)
              /**
      * 由于顶部刷新而清空数据源
      */
    @objc optional func ylLittlewasRemoveAll()
    /**
      * 已经占位
      */
    @objc optional func ylLittledidInsertCustomViewModel(index:Int)
    /**
      * 返回具体View
      */
    @objc optional func ylLittlecustomViewForRowAt(index:Int)->UIView
    /**
      * 点击了customView所在的Cell
      */
    @objc optional func ylLittledidSelectCustomview(index:Int)

        
此代码块在浮窗中显示

2.10.2.1 JVSLittleVideoViewController

/// - Parameter insertDelegate: 插入自定义View相关的回调 JVSLittleInsertCustomViewDelegate self.channelVC = JVSService.getLittleVideoViewController(delegate: self,insertDelegate: self) // 插入自定义UI的起始位置 self.channelVC.startInsertOffset = 2; // 插入自定义UI的间隔 self.channelVC.insertInterval = 2;
          /// - Parameter insertDelegate: 插入自定义View相关的回调 JVSLittleInsertCustomViewDelegate
self.channelVC = JVSService.getLittleVideoViewController(delegate: self,insertDelegate: self)
// 插入自定义UI的起始位置
self.channelVC.startInsertOffset = 2;
// 插入自定义UI的间隔
self.channelVC.insertInterval = 2;

        
此代码块在浮窗中显示
文档内容是否对您有帮助?

Copyright 2011-2022, jiguang.cn, All Rights Reserved. 粤ICP备12056275号-13 深圳市和讯华谷信息技术有限公司

在文档中心打开