2024-11-26 11:14:20 +08:00

256 lines
9.0 KiB
Objective-C

#import "NativeAd.h"
#import "GDTNativeExpressAd.h"
#import "TLogUtil.h"
#import "TUIViewController+getCurrentVC.h"
#import "GDTNativeExpressAdView.h"
#pragma mark - NaitveAdFactory
@implementation NaitveAdFactory{
NSObject<FlutterBinaryMessenger>*_messenger;
}
- (instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger> *)messager{
self = [super init];
if (self) {
_messenger = messager;
}
return self;
}
-(NSObject<FlutterMessageCodec> *)createArgsCodec{
return [FlutterStandardMessageCodec sharedInstance];
}
-(NSObject<FlutterPlatformView> *)createWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id)args{
NativeAd * nativeAd = [[NativeAd alloc] initWithWithFrame:frame viewIdentifier:viewId arguments:args binaryMessenger:_messenger];
return nativeAd;
}
@end
@interface NativeAd()<GDTNativeExpressAdDelegete>
@property (nonatomic, strong) GDTNativeExpressAd *native;
@property (nonatomic, strong) GDTNativeExpressAdView *nativeView;
@property(nonatomic,strong) UIView *container;
@property(nonatomic,assign) CGRect frame;
@property(nonatomic,assign) NSInteger viewId;
@property(nonatomic,strong) FlutterMethodChannel *channel;
@property(nonatomic,strong) NSString *codeId;
@property(nonatomic,assign) NSInteger viewWidth;
@property(nonatomic,assign) NSInteger viewHeight;
@property(nonatomic,assign) BOOL isBidding;
@end
#pragma mark - NativeAd
@implementation NativeAd
- (instancetype)initWithWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id)args binaryMessenger:(NSObject<FlutterBinaryMessenger> *)messenger{
if ([super init]) {
NSDictionary *dic = args;
_frame = frame;
_viewId = viewId;
_codeId = dic[@"iosId"];
_viewWidth =[dic[@"viewWidth"] intValue];
_viewHeight =[dic[@"viewHeight"] intValue];
self.isBidding =[dic[@"isBidding"] boolValue];
NSString* channelName = [NSString stringWithFormat:@"com.example.union_ad_ssgf/NativeExpressAdView_%lld", viewId];
_channel = [FlutterMethodChannel methodChannelWithName:channelName binaryMessenger:messenger];
[self.channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
// 竞价成功
if ([@"biddingSucceeded" isEqualToString:call.method]) {
NSDictionary *dictionary = @{GDT_M_W_E_COST_PRICE:@([call.arguments[@"expectCostPrice"] intValue]),
GDT_M_W_H_LOSS_PRICE:@([call.arguments[@"highestLossPrice"] intValue])};
[self.native sendWinNotificationWithInfo:dictionary];
[_container addSubview:self.nativeView];
[self.nativeView render];
//竞价失败
} else if([@"biddingFail" isEqualToString:call.method]) {
NSDictionary *dictionary = @{GDT_M_L_WIN_PRICE:@([call.arguments[@"winPrice"] intValue]),
GDT_M_L_LOSS_REASON:@([call.arguments[@"lossReason"] intValue]),
GDT_M_ADNID: call.arguments[@"adnId"]};
[self.native sendWinNotificationWithInfo:dictionary];
}
}];
_container = [[UIView alloc] initWithFrame:frame];
[self loadNativeAd];
}
return self;
}
- (UIView*)view{
return _container;
}
-(void)loadNativeAd{
[_container removeFromSuperview];
CGSize size = CGSizeMake(_viewWidth, _viewHeight);
if(_native == nil){
_native =[[GDTNativeExpressAd alloc] initWithPlacementId:_codeId adSize:size];
_native.delegate = self;
}
[_native loadAd:1];
}
#pragma mark - 广告请求delegate
/**
* 拉取原生模板广告成功
*/
- (void)nativeExpressAdSuccessToLoad:(GDTNativeExpressAd *)nativeExpressAd views:(NSArray<__kindof GDTNativeExpressAdView *> *)views{
[[TLogUtil sharedInstance] print:@"拉取原生模板广告成功"];
if (views.count) {
[views enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
self.nativeView = (GDTNativeExpressAdView *)obj;
self.nativeView.controller = [UIViewController jsd_getCurrentViewController];
//是否开启竞价
if(self.isBidding){
NSDictionary *dictionary = @{@"ecpmLevel":self.nativeView.eCPMLevel == nil ? @"" : self.nativeView.eCPMLevel,@"ecpm":@(self.nativeView.eCPM)};
[_channel invokeMethod:@"onECPM" arguments:dictionary result:nil];
}else{
[_container addSubview:self.nativeView];
[self.nativeView render];
}
}];
}
}
/**
* 拉取原生模板广告失败
*/
- (void)nativeExpressAdFailToLoad:(GDTNativeExpressAd *)nativeExpressAd error:(NSError *)error{
[[TLogUtil sharedInstance] print:(@"拉取原生模板广告失败 %@",error.description)];
NSDictionary *dictionary = @{@"code":@(-1),@"message":(@"%@",error.description)};
[_channel invokeMethod:@"onFail" arguments:dictionary result:nil];
}
/**
* 原生模板广告渲染成功, 此时的 nativeExpressAdView.size.height 根据 size.width 完成了动态更新。
*/
- (void)nativeExpressAdViewRenderSuccess:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"原生模板广告渲染成功"];
NSDictionary *dictionary = @{@"width": @(nativeExpressAdView.frame.size.width),@"height":@(nativeExpressAdView.frame.size.height)};
[_channel invokeMethod:@"onShow" arguments:dictionary result:nil];
}
/**
* 原生模板广告渲染失败
*/
- (void)nativeExpressAdViewRenderFail:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"原生模板广告渲染失败"];
NSDictionary *dictionary = @{@"code":@(-1),@"message":@"原生模板广告渲染失败"};
[_channel invokeMethod:@"onFail" arguments:dictionary result:nil];
}
/**
* 原生模板广告曝光回调
*/
- (void)nativeExpressAdViewExposure:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"原生模板广告曝光回调"];
[_channel invokeMethod:@"onExpose" arguments:nil result:nil];
}
/**
* 原生模板广告点击回调
*/
- (void)nativeExpressAdViewClicked:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"原生模板广告点击回调"];
[_channel invokeMethod:@"onClick" arguments:nil result:nil];
}
/**
* 原生模板广告被关闭
*/
- (void)nativeExpressAdViewClosed:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"原生模板广告被关闭"];
[_channel invokeMethod:@"onClose" arguments:nil result:nil];
}
/**
* 点击原生模板广告以后即将弹出全屏广告页
*/
- (void)nativeExpressAdViewWillPresentScreen:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"点击原生模板广告以后即将弹出全屏广告页"];
}
/**
* 点击原生模板广告以后弹出全屏广告页
*/
- (void)nativeExpressAdViewDidPresentScreen:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"点击原生模板广告以后弹出全屏广告页"];
}
/**
* 全屏广告页将要关闭
*/
- (void)nativeExpressAdViewWillDismissScreen:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"全屏广告页将要关闭"];
}
/**
* 全屏广告页将要关闭
*/
- (void)nativeExpressAdViewDidDismissScreen:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"全屏广告页将要关闭"];
}
/**
* 详解:当点击应用下载或者广告调用系统程序打开时调用
*/
- (void)nativeExpressAdViewApplicationWillEnterBackground:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"详解:当点击应用下载或者广告调用系统程序打开时调用"];
}
/**
* 原生模板视频广告 player 播放状态更新回调
*/
- (void)nativeExpressAdView:(GDTNativeExpressAdView *)nativeExpressAdView playerStatusChanged:(GDTMediaPlayerStatus)status{
[[TLogUtil sharedInstance] print:@"原生模板视频广告 player 播放状态更新回调"];
}
/**
* 原生视频模板详情页 WillPresent 回调
*/
- (void)nativeExpressAdViewWillPresentVideoVC:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"原生视频模板详情页 WillPresent 回调"];
}
/**
* 原生视频模板详情页 DidPresent 回调
*/
- (void)nativeExpressAdViewDidPresentVideoVC:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@"原生视频模板详情页 DidPresent 回调"];
}
/**
* 原生视频模板详情页 WillDismiss 回调
*/
- (void)nativeExpressAdViewWillDismissVideoVC:(GDTNativeExpressAdView *)nativeExpressAdView{
[[TLogUtil sharedInstance] print:@" 原生视频模板详情页 WillDismiss 回调"];
}
/**
* 原生视频模板详情页 DidDismiss 回调
*/
- (void)nativeExpressAdViewDidDismissVideoVC:(GDTNativeExpressAdView *)nativeExpressAdView;{
[[TLogUtil sharedInstance] print:@"原生视频模板详情页 DidDismiss 回调"];
}
@end