视频内容

视频内容

ZJContentPage接入注意事项

  • 由于内容包没有放在 CocoaPods 的公共仓库,需要⾃⾏将 podspec ⽂件放⼊⼯程⾥,然后在 Podfile ⾥指定路径,参考如下:
 pod 'KSAdSDK', :path => '../ZJSDK/ZJSDKModuleKS/KS' 
  • 如不是通过pod导入,打包发布之前,需要去掉快手内容包的x86_64框架,具体的拆分合并命令参考以下
cd [KSAdSDK.framework所在的目录]
mkdir ./bak
cp -r KSAdSDK.framework ./bak
lipo KSAdSDK.framework/KSAdSDK -thin armv7 -output KSAdSDK_armv7
lipo KSAdSDK.framework/KSAdSDK -thin arm64 -output KSAdSDK_arm64
lipo -create KSAdSDK_armv7 KSAdSDK_arm64 -output KSAdSDK
mv KSAdSDK KSAdSDK.framework/

ZJContentPage说明

@property (nonatomic, readonly) UIViewController *viewController;
///视频状态代理
@property (nonatomic, weak) id <ZJContentPageVideoStateDelegate> videoStateDelegate;
///页面状态代理
@property (nonatomic, weak) id <ZJContentPageStateDelegate> stateDelegate;


///内容标识
@property (nonatomic, copy, readonly) NSString *contentInfoId;
///内容类型
@property (nonatomic, assign, readonly) ZJContentInfoType contentInfoType;

///刷新
- (void)tryToRefresh;

加载视频内容

    self.contentPage = [[ZJContentPage alloc]initWithPlacementId:self.contentId];
    self.contentPage.videoStateDelegate = self;
    self.contentPage.stateDelegate = self;
    UIViewController *vc = self.contentPage.viewController;
    if(vc){
        CGFloat contentY = [UIApplication sharedApplication].statusBarFrame.size.height+self.navigationController.navigationBar.frame.size.height;
        vc.view.frame = CGRectMake(0, contentY, self.view.frame.size.width, self.view.frame.size.height-contentY);
        [self addChildViewController:vc];
        [self.view addSubview:vc.view];
    }else{
        NSLog(@"未能创建对应广告位VC,建议从以下原因排查:\n 1,内容包需要手动导入快手模块(pod公共仓库中的SDK不支持内容包)\n 2,确保sdk已注册成功 \n 3,确保广告位正确可用");
    }

TIP

加载广告具体示例详见Demo中的 : ZJContentPageStyle1ViewController ZJContentPageStyle2ViewController ZJContentPageTabBarController 其他样式: ZJFeedPageViewController //瀑布流 ZJHorizontalFeedPageVC //横版

推荐使用以下对接方式,对接视频内容,包括视频内容列表,视频内容瀑布流,视频内容横版

TIP

新对接方式支持ZJSDK '2.5.9.8'及其以上版本,之前的版本请使用上面的对接方式对接

视频内容列表对接

视频内容列表说明

///视频状态代理
@property (nonatomic, weak) id <ZJContentPageVideoStateDelegate> videoStateDelegate;
///页面状态代理
@property (nonatomic, weak) id <ZJContentPageStateDelegate> stateDelegate;

/// 处理视频内容加载成功和失败的代理方法
@property (nonatomic, weak) id <ZJContentPageLoadCallBackDelegate> loadCallBackDelegate;

/// 刷新内容页
- (void)tryToRefresh;

/// 内容页的ViewController
- (UIViewController *)contentPageViewController
@protocol ZJContentPageVideoStateDelegate <NSObject>
@optional
/**
 * 视频开始播放
 * @param videoContent 内容模型
 */
- (void)zj_videoDidStartPlay:(id<ZJContentInfo>)videoContent;
/**
* 视频暂停播放
* @param videoContent 内容模型
*/
- (void)zj_videoDidPause:(id<ZJContentInfo>)videoContent;
/**
* 视频恢复播放
* @param videoContent 内容模型
*/
- (void)zj_videoDidResume:(id<ZJContentInfo>)videoContent;
/**
* 视频停止播放
* @param videoContent 内容模型
* @param finished     是否播放完成
*/
- (void)zj_videoDidEndPlay:(id<ZJContentInfo>)videoContent isFinished:(BOOL)finished;
/**
* 视频播放失败
* @param videoContent 内容模型
* @param error        失败原因
*/
- (void)zj_videoDidFailedToPlay:(id<ZJContentInfo>)videoContent withError:(NSError *)error;
@end
@protocol ZJContentPageStateDelegate <NSObject>
@optional
/**
* 内容展示
* @param content 内容模型
*/
- (void)zj_contentDidFullDisplay:(id<ZJContentInfo>)content;
/**
* 内容隐藏
* @param content 内容模型
*/
- (void)zj_contentDidEndDisplay:(id<ZJContentInfo>)content;
/**
* 内容暂停显示,ViewController disappear或者Application resign active
* @param content 内容模型
*/
- (void)zj_contentDidPause:(id<ZJContentInfo>)content;
/**
* 内容恢复显示,ViewController appear或者Application become active
* @param content 内容模型
*/
- (void)zj_contentDidResume:(id<ZJContentInfo>)content;

