Skip to content

播放记录

changsanjiang edited this page Mar 29, 2020 · 10 revisions

In this page


注意: 请确保使用的版本v3.2.0以上.

准备工作:

  • 修改podfile, 增加如下内容:
  # 该pod封装了SQLite数据库, 便于保存记录到数据库中
  pod 'SJUIKit/SQLite3', :podspec => 'https://gitee.com/changsanjiang/SJUIKit/raw/master/SJUIKit-YYModel.podspec'
  # 如果你的项目依赖了'YYKit', 可修改如下方式进行安装:
  # pod 'SJUIKit/SQLite3', :podspec => 'https://gitee.com/changsanjiang/SJUIKit/raw/master/SJUIKit-YYKit.podspec'

开始

  1. 导入头文件
#import <SJBaseVideoPlayer/SJPlaybackRecordSaveHandler.h>
  1. 配置保存播放记录的时机 为方便操作, 大家只需设置需要保存播放记录的时机即可, 下面的这个管理类会在发生指定的事件时, 去保存播放记录. 可通过第三步获取上一次的保存记录.
    该管理类是个单例, 只需设置一次即可. 后面创建的播放器的所有播放记录都会被保存.
    SJPlaybackRecordSaveHandler *handler = SJPlaybackRecordSaveHandler.shared;
    // 设置保存时机, 当某个事件发生后, 将会触发保存播放记录的操作
    // 正常设置全部事件(SJPlayerEventMaskAll)即可
    handler.events = SJPlayerEventMaskAll;

//
// 以下为保存时机的可选值:  
//
//typedef enum : NSUInteger {
//    ///
//    /// 播放器资源将要改变时
//    ///
//    SJPlayerEventMaskURLAssetWillChange = 1 << SJPlayerEventURLAssetWillChange,
//
//    ///
//    /// 播放控制将要销毁前
//    ///
//    SJPlayerEventMaskPlaybackControllerWillDeallocate = 1 << SJPlayerEventPlaybackControllerWillDeallocate,
//    ///
//    /// 播放器执行了暂停
//    ///
//    SJPlayerEventMaskPlaybackDidPause = 1 << SJPlayerEventPlaybackDidPause,
//    ///
//    /// 播放器将要执行stop前
//    ///
//    SJPlayerEventMaskPlaybackWillStop = 1 << SJPlayerEventPlaybackWillStop,
//    ///
//    /// 播放器将要执行refresh前
//    ///
//    SJPlayerEventMaskPlaybackWillRefresh = 1 << SJPlayerEventPlaybackWillRefresh,
//    
//    ///
//    /// 播放器接收到App进入后台时
//    ///
//    SJPlayerEventMaskApplicationDidEnterBackground = 1 << SJPlayerEventApplicationDidEnterBackground,
//    ///
//    /// 播放器接收到App将要销毁时
//    ///
//    SJPlayerEventMaskApplicationWillTerminate = 1 << SJPlayerEventApplicationWillTerminate,
//    
//    /// 所有的播放事件
//    SJPlayerEventMaskPlaybackEvents = SJPlayerEventMaskPlaybackControllerWillDeallocate | SJPlayerEventMaskPlaybackWillStop | SJPlayerEventMaskPlaybackWillRefresh | SJPlayerEventMaskPlaybackDidPause,
//    
//    // 所有的App事件
//    SJPlayerEventMaskApplicationEvents = SJPlayerEventMaskApplicationDidEnterBackground | SJPlayerEventMaskApplicationWillTerminate,
//    
//    // 以上全部事件
//    SJPlayerEventMaskAll = (SJPlayerEventMaskURLAssetWillChange | SJPlayerEventMaskPlaybackEvents | SJPlayerEventMaskApplicationEvents),
//} SJPlayerEventMask;
  1. 查询或创建一条播放记录 播放之前先查询一下是否存在某条播放记录, 便于在播放一个资源之前, 指定开始播放的位置(可查看第四步startPosition) 每条播放记录是通过视频的id当前登录的用户id来标识的. 当通过视频id和用户id获取时, 如果存在, 则返回该条记录, 不存在, 则返回nil. 当不存在时, 需要大家自己来创建一条记录, 并设置相应的视频id用户id(一定要记得设置).
    NSInteger mediaId = currentVideo.id;
    NSInteger userId = SJUser.shared.id;
    // 查询   
    SJPlaybackRecord *record = [SJPlaybackHistoryController.shared recordForMedia:mediaId user:userId];
    if ( record == nil ) {
        // 如不存在则创建一条记录
        record = SJPlaybackRecord.alloc.init;
        record.mediaId = mediaId;
        record.userId = userId; 
    }
  1. 将第三步获取的record对象关联到asset中 当关联到当前的播放资源上时, 在发生某个事件后, 管理类就会通过asset.record获取到该条记录, 进行保存的操作. 因此这一步是非常关键的一步.
    SJVideoPlayerURLAsset *asset = [SJVideoPlayerURLAsset.alloc initWithURL:currentVideo.URL startPosition:record.position];
    // - 为将要播放的 asset 关联一个 record, 后续管理类将会在合适的时机将其保存到`SJPlaybackHistoryController`中
    asset.record = record;
    // - 进行播放
    self.player.URLAsset = asset;

完成以上步骤, 即可实现播放记录的功能. 管理类将会在指定的时机保存播放记录.


一些补充

  • 可为每条记录扩展自己的业务属性 当大家需要展示播放记录时, 一些UI中可能要显示标题和一些其他的信息, 我们需要对每条记录扩展相应的属性, 使其保存到数据库中, 如下操作即可:
///
/// 这里对 record 类扩展了一个属性, 在保存记录时会自动保存到数据库中
/// 你可以按照这种方式, 扩展一些自己的业务属性, 在第三步创建播放记录时, 进行赋值操作, 使其能够保存到数据库中
///
/// 第一步
@interface SJPlaybackRecord (SJTestExtended)
@property (nonatomic, copy, nullable) NSString *title;
@end

@implementation SJPlaybackRecord (SJTestExtended)
- (void)setTitle:(nullable NSString *)title {
    objc_setAssociatedObject(self, @selector(title), title, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (nullable NSString *)title {
    return objc_getAssociatedObject(self, _cmd); 
}
@end

- (void)test {
    SJPlaybackRecord *record = [SJPlaybackHistoryController.shared recordForMedia:mediaId user:userId];
    if ( record == nil ) {
        record = SJPlaybackRecord.alloc.init;
        record.mediaId = mediaId;
        record.userId = userId; 
        
// 第二步
// 为扩充的属性进行赋值
        record.title = currentVideo.title;
    }
}
Clone this wiki locally