From d93bf4b3c3267eee7136a4f06d0e1779b00072cb Mon Sep 17 00:00:00 2001 From: Dhan Date: Fri, 1 Sep 2023 15:03:20 +0800 Subject: [PATCH] =?UTF-8?q?=E7=82=B9=E6=92=AD2.20.0=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 27 +++++++++++ PolyvVodSDKDemo/Podfile | 2 +- .../PolyvVodSDKDemo.xcodeproj/project.pbxproj | 4 +- .../Classes/Cast/PLVCastBusinessManager.m | 6 ++- .../Course/PLVCourseDetailController.m | 8 ---- .../Classes/PLVSimpleDetailController.m | 16 +++++-- .../Exam/PLVVodExamViewController.h | 2 +- .../Exam/PLVVodExamViewController.m | 12 +++-- .../QuestionView/PLVFillBlankQuestionView.m | 17 +++---- .../Exam/QuestionView/PLVVodQuestionView.m | 11 +++++ .../PLVVFloatingWindowViewController.m | 3 +- .../PLVVFloatingPlayerViewController.m | 13 +++++ .../PLVMarquee/PLVMarqueeAnimationManager.m | 7 ++- .../Controller/PLVPPTVideoViewController.m | 13 +++++ .../Skin/PLVVodPlayerSkin.m | 2 +- .../Skin/PLVVodSkinPlayerController.m | 47 ++++++++++++++----- README.md | 2 +- 17 files changed, 145 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0f3bfe..1cb75b7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,32 @@ +## [2.20.0] - 2023-09-01 + +### Changed + +- 【SDK、Demo】旧版跑马灯移除 +- 【SDK、Demo】优化问答提交统计 +- 【Demo】优化跑马灯显示样式 +- 【SDK】支持溯源水印 +- 【SDK】支持跨端续播 + +### Fixed + +- 【Demo】修复下载视频出现线路切换问题 +- 【SDK】修复播放第三方URL视频seek失效的问题 +- 【SDK】修复偶发性崩溃问题 +- 【SDK】移除先前版本中未使用的imei字段 + +### 迁移说明 + +**由 2.18.x 及以下版本升级到 2.19.0 及以上版本时,需要注意视频下载的迁移** + +**自 2.19.0 版本开始,本地播放视频鉴权方式进行了调整,为了在覆盖升级时兼容已下载的旧版本视频,初始换sdk时会自动迁移,必须严格测试本地缓存视频是否迁移成功。** + +1. 旧版本升级至 2.20.0 版本的点播 SDK,需要同步更新 2.20.0 版本的 Demo 层代码,以获得本次新增的功能。 +2. 若不便直接更新源码,可根据 [diff 变动内容](https://github.com/polyv/polyv-ios-vod-sdk/compare/2.19.1...2.20.0) 查看 Demo 层的变动,手动更新Demo层源码 + ## [2.19.1] - 2023-07-21 ### Changed @@ -1078,3 +1104,4 @@ typedef NS_ENUM(NSInteger, PLVVodFullScreenOrientation) { - 修复音量与播放器值不同步问题; - 修复时间显示格式; - 修复 `-requestDownloadInfosWithCompletion:` 死循环崩溃问题; + diff --git a/PolyvVodSDKDemo/Podfile b/PolyvVodSDKDemo/Podfile index a92c13e..36ba260 100644 --- a/PolyvVodSDKDemo/Podfile +++ b/PolyvVodSDKDemo/Podfile @@ -18,7 +18,7 @@ target 'PolyvVodSDKDemo' do pod 'TZImagePickerController', '~> 3.2.0' # PLVVodSDK - pod 'PolyvVodSDK', '~> 2.19.1' + pod 'PolyvVodSDK', '~> 2.20.0' # 使用投屏功能的客户需要集成 #pod 'LBLelinkKit', '~> 30503' diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo.xcodeproj/project.pbxproj b/PolyvVodSDKDemo/PolyvVodSDKDemo.xcodeproj/project.pbxproj index 4cd8540..d8b761e 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo.xcodeproj/project.pbxproj +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo.xcodeproj/project.pbxproj @@ -1680,7 +1680,7 @@ INFOPLIST_FILE = "$(SRCROOT)/PolyvVodSDKDemo/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 9; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 2.19.1; + MARKETING_VERSION = 2.20.0; PRODUCT_BUNDLE_IDENTIFIER = cn.plv.vod.sdk.demo; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1710,7 +1710,7 @@ INFOPLIST_FILE = "$(SRCROOT)/PolyvVodSDKDemo/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 9; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 2.19.1; + MARKETING_VERSION = 2.20.0; PRODUCT_BUNDLE_IDENTIFIER = cn.plv.vod.sdk.demo; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Cast/PLVCastBusinessManager.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Cast/PLVCastBusinessManager.m index 3dd1c67..18fd654 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Cast/PLVCastBusinessManager.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Cast/PLVCastBusinessManager.m @@ -252,7 +252,8 @@ - (void)plvCastManager_connectServicesResult:(BOOL)isConnected serviceModel:(non [weakSelf.castManager startPlayWithVideo:video quality:quality startPosition:self.player.currentPlaybackTime]; // 设置清晰度数量 初始所选清晰度 - weakSelf.castControllView.qualityOptionCount = video.hlsVideos.count; + NSArray *hlsVideos = video.isHls302 ? video.hlsVideos2 : video.hlsVideos; + weakSelf.castControllView.qualityOptionCount = hlsVideos.count; weakSelf.castControllView.currentQualityIndex = quality; }]; }else{ // 无需读取video模型缓存 @@ -260,7 +261,8 @@ - (void)plvCastManager_connectServicesResult:(BOOL)isConnected serviceModel:(non [self.castManager startPlayWithVideo:video quality:quality startPosition:self.player.currentPlaybackTime]; // 设置清晰度数量 初始所选清晰度 - self.castControllView.qualityOptionCount = self.player.video.hlsVideos.count; + NSArray *hlsVideos = video.isHls302 ? self.player.video.hlsVideos2 : self.player.video.hlsVideos; + self.castControllView.qualityOptionCount = hlsVideos.count; self.castControllView.currentQualityIndex = quality; } diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Course/PLVCourseDetailController.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Course/PLVCourseDetailController.m index 1c1d35c..3305ff9 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Course/PLVCourseDetailController.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/Course/PLVCourseDetailController.m @@ -102,14 +102,6 @@ - (void)viewDidLoad { #else weakSelf.player.video = video; #endif - - dispatch_async(dispatch_get_main_queue(), ^{ - /// 设置默认跑马灯,移除旧版本跑马灯 - PLVMarqueeModel *marqueeModel = [[PLVMarqueeModel alloc]init]; - [weakSelf.player.marqueeView setPLVMarqueeModel:marqueeModel]; - weakSelf.player.marquee = nil; - }); - }; // 若需投屏功能,则需以下代码来启用投屏 diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/PLVSimpleDetailController.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/PLVSimpleDetailController.m index 0ebb8f8..78b3ebb 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/PLVSimpleDetailController.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/Classes/PLVSimpleDetailController.m @@ -99,12 +99,21 @@ - (void)setupPlayer { self.player.autoplay = YES; self.player.enableLocalViewLog = YES; + __weak typeof(self) weakSelf = self; + self.player.playbackStateHandler = ^(PLVVodPlayerViewController *player) { + //新版跑马灯的启动暂停控制 + if (player.playbackState == PLVVodPlaybackStatePlaying) { + [weakSelf.player.marqueeView start]; + }else if (player.playbackState == PLVVodPlaybackStatePaused) { + [weakSelf.player.marqueeView pause]; + }else if (player.playbackState == PLVVodPlaybackStateStopped) { + [weakSelf.player.marqueeView stop]; + } + }; + NSString *vid = self.vid; if (self.isOffline){ - // 离线视频播放 - __weak typeof(self) weakSelf = self; - // 根据资源类型设置默认播放模式。本地音频文件设定音频播放模式,本地视频文件设定视频播放模式 // 只针对开通视频转音频服务的用户 self.player.playbackMode = self.playMode; @@ -118,7 +127,6 @@ - (void)setupPlayer { } else{ // 在线视频播放,默认会优先播放本地视频 - __weak typeof(self) weakSelf = self; [PLVVodVideo requestVideoWithVid:vid completion:^(PLVVodVideo *video, NSError *error) { if (error){ // 用于播放重试 diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/PLVVodExamViewController.h b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/PLVVodExamViewController.h index 583bb93..ad5f254 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/PLVVodExamViewController.h +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/PLVVodExamViewController.h @@ -18,7 +18,7 @@ @property (nonatomic, assign) NSTimeInterval currentTime; @property (nonatomic, copy) void (^examWillShowHandler)(PLVVodExam *exam); -@property (nonatomic, copy) void (^examDidCompleteHandler)(PLVVodExam *exam, NSTimeInterval backTime); +@property (nonatomic, copy) void (^examDidCompleteHandler)(PLVVodExam *exam, NSTimeInterval backTime, NSArray *answerIndexs); @property (nonatomic, assign, readonly) BOOL showing; diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/PLVVodExamViewController.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/PLVVodExamViewController.m index ae50f86..69b5321 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/PLVVodExamViewController.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/PLVVodExamViewController.m @@ -27,6 +27,8 @@ @interface PLVVodExamViewController () @property (nonatomic, assign) BOOL showing; +@property (nonatomic, strong) NSArray *answerIndexs; + @end @implementation PLVVodExamViewController @@ -47,19 +49,22 @@ - (void)viewDidLoad { [PLVToast showMessage:@"您还未选择任何答案"]; return; } + // 保存选项 + weakSelf.answerIndexs = [NSArray arrayWithArray:indexForSelectedItems]; // 判断正误 PLVVodExam *exam = weakSelf.currentExam; NSSet *referenceAnswer = [NSSet setWithArray:exam.correctIndex]; NSSet *userAnswer = [NSSet setWithArray:indexForSelectedItems]; BOOL correct = [referenceAnswer isEqualToSet:userAnswer]; + [weakSelf showExplanationIfCorrect:correct]; }; // 选择题的跳过回调 self.questionView.skipActionHandler = ^{ PLVVodExam *exam = [weakSelf hideExam]; - if (weakSelf.examDidCompleteHandler) weakSelf.examDidCompleteHandler(exam, -1); + if (weakSelf.examDidCompleteHandler) weakSelf.examDidCompleteHandler(exam, -1, nil); }; // 填空题的提交回调 @@ -85,13 +90,13 @@ - (void)viewDidLoad { //填空题的跳过回调 self.fillBlankQuestionView.skipActionHandler = ^{ PLVVodExam *exam = [weakSelf hideExam]; - if (weakSelf.examDidCompleteHandler) weakSelf.examDidCompleteHandler(exam, -1); + if (weakSelf.examDidCompleteHandler) weakSelf.examDidCompleteHandler(exam, -1, nil); }; self.explanationView.confirmActionHandler = ^(BOOL correct) { PLVVodExam *exam = [weakSelf hideExam]; NSTimeInterval backTime = correct ? -1 : exam.backTime; - if (weakSelf.examDidCompleteHandler) weakSelf.examDidCompleteHandler(exam, backTime); + if (weakSelf.examDidCompleteHandler) weakSelf.examDidCompleteHandler(exam, backTime, weakSelf.answerIndexs); }; self.view.alpha = 0; @@ -219,6 +224,7 @@ - (void)synchronouslyShowExam { [self.questionView scrollToTop]; } self.currentExam = exam; + self.answerIndexs = nil; }]; } diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.m index 058b225..9615583 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.m @@ -333,14 +333,15 @@ -(UIView *)lineH return _lineH; } - - -/* -// Only override drawRect: if you perform custom drawing. -// An empty implementation adversely affects performance during animation. -- (void)drawRect:(CGRect)rect { - // Drawing code +#pragma mark - Override + +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + UIView *touchView = [super hitTest:point withEvent:event]; + if (touchView == self) { + return nil; + } else { + return touchView; + } } -*/ @end diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.m index 4af43b8..52b2be8 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.m @@ -292,5 +292,16 @@ - (NSString *)optionOrderWithIndex:(NSInteger )index{ return dict[keyStr]; } +#pragma mark - Override + +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + UIView *touchView = [super hitTest:point withEvent:event]; + if (touchView == self) { + return nil; + } else { + return touchView; + } +} + @end diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Floating/FloatingWindow/PLVVFloatingWindowViewController.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Floating/FloatingWindow/PLVVFloatingWindowViewController.m index 75aa546..8ab3e92 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Floating/FloatingWindow/PLVVFloatingWindowViewController.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Floating/FloatingWindow/PLVVFloatingWindowViewController.m @@ -211,7 +211,8 @@ - (void)updateCoverView { PLVVodLocalVideo * localVideoModel = (PLVVodLocalVideo *)video; fileUrl = localVideoModel.path; } else { // 非本地文件 - fileUrl = (video.keepSource == NO) ? video.hlsIndex : video.play_source_url; + NSString *hlsIndex = video.isHls302 ? video.hlsIndex2 : video.hlsIndex; + fileUrl = (video.keepSource == NO) ? hlsIndex : video.play_source_url; } if (fileUrl && [fileUrl isKindOfClass:[NSString class]] && fileUrl.length != 0) { // 判断链接是否存在 diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Floating/PLVVFloatingPlayerViewController.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Floating/PLVVFloatingPlayerViewController.m index 0b37e28..c5860ba 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Floating/PLVVFloatingPlayerViewController.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Floating/PLVVFloatingPlayerViewController.m @@ -125,6 +125,17 @@ - (void)viewDidLoad { [weakSelf dealPictureInPictureErrorHandler:error]; }]; + // 跑马灯控制 + self.player.playbackStateHandler = ^(PLVVodPlayerViewController *player) { + //新版跑马灯的启动暂停控制 + if (player.playbackState == PLVVodPlaybackStatePlaying) { + [weakSelf.player.marqueeView start]; + }else if (player.playbackState == PLVVodPlaybackStatePaused) { + [weakSelf.player.marqueeView pause]; + }else if (player.playbackState == PLVVodPlaybackStateStopped) { + [weakSelf.player.marqueeView stop]; + } + }; } /// 画中画状态回调 @@ -333,10 +344,12 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // 当主播放器移出设备界面时,在小播放器上继续播放 if (self.playerPlaceholder.frame.origin.y + self.playerPlaceholder.frame.size.height <= NavHight && !self.playInFloatingView) { self.playInFloatingView = YES; + self.player.marqueeView.hidden = YES; [[PLVVFloatingWindow sharedInstance].contentVctrl addPlayer:self.player partnerViewController:self]; } else if (self.playerPlaceholder.frame.origin.y + self.playerPlaceholder.frame.size.height > NavHight && self.playInFloatingView) { self.playInFloatingView = NO; + self.player.marqueeView.hidden = NO; [self.player addPlayerOnPlaceholderView:self.playerPlaceholder rootViewController:self]; [[PLVVFloatingWindow sharedInstance].contentVctrl removePlayer]; diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.m index a33bf9f..e2833fc 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.m @@ -136,8 +136,8 @@ +(void)addFlashAnimation:(CALayer *)layer CGFloat displayHeight = CGRectGetHeight(bounds); CGFloat displayMaxX = displayWidth - layer.frame.size.width; CGFloat displayMaxY = displayHeight - layer.frame.size.height; - CGFloat randomX = [PLVMarqueeAnimationManager randomDoubleFrom:0.0 to:displayMaxX accuracy:2]; - CGFloat randomY = [PLVMarqueeAnimationManager randomDoubleFrom:20.0 to:displayMaxY accuracy:2]; + CGFloat randomX = displayMaxX < 0.0 ? 0.0 : [PLVMarqueeAnimationManager randomDoubleFrom:0.0 to:displayMaxX accuracy:2]; + CGFloat randomY = displayMaxY < 0.0 ? 0.0 : [PLVMarqueeAnimationManager randomDoubleFrom:20.0 to:displayMaxY accuracy:2]; //给layer设置随机位置 [CATransaction begin]; @@ -176,6 +176,9 @@ +(void)addRollAnimation:(CALayer *)layer CGFloat displayMinY = 20.0; CGFloat displayMaxY = displayHeight - layer.frame.size.height * 0.5; CGFloat randomY = [PLVMarqueeAnimationManager randomDoubleFrom:displayMinY to:displayMaxY accuracy:2]; + if (displayHeight < layer.frame.size.height) { + randomY = 0.0; + } CGFloat rollFromPsitionX = displayWidth + layer.frame.size.width * 0.5; CGFloat rollToPsitionX = -layer.frame.size.width * 0.5; if (model.isAlwaysShowWhenRun) { diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/PPT/Controller/PLVPPTVideoViewController.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/PPT/Controller/PLVPPTVideoViewController.m index ca59919..c6449b9 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/PPT/Controller/PLVPPTVideoViewController.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/PPT/Controller/PLVPPTVideoViewController.m @@ -39,6 +39,19 @@ - (void)viewDidLoad { [self.view addSubview:self.player.view]; self.skinView = (PLVVodPlayerSkin *)self.player.playerControl; self.skinView.pptVideoDelegate = self; + + __weak typeof (self) weakSelf = self; + // 跑马灯控制 + self.player.playbackStateHandler = ^(PLVVodPlayerViewController *player) { + //新版跑马灯的启动暂停控制 + if (player.playbackState == PLVVodPlaybackStatePlaying) { + [weakSelf.player.marqueeView start]; + }else if (player.playbackState == PLVVodPlaybackStatePaused) { + [weakSelf.player.marqueeView pause]; + }else if (player.playbackState == PLVVodPlaybackStateStopped) { + [weakSelf.player.marqueeView stop]; + } + }; } - (void)viewWillLayoutSubviews { diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.m index 7a7c69c..0939a72 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.m @@ -438,7 +438,7 @@ - (void)updateCoverView:(PLVVodVideo *)video{ // 非本地文件 if (video.keepSource == NO) { // 非源文件 - fileUrl = video.hlsIndex; + fileUrl = video.isHls302 ? video.hlsIndex2 : video.hlsIndex; }else{ // 源文件 fileUrl = video.play_source_url; diff --git a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Skin/PLVVodSkinPlayerController.m b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Skin/PLVVodSkinPlayerController.m index 7b645c2..e3cec21 100644 --- a/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Skin/PLVVodSkinPlayerController.m +++ b/PolyvVodSDKDemo/PolyvVodSDKDemo/PolyvOpenSourceModule/Skin/PLVVodSkinPlayerController.m @@ -16,7 +16,6 @@ #import #import #import -#import #import #import #import @@ -353,20 +352,13 @@ - (void)viewDidLoad { // 自动播放 //self.autoplay = NO; - - // 设置跑马灯 (旧版) - PLVMarquee *marquee = [[PLVMarquee alloc] init]; - marquee.type = PLVMarqueeTypeRoll; - marquee.displayDuration = 10; - marquee.maxFadeInterval = 5*60; - marquee.maxRollInterval = 5*60; -// marquee.maxFadeInterval = 5; - self.marquee = marquee; // 设置新版跑马灯(2.0) self.marqueeView = [[PLVMarqueeView alloc]init]; + PLVMarqueeModel *marqueeModel = [[PLVMarqueeModel alloc]init]; self.marqueeView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; self.marqueeView.frame = self.maskView.bounds; + [self.marqueeView setPLVMarqueeModel:marqueeModel]; [self.maskView addSubview:self.marqueeView]; // 错误回调 @@ -659,7 +651,7 @@ - (void)updateSkin{ // 线路设置 - (void)setRouteLineView{ PLVVodPlayerSkin *skin = (PLVVodPlayerSkin *)self.playerControl; - if (self.video.keepSource){ + if (self.video.keepSource || self.localPlayback){ // 屏蔽线路切换 [skin setRouteLineFullScreenBtnHidden:YES]; [skin setRouteLineShrinkScreenBtnHidden:YES]; @@ -754,7 +746,7 @@ - (void)setupExam { self.examViewController.examWillShowHandler = ^(PLVVodExam *exam) { [weakSelf pauseWithoutAd]; }; - self.examViewController.examDidCompleteHandler = ^(PLVVodExam *exam, NSTimeInterval backTime) { + self.examViewController.examDidCompleteHandler = ^(PLVVodExam *exam, NSTimeInterval backTime, NSArray *anwserIndexs) { if (backTime >= 0) { #ifdef PLVSupportCustomQuestion @@ -765,8 +757,10 @@ - (void)setupExam { [weakSelf.examViewController changeExams:changeArr showTime:exam.showTime];; #endif - weakSelf.currentPlaybackTime = backTime; + weakSelf.currentPlaybackTime = backTime; } + // 上报答题统计 + [weakSelf saveExamStatitics:exam answer:anwserIndexs]; [weakSelf play]; }; @@ -774,6 +768,33 @@ - (void)setupExam { [self loadExams]; } +- (void)saveExamStatitics:(PLVVodExam *)exam answer:(NSArray *)answerIndexs{ + if (answerIndexs.count){ + NSMutableString *strAnswer = [[NSMutableString alloc] init]; + for (NSNumber *index in answerIndexs){ + NSString *answerText = [exam.options objectAtIndex:[index integerValue]]; + [strAnswer appendString:answerText]; + [strAnswer appendString:@","]; + } + if (strAnswer.length == 0) return; + NSRange range = NSMakeRange(strAnswer.length-1, 1); + [strAnswer deleteCharactersInRange:range]; + NSString *playerId = [self getPlayId]; + [PLVVodExam saveExamStatisticsWithPid:playerId + eid:exam.examId + uid:exam.userId + quesition:exam.question + vid:exam.vid + correct:exam.correct + anwser:strAnswer + completion:^(NSError *error) { + if (error){ + NSLog(@"[保存答题记录失败]"); + } + }]; + } +} + - (void)loadExams{ // 本地播放,从本地获取问答 if (self.localPlayback || [self checkVideoWillPlayLocal:self.video]){ diff --git a/README.md b/README.md index 2c527d9..3b2b607 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ 详细文档请参见 [本项目 wiki](https://github.com/polyv/polyv-ios-vod-sdk/wiki)。 -POLYV iOS VOD SDK [API 接口文档](https://polyv-repo.oss-cn-shenzhen.aliyuncs.com/ios/documents/vodsdk/2.19.1-230721/index.html)。 +POLYV iOS VOD SDK [API 接口文档](https://polyv-repo.oss-cn-shenzhen.aliyuncs.com/ios/documents/vodsdk/2.20.0-230901/index.html)。 ## 更新日志