/// 任务完成回调
- (void)zjAdapter_contentTaskComplete:(id<ZJContentInfo>)content;
@end

/// 处理内容加载成功和失败的代理方法
@protocol ZJContentPageLoadCallBackDelegate <NSObject>

@optional
/// 内容加载成功
- (void)zj_contentPageLoadSuccess;

/// 内容加载失败
- (void)zj_contentPageLoadFailure:(NSError *)error;

@end
// 视频内容列表方法使用
// 加载广告
self.contentPageAd = [[ZJContentPageAd alloc]initWithPlacementId:adId];
self.contentPageAd.videoStateDelegate = self;
self.contentPageAd.stateDelegate = self;
self.contentPageAd.loadCallBackDelegate = self;
[self.contentPageAd loadAd];

// 展示广告
self.contentPageVC = self.contentPageAd.contentPageViewController;
[self addChildViewController:self.contentPageVC];
[self.view addSubview:self.contentPageVC.view];
[self.contentPageVC.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

视频内容瀑布流

视频内容瀑布流说明

@interface ZJFeedPageAd : ZJAd

///视频状态代理,
@property (nonatomic, weak) id <ZJContentPageVideoStateDelegate> videoStateDelegate;
///页面状态代理
@property (nonatomic, weak) id <ZJContentPageStateDelegate> stateDelegate;

/// 处理视频内容加载成功和失败的代理方法
@property (nonatomic, weak) id <ZJContentPageLoadCallBackDelegate> loadCallBackDelegate;

/// 内容页的ViewController
- (UIViewController *)feedPageViewController;

@end
@protocol ZJContentPageVideoStateDelegate <NSObject>
@optional
/**
 * 视频开始播放
 * @param videoContent 内容模型
 */
- (void)zj_videoDidStartPlay:(id<ZJContentInfo>)videoContent;
/**
* 视频暂停播放
* @param videoContent 内容模型
*/
- (void)zj_videoDidPause:(id<ZJContentInfo>)videoContent;
/**
* 视频恢复播放
* @param videoContent 内容模型
*/
- (void)zj_videoDidResume:(id<ZJContentInfo>)videoContent;
/**
* 视频停止播放
* @param videoContent 内容模型
* @param finished     是否播放完成
*/
- (void)zj_videoDidEndPlay:(id<ZJContentInfo>)videoContent isFinished:(BOOL)finished;
/**
* 视频播放失败
* @param videoContent 内容模型
* @param error        失败原因
*/
- (void)zj_videoDidFailedToPlay:(id<ZJContentInfo>)videoContent withError:(NSError *)error;
@end
@protocol ZJContentPageStateDelegate <NSObject>
@optional
/**
* 内容展示
* @param content 内容模型
*/
- (void)zj_contentDidFullDisplay:(id<ZJContentInfo>)content;
/**
* 内容隐藏
* @param content 内容模型
*/
- (void)zj_contentDidEndDisplay:(id<ZJContentInfo>)content;
/**
* 内容暂停显示,ViewController disappear或者Application resign active
* @param content 内容模型
*/
- (void)zj_contentDidPause:(id<ZJContentInfo>)content;
/**
* 内容恢复显示,ViewController appear或者Application become active
* @param content 内容模型
*/
- (void)zj_contentDidResume:(id<ZJContentInfo>)content;

/// 任务完成回调
- (void)zjAdapter_contentTaskComplete:(id<ZJContentInfo>)content;
@end

/// 处理内容加载成功和失败的代理方法
@protocol ZJContentPageLoadCallBackDelegate <NSObject>

@optional
/// 内容加载成功
- (void)zj_contentPageLoadSuccess;

/// 内容加载失败
- (void)zj_contentPageLoadFailure:(NSError *)error;

@end
// 视频内容瀑布流方法使用
// 加载
self.contentPage = [[ZJFeedPageAd alloc] initWithPlacementId:self.contentId];
self.contentPage.videoStateDelegate = self;
self.contentPage.stateDelegate = self;
self.contentPage.loadCallBackDelegate = self;
[self.contentPage loadAd];

// 显示
UIViewController *vc = self.contentPage.feedPageViewController;
vc.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self addChildViewController:vc];
[self.view addSubview:vc.view];

