Commit 03a5ae91 authored by zhaowl123's avatar zhaowl123

4.15.1上线

parent 74c8e94e
No preview for this file type
......@@ -75,6 +75,7 @@ typedef enum : NSUInteger {
playInfo.timeoutSeconds = 30;
//音频 + 视频数据,这里仅做示范,可根据自己项目业务逻辑来调整
playInfo.mediatype = @"0";
playInfo.isAllow = NO;//默认是NO YES:拖拽的时候不显示答题器
//开启授权验证功能传入
playInfo.verificationCode = [DWConfigurationManager sharedInstance].verification;
//客户端用户id,选填
......
......@@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, copy) NSString *jump;//是否允许跳过
@property (nonatomic, copy) NSArray <answers *> *answers;
@property (nonatomic, assign) BOOL isShow;//是否显示过
@property (nonatomic, copy) NSString *backSecond;// -1 没有回放按钮
@end
@interface answers : NSObject
......
......@@ -11,7 +11,8 @@
NS_ASSUME_NONNULL_BEGIN
typedef void(^DWContinueBlock)(void);//继续播放
typedef void(^DWSubmitBlock)(NSDictionary *);//提交答案
typedef void(^DWSubmitBlock)(NSDictionary *dict);//提交答案
typedef void(^DWPlaybackBlock)(DWAnswerModel *model);//回放按钮
@interface DWAnswerView : UIView
- (void)showDWAnswerViewWithModel:(DWAnswerModel *)model;
@property (nonatomic, strong) UIButton *submitOrContinueBtn;//继续播放按钮 提交答案按钮
......@@ -24,6 +25,7 @@ typedef void(^DWSubmitBlock)(NSDictionary *);//提交答案
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, copy) DWContinueBlock continueBlock;
@property (nonatomic, copy) DWSubmitBlock submitBlock;
@property (nonatomic, copy) DWPlaybackBlock playbackBlock;
@end
NS_ASSUME_NONNULL_END
......@@ -13,7 +13,6 @@
#define ScreenW [UIScreen mainScreen].bounds.size.width
#define ScreenH [UIScreen mainScreen].bounds.size.height
#define iPhoneX (((int)((ScreenH/ScreenW)*100) == 216)?YES:NO)
/** 状态栏高度 */
#define JooStatusHeight (iPhoneX?44:20)
/** 顶部高度(安全区域的顶部) */
......@@ -466,11 +465,38 @@
[_submitOrContinueBtn addTarget:self action:@selector(handleContinueBtn) forControlEvents:UIControlEventTouchUpInside];
[_errorReminderView addSubview:_submitOrContinueBtn];
[_submitOrContinueBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(_errorReminderView.mas_centerX);
if([_model.backSecond isEqualToString:@"-1"]){
make.centerX.equalTo(_errorReminderView.mas_centerX);
}else{
make.left.equalTo(_errorReminderView.mas_centerX).offset(15);
}
make.bottom.equalTo(_errorReminderView).offset(-5);
make.width.equalTo(@100);
make.height.equalTo(@32);
}];
_jumpBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[_jumpBtn setTitle:@"回放" forState:0];
[_jumpBtn setTitleColor:ColorFrom16A(0xFF6E0A, 1) forState:0];
_jumpBtn.layer.cornerRadius = 16;
_jumpBtn.titleLabel.font = DWFont(12);
_jumpBtn.hidden = YES;
[_jumpBtn addTarget:self action:@selector(handlePlaybackBtn) forControlEvents:UIControlEventTouchUpInside];
_jumpBtn.layer.masksToBounds = YES;
_jumpBtn.backgroundColor = ColorFrom16A(0xffffff, 0.8);
[_errorReminderView addSubview:_jumpBtn];
[_jumpBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(_errorReminderView).offset(-5);
make.right.equalTo(_errorReminderView.mas_centerX).offset(-15);
make.width.equalTo(@100);
make.height.equalTo(@32);
}];
if([_model.backSecond isEqualToString:@"-1"]){//如果是-1则不展示回放按钮
_jumpBtn.hidden = YES;
}else{
_jumpBtn.hidden = NO;
}
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
......@@ -559,6 +585,15 @@
}];
}
#pragma mark - 回放按钮
- (void)handlePlaybackBtn{
[self removeFromSuperview];
[self.errorReminderView removeFromSuperview];
if(self.playbackBlock){
self.playbackBlock(_model);
}
}
#pragma mark - 继续播放
- (void)handleContinueBtn{
......
......@@ -158,6 +158,8 @@
//**************************** 答题器 *****************************
@property (nonatomic, strong) DWAnswerView *answerView;//答题器
@property (nonatomic, strong) NSMutableArray *answerArr;
//@property (nonatomic, strong) UISwitch *switchBtn;//gw test
@property (nonatomic, assign) BOOL isAsAllowShow;//是否显示答题器默认是YES显示
//**************************** 视频字幕 ****************************
@property(nonatomic,strong)NSMutableArray <DWTableChooseModel *> * subTitleArray;//字幕数组
......@@ -197,6 +199,7 @@
@property (nonatomic,assign)CGFloat exercisesFrontScrubTime;//记录回退时间
@property (nonatomic,assign)CGFloat exercisesLastScrubTime;//记录当前时间
@property (nonatomic, assign) CGFloat drawTime;//记录拖拽的时间点
@property (nonatomic,strong)DWExercisesAlertView * exercisesAlertView;//课堂练习提示View
@property (nonatomic,strong)DWExercisesView * exercisesView;//课堂练习view
......@@ -243,7 +246,6 @@ static CGFloat barrageBgHeight = 40;
if (self == [super init]) {
[UIApplication sharedApplication].idleTimerDisabled = YES;
self.isFull = NO;
self.isShowMarkView = NO;
self.isLock = NO;
......@@ -334,10 +336,22 @@ static CGFloat barrageBgHeight = 40;
//
// self.testTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(testTimeAction) userInfo:nil repeats:YES];
// [[NSRunLoop mainRunLoop] addTimer:self.testTimer forMode:NSRunLoopCommonModes];
//gw test
// _switchBtn = [[UISwitch alloc] initWithFrame:CGRectMake(100, 50, 80, 40)];
// _switchBtn.on = YES;
_isAsAllowShow = YES;//默认打开
// [_switchBtn addTarget:self action:@selector(handleSiwtchBtn:) forControlEvents:UIControlEventValueChanged];
// [self addSubview:_switchBtn];
}
return self;
}
//- (void)handleSiwtchBtn:(UISwitch *)sender{
// _switchBtn.on = sender.on;
// _isAsAllowShow = sender.on;
//}
//-(void)testTimeAction
//{
// self.testLabel.text = [NSString stringWithFormat:@"播放时长:%.2fs \n暂停时长:%.2fs",self.playerView.playedTimes,self.playerView.pausedTimes];
......@@ -405,6 +419,8 @@ static CGFloat barrageBgHeight = 40;
//在线视频加载封面图
[self loadImgWithURL:self.videoModel.img];
if(_answerView){
[_answerView removeFromSuperview];
_answerView = nil;
......@@ -1269,6 +1285,7 @@ static CGFloat barrageBgHeight = 40;
// }
self.switchTime = playTime;
_drawTime = playTime;
}
//切换备用线路
......@@ -1334,6 +1351,7 @@ static CGFloat barrageBgHeight = 40;
[[NSString stringWithFormat:@"开始下载:%@",vodVideo.title] showAlert];
}
#pragma mark - 进度条拖动
-(void)sliderScrubWithValue:(CGFloat)value
{
//未加载完成,不触发拖拽事件
......@@ -1396,6 +1414,7 @@ static CGFloat barrageBgHeight = 40;
[self play];
}];
_drawTime = time;
}
-(void)writeSliderWithVideoID:(NSString *)videoID
......@@ -2207,6 +2226,7 @@ static CGFloat barrageBgHeight = 40;
}
//视频打点以及slider点击事件
#pragma mark - 进度条点击时间
- (void)sliderTapAction:(UITapGestureRecognizer *)tap
{
CGPoint point = [tap locationInView:self.slider];
......@@ -2585,6 +2605,7 @@ static CGFloat barrageBgHeight = 40;
[self removeQuestionAndFeedBackView];
[self.playerView scrub:model.backSecond];
[self play];
self.drawTime = model.backSecond;
};
self.feedBackView.resumeBlock = ^{
......@@ -2596,14 +2617,24 @@ static CGFloat barrageBgHeight = 40;
#pragma mark - 答题器功能
- (void)showAswerView:(float)time{
NSLog(@"----- gw %f %f %f", self.currentPlayDuration, self.exercisesLastScrubTime, self.drawTime);
for (DWAnswerModel *answerModel in self.answerArr) {
NSLog(@"++++++++ %@ %d", answerModel.showTime, answerModel.isShow);
if (answerModel.showTime.integerValue <= (NSInteger)time && !answerModel.isShow) {
// if (_answerView) {
// break;
// }
// videoModel.isDrawAllow YES 拖拽的时候不展示答题器
if(self.videoModel.isDrawAllow == YES && ((int)self.currentPlayDuration - (int)self.exercisesLastScrubTime >=0 && self.currentPlayDuration > answerModel.showTime.floatValue) ){
// answerModel.isShow = YES;
continue;;
}
if(self.videoModel.isDrawAllow){
if(self.drawTime > answerModel.showTime.floatValue){
continue;;
}
}
if(_isAsAllowShow == NO){//答题器开关 默认是开
return;
}
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:answerModel.showTime];
NSLog(@"播放的时间点 %@", arr);
......@@ -2623,6 +2654,14 @@ static CGFloat barrageBgHeight = 40;
[self resumeVideoPlay];
self.answerView = nil;
};
self.answerView.playbackBlock = ^(DWAnswerModel * _Nonnull model) {//回放
@strongify(self);
[self.playerView scrub:[model.backSecond floatValue]];
[self play];
self.answerView = nil;
self.drawTime = [model.backSecond floatValue];
};
break;
}
}
......@@ -3217,6 +3256,7 @@ static CGFloat barrageBgHeight = 40;
//答对继续播放,答错返回课堂练习回看时间
if (!correct) {
[self.playerView scrub:exercisesModel.backSecond];
self.drawTime = exercisesModel.backSecond;
}else{
[self.playerView scrub:self.exercisesView.lastScrubTime];
}
......
......@@ -20,6 +20,10 @@
{
[DWLog setIsDebugHttpLog:YES];
[CCCrash becomeEffective:NO];
[CCCrash setOpenEvent];
[CCCrash updateBaseParam:@{@"business":@"1001"} BusinessParam:@{}];
//设置AVAudioSession
NSError *categoryError = nil;
BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&categoryError];
......
//版本号
#define SDK_VERSION @"4.15.0"
#define SDK_VERSION @"4.15.1"
#import <CCVodSDK/DWGIFManager.h>
#import <CCVodSDK/DWAdInfo.h>
......
......@@ -43,6 +43,8 @@ typedef void (^DWPlayInfoFinishBlock)(DWVodVideoModel * vodVideo);
*/
@property(copy, nonatomic)DWPlayInfoFinishBlock finishBlock;
@property (nonatomic, assign) BOOL isAllow;
/*!
* @method
* @abstract 初始化方法
......
......@@ -166,6 +166,10 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, copy) NSArray *reskeys;//答题器权限 便利数组如果有video_clicker 表明有问答器
//是否允许拖拽跳过答题器 默认NO 就是原有的逻辑 YES:拖拽情况下的答题器不展示,正常播放的展示
@property (nonatomic, assign) BOOL isDrawAllow;//答题器 是否允许拖拽显示
@end
///清晰度数据模型
......
//
// CCCrash.h
// CC_Test
//
// Created by hd on 2021/6/3.
//
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#define CCCrashNotification @"CCCrashNotification"
#define CCCrashIsiOS(version) ([[UIDevice currentDevice].systemVersion floatValue] >= version)
//user can ignore below define
#define CCCrashDefaultReturnNil @"CCCrash default is to return nil to CC crash."
#define CCCrashDefaultIgnore @"CCCrash default is to ignore this operation to CC crash."
#define CCCrashSeparator @"================================================================"
#define CCCrashSeparatorWithFlag @"========================CCCrash Log=========================="
#ifdef DEBUG
#define CCCrashLog(...) NSLog(@"%@",[NSString stringWithFormat:__VA_ARGS__])
#else
#define CCCrashLog(...)
#endif
#define JooEqual(s1,s2) [s1 isEqualToString:s2]
/** 判断 字符串 是否空 */
#define JooStringNil(str) (str == nil || JooEqual(@"",str ) || [str isKindOfClass:[NSNull class]] || JooEqual(@" ",str ) || [str isEqual:[NSNull null]] )
@interface CCCrash : NSObject
/**
*
*开始生效.你可以在AppDelegate的didFinishLaunchingWithOptions方法中调用becomeEffective方法
*isOpen:是否开启崩溃拦截 默认是NO
*/
+ (void)becomeEffective:(BOOL)isOpen;
/*
*首先需要传event事件
*event: open 启动app时传
*event: firstExecute 首次初始化sdk传
*event: execute 每次执行业务传
*/
+ (void)setOpenEvent;
+ (void)setFirstExecuteEvent;
+ (void)setExecuteEvent;
/**
*@param baseParam 需要上传字段如下
*userid:业务线自己的C端用户id
*appid:客户ID
*business:业务线
*ua:用户UserAgent
*appVer:应用版本号 各业务线当前SDK版本号
*
*@param businessParam 详细请看接口文档
*http://wiki.bokecc.com/pages/viewpage.action?pageId=26871273
**/
+ (void)updateBaseParam:(NSDictionary *)baseParam BusinessParam:(NSDictionary *)businessParam;
//以下不对外使用 不用调用
+ (void)exchangeClassMethod:(Class)anClass method1Sel:(SEL)method1Sel method2Sel:(SEL)method2Sel;
+ (void)exchangeInstanceMethod:(Class)anClass method1Sel:(SEL)method1Sel method2Sel:(SEL)method2Sel;
+ (void)noteErrorWithException:(NSException *)exception defaultToDo:(NSString *)defaultToDo;
@end
......@@ -17,7 +17,7 @@ FOUNDATION_EXPORT const unsigned char HDBaseUtilsVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <HDBaseUtils/PublicHeader.h>
//base库版本号
#define HDBASESDK_VERSION @"1.0.10"
#define HDBASESDK_VERSION @"1.1.1"
#import <HDBaseUtils/HDUniversalUtils.h>
......@@ -41,4 +41,5 @@ FOUNDATION_EXPORT const unsigned char HDBaseUtilsVersionString[];
#import <HDBaseUtils/HDSReportClient.h>
#import <HDBaseUtils/CCCrash.h>
......@@ -54,4 +54,39 @@ typedef void(^HDSFailureBlock)(id responseObject,NSError *error);
Success:(HDSSuccessBlock)success
Failure:(HDSFailureBlock)failure;
/*!
* @method
* @abstract GET请求
* @discussion get请求
* @param URLString url
* @param headers 请求头headers
* @param params 请求参数,get请求默认拼接到url上
* @param success 请求成功回调
* @param failure 请求失败回调
* @result DWHTTPRequest对象
*/
+(DWHTTPRequest *)GET:(NSString *)URLString
Headers:(NSDictionary *)headers
Params:(NSDictionary *)params
Success:(HDSSuccessBlock)success
Failure:(HDSFailureBlock)failure;
/*!
* @method
* @abstract POST请求
* @discussion POST请求
* @param headers 请求头headers
* @param params 请求参数,post请求添加到body上
* @param success 请求成功回调
* @param failure 请求失败回调
* @result DWHTTPRequest对象
*/
+(DWHTTPRequest *)POST:(NSString *)URLString
Headers:(NSDictionary *)headers
Params:(NSDictionary *)params
Success:(HDSSuccessBlock)success
Failure:(HDSFailureBlock)failure;
@end
......@@ -52,7 +52,12 @@ NS_ASSUME_NONNULL_BEGIN
@end
//上传日志网络请求回调用于清除崩溃日志的缓存
typedef void(^HDS_SuccessBlock)(void);
@interface HDSReportClient : NSObject
@property (nonatomic, copy) HDS_SuccessBlock successBlock;
#pragma mark -- 新版API
/**
* @param business 业务类型
......@@ -74,9 +79,15 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark -- 旧版API
/** 云课堂旧版本使用 */
/** 云课堂旧版本使用 暂无人使用 */
- (void)reportLogInfo:(HDSReportInfo *)info;
/**
*崩溃日志的上报
*param:传的各个业务端的业务字段
*/
- (void)reportCrash:(NSDictionary *)param;
@end
NS_ASSUME_NONNULL_END
//版本号
#define SDK_VERSION @"4.15.0"
#define SDK_VERSION @"4.15.1"
#import <CCVodSDK/DWGIFManager.h>
#import <CCVodSDK/DWAdInfo.h>
......
......@@ -43,6 +43,8 @@ typedef void (^DWPlayInfoFinishBlock)(DWVodVideoModel * vodVideo);
*/
@property(copy, nonatomic)DWPlayInfoFinishBlock finishBlock;
@property (nonatomic, assign) BOOL isAllow;
/*!
* @method
* @abstract 初始化方法
......
......@@ -166,6 +166,10 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, copy) NSArray *reskeys;//答题器权限 便利数组如果有video_clicker 表明有问答器
//是否允许拖拽跳过答题器 默认NO 就是原有的逻辑 YES:拖拽情况下的答题器不展示,正常播放的展示
@property (nonatomic, assign) BOOL isDrawAllow;//答题器 是否允许拖拽显示
@end
///清晰度数据模型
......
//
// CCCrash.h
// CC_Test
//
// Created by hd on 2021/6/3.
//
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#define CCCrashNotification @"CCCrashNotification"
#define CCCrashIsiOS(version) ([[UIDevice currentDevice].systemVersion floatValue] >= version)
//user can ignore below define
#define CCCrashDefaultReturnNil @"CCCrash default is to return nil to CC crash."
#define CCCrashDefaultIgnore @"CCCrash default is to ignore this operation to CC crash."
#define CCCrashSeparator @"================================================================"
#define CCCrashSeparatorWithFlag @"========================CCCrash Log=========================="
#ifdef DEBUG
#define CCCrashLog(...) NSLog(@"%@",[NSString stringWithFormat:__VA_ARGS__])
#else
#define CCCrashLog(...)
#endif
#define JooEqual(s1,s2) [s1 isEqualToString:s2]
/** 判断 字符串 是否空 */
#define JooStringNil(str) (str == nil || JooEqual(@"",str ) || [str isKindOfClass:[NSNull class]] || JooEqual(@" ",str ) || [str isEqual:[NSNull null]] )
@interface CCCrash : NSObject
/**
*
*开始生效.你可以在AppDelegate的didFinishLaunchingWithOptions方法中调用becomeEffective方法
*isOpen:是否开启崩溃拦截 默认是NO
*/
+ (void)becomeEffective:(BOOL)isOpen;
/*
*首先需要传event事件
*event: open 启动app时传
*event: firstExecute 首次初始化sdk传
*event: execute 每次执行业务传
*/
+ (void)setOpenEvent;
+ (void)setFirstExecuteEvent;
+ (void)setExecuteEvent;
/**
*@param baseParam 需要上传字段如下
*userid:业务线自己的C端用户id
*appid:客户ID
*business:业务线
*ua:用户UserAgent
*appVer:应用版本号 各业务线当前SDK版本号
*
*@param businessParam 详细请看接口文档
*http://wiki.bokecc.com/pages/viewpage.action?pageId=26871273
**/
+ (void)updateBaseParam:(NSDictionary *)baseParam BusinessParam:(NSDictionary *)businessParam;
//以下不对外使用 不用调用
+ (void)exchangeClassMethod:(Class)anClass method1Sel:(SEL)method1Sel method2Sel:(SEL)method2Sel;
+ (void)exchangeInstanceMethod:(Class)anClass method1Sel:(SEL)method1Sel method2Sel:(SEL)method2Sel;
+ (void)noteErrorWithException:(NSException *)exception defaultToDo:(NSString *)defaultToDo;
@end
......@@ -17,7 +17,7 @@ FOUNDATION_EXPORT const unsigned char HDBaseUtilsVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <HDBaseUtils/PublicHeader.h>
//base库版本号
#define HDBASESDK_VERSION @"1.0.10"
#define HDBASESDK_VERSION @"1.1.1"
#import <HDBaseUtils/HDUniversalUtils.h>
......@@ -41,4 +41,5 @@ FOUNDATION_EXPORT const unsigned char HDBaseUtilsVersionString[];
#import <HDBaseUtils/HDSReportClient.h>
#import <HDBaseUtils/CCCrash.h>
......@@ -54,4 +54,39 @@ typedef void(^HDSFailureBlock)(id responseObject,NSError *error);
Success:(HDSSuccessBlock)success
Failure:(HDSFailureBlock)failure;
/*!
* @method
* @abstract GET请求
* @discussion get请求
* @param URLString url
* @param headers 请求头headers
* @param params 请求参数,get请求默认拼接到url上
* @param success 请求成功回调
* @param failure 请求失败回调
* @result DWHTTPRequest对象
*/
+(DWHTTPRequest *)GET:(NSString *)URLString
Headers:(NSDictionary *)headers
Params:(NSDictionary *)params
Success:(HDSSuccessBlock)success
Failure:(HDSFailureBlock)failure;
/*!
* @method
* @abstract POST请求
* @discussion POST请求
* @param headers 请求头headers
* @param params 请求参数,post请求添加到body上
* @param success 请求成功回调
* @param failure 请求失败回调
* @result DWHTTPRequest对象
*/
+(DWHTTPRequest *)POST:(NSString *)URLString
Headers:(NSDictionary *)headers
Params:(NSDictionary *)params
Success:(HDSSuccessBlock)success
Failure:(HDSFailureBlock)failure;
@end
......@@ -52,7 +52,12 @@ NS_ASSUME_NONNULL_BEGIN
@end
//上传日志网络请求回调用于清除崩溃日志的缓存
typedef void(^HDS_SuccessBlock)(void);
@interface HDSReportClient : NSObject
@property (nonatomic, copy) HDS_SuccessBlock successBlock;
#pragma mark -- 新版API
/**
* @param business 业务类型
......@@ -74,9 +79,15 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark -- 旧版API
/** 云课堂旧版本使用 */
/** 云课堂旧版本使用 暂无人使用 */
- (void)reportLogInfo:(HDSReportInfo *)info;
/**
*崩溃日志的上报
*param:传的各个业务端的业务字段
*/
- (void)reportCrash:(NSDictionary *)param;
@end
NS_ASSUME_NONNULL_END
//版本号
#define SDK_VERSION @"4.15.0"
#define SDK_VERSION @"4.15.1"
#import <CCVodSDK/DWGIFManager.h>
#import <CCVodSDK/DWAdInfo.h>
......
......@@ -43,6 +43,8 @@ typedef void (^DWPlayInfoFinishBlock)(DWVodVideoModel * vodVideo);
*/
@property(copy, nonatomic)DWPlayInfoFinishBlock finishBlock;
@property (nonatomic, assign) BOOL isAllow;
/*!
* @method
* @abstract 初始化方法
......
......@@ -166,6 +166,10 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, copy) NSArray *reskeys;//答题器权限 便利数组如果有video_clicker 表明有问答器
//是否允许拖拽跳过答题器 默认NO 就是原有的逻辑 YES:拖拽情况下的答题器不展示,正常播放的展示
@property (nonatomic, assign) BOOL isDrawAllow;//答题器 是否允许拖拽显示
@end
///清晰度数据模型
......
//
// CCCrash.h
// CC_Test
//
// Created by hd on 2021/6/3.
//
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#define CCCrashNotification @"CCCrashNotification"
#define CCCrashIsiOS(version) ([[UIDevice currentDevice].systemVersion floatValue] >= version)
//user can ignore below define
#define CCCrashDefaultReturnNil @"CCCrash default is to return nil to CC crash."