-
Notifications
You must be signed in to change notification settings - Fork 481
播放记录
changsanjiang edited this page Mar 29, 2020
·
10 revisions
注意: 请确保使用的版本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'
- 导入头文件
#import <SJBaseVideoPlayer/SJPlaybackRecordSaveHandler.h>
- 配置保存播放记录的时机
为方便操作, 大家只需设置需要保存播放记录的时机即可, 下面的这个管理类会在发生指定的事件时, 去保存播放记录. 可通过第三步获取上一次的保存记录.
该管理类是个单例, 只需设置一次即可. 后面创建的播放器的所有播放记录都会被保存.
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;
- 查询或创建一条播放记录
播放之前先查询一下是否存在某条播放记录, 便于在播放一个资源之前, 指定开始播放的位置(可查看第四步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;
}
- 将第三步获取的
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;
}
}