视频内容横版

视频内容横版说明

///视频状态代理
@property (nonatomic, weak) id <ZJContentPageVideoStateDelegate> videoStateDelegate;
///页面状态代理
@property (nonatomic, weak) id <ZJContentPageStateDelegate> stateDelegate;

/// 处理视频内容加载成功和失败的代理方法
@property (nonatomic, weak) id <ZJContentPageLoadCallBackDelegate> loadCallBackDelegate;

- (UIViewController *)horizontalFeedPageViewController;
@protocol ZJContentPageVideoStateDelegate <NSObject>
@optional
/**
 * 视频开始播放
 * @param videoContent 内容模型
 */
- (void)zj_videoDidStartPlay:(id<ZJContentInfo>)videoContent;
/**
* 视频暂停播放
* @param videoContent 内容模型
*/
- (void)zj_videoDidPause:(id<ZJContentInfo>)videoContent;
/**
* 视频恢复播放
* @param videoContent 内容模型
*/
- (void)zj_videoDidResume:(id<ZJContentInfo>)videoContent;
/**
* 视频停止播放
* @param videoContent 内容模型
* @param finished     是否播放完成
*/
- (void)zj_videoDidEndPlay:(id<ZJContentInfo>)videoContent isFinished:(BOOL)finished;
/**
* 视频播放失败
* @param videoContent 内容模型
* @param error        失败原因
*/
- (void)zj_videoDidFailedToPlay:(id<ZJContentInfo>)videoContent withError:(NSError *)error;

/// 进入横版视频详情页
/// @param viewController 详情页VC
/// @param content 视频信息
- (void)zj_horizontalFeedVideoDetailDidEnter:(UIViewController *)viewController contentInfo:(id<ZJContentInfo>)content;

/// 离开横版视频详情页
/// @param viewController 详情页VC
- (void)zj_horizontalFeedVideoDetailDidLeave:(UIViewController *)viewController;

/// 视频详情页appear
/// @param viewController 详情页VC
- (void)zj_horizontalFeedVideoDetailDidAppear:(UIViewController *)viewController;

/// 详情页disappear
/// @param viewController 详情页VC
- (void)zj_horizontalFeedVideoDetailDidDisappear:(UIViewController *)viewController;


@end
@protocol ZJContentPageStateDelegate <NSObject>
@optional
/**
* 内容展示
* @param content 内容模型
*/
- (void)zj_contentDidFullDisplay:(id<ZJContentInfo>)content;
/**
* 内容隐藏
* @param content 内容模型
*/
- (void)zj_contentDidEndDisplay:(id<ZJContentInfo>)content;
/**
* 内容暂停显示,ViewController disappear或者Application resign active
* @param content 内容模型
*/
- (void)zj_contentDidPause:(id<ZJContentInfo>)content;
/**
* 内容恢复显示,ViewController appear或者Application become active
* @param content 内容模型
*/
- (void)zj_contentDidResume:(id<ZJContentInfo>)content;

/// 任务完成回调
- (void)zjAdapter_contentTaskComplete:(id<ZJContentInfo>)content;
@end

/// 处理内容加载成功和失败的代理方法
@protocol ZJContentPageLoadCallBackDelegate <NSObject>

@optional
/// 内容加载成功
- (void)zj_contentPageLoadSuccess;

/// 内容加载失败
- (void)zj_contentPageLoadFailure:(NSError *)error;

@end
// 视频内容横版方法使用
self.contentPage = [[ZJHorizontalFeedPageAd alloc]initWithPlacementId:self.contentId];
self.contentPage.videoStateDelegate = self;
self.contentPage.stateDelegate = self;
self.contentPage.loadCallBackDelegate = self;
// 加载
[self.contentPage loadAd];

// 展示
UIViewController *vc = self.contentPage.horizontalFeedPageViewController;
vc.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self addChildViewController:vc];
[self.view addSubview:vc.view];

TIP

视频内容横版videoStateDelegate比其他类型的代理方法多了一些方法回调