Google AdMobs自定义点击事件无法使用不受支持的网络

时间:2022-11-03 00:05:07

I am using Google AdMobs DFP to serve up mediation banners from other networks. I have added Millennial and InMobi fine but now I need to add a network (YOC group) that does not have an adapter for DFP so I need to implement 'custom events'. I have read the guides and technical documents on implementing unsupported mediator networks with custom events but still cannot understand how it hooks up the two SDKs (Google AdMobs SDK and the mediator network's SDK).

我使用Google AdMobs DFP广告管理系统来提供来自其他网络的中介横幅广告。我已经添加了Millennial和InMobi,但现在我需要添加一个没有DFP适配器的网络(YOC组),因此我需要实现“自定义事件”。我已经阅读了有关使用自定义事件实现不支持的中介网络的指南和技术文档,但仍然无法理解它如何连接两个SDK(Google AdMobs SDK和中介网络的SDK)。

The network that doesn't have an adapter (YOC) works if I hard-code the yoc ad id (of the format '9A9A9AA99999999A999AA9A99AA99AAAA999A9AA') to a sample ad and send off the request. The banner comes back fine and uses the YOC SDK to show an interactive/rich media advert.

如果我将yoc广告ID(格式为'9A9A9AA99999999A999AA9A99AA99AAAA999A9AA')硬编码到示例广告并发送请求,则没有适配器(YOC)的网络可以正常工作。横幅回来很好,并使用YOC SDK显示交互式/富媒体广告。

However in my app I only have a Google DFP account id (of the format '/9999/company.app/channel') which I send off a request for using Google AdMobs SDK (v. 6.2.1) to DFP. The request then returns a response with the specific mediator ad network to try and request a banner advert from. My current setup is that YOC serves 100% of ads in DFP.

但是,在我的应用中,我只有一个Google DFP帐户ID(格式为“/9999/company.app/channel”),我向DFP广告管理系统发送使用Google AdMobs SDK(v.6.2.1)的请求。然后,请求返回特定中介广告网络的响应,以尝试从中请求横幅广告。我目前的设置是YOC在DFP广告管理系统中提供100%的广告。

Problem: I get a banner advert returned from the YOC ad network and it displays on screen. It registers page impressions (with DFP) but there is no response to a touch/press event the way it works as if I hard-code the initialisation parameters of the yoc ad view. I can't however hard-code the yoc ad id (when initialising) because it would only work for one banner advert and I need different banners for each specific advert in each channel.

问题:我收到了YOC广告网络返回的横幅广告,并在屏幕上显示。它会记录页面展示次数(使用DFP广告管理系统),但触摸/按下事件的响应方式与其操作方式无关,就像我对yoc广告视图的初始化参数进行硬编码一样。然而,我不能硬编码yoc广告ID(初始化时),因为它只适用于一个横幅广告,我需要为每个频道中的每个特定广告设置不同的横幅。

Below is the sample code I am trying to implement using just NSLogs in the methods to log to the console and show that the methods are being called. It is a very basic app and puts all the code in one place for ease of reading.

下面是我试图在方法中使用NSLogs实现的示例代码,以登录到控制台并显示正在调用这些方法。这是一个非常基本的应用程序,并将所有代码放在一个地方,以方便阅读。

AppDelegate.h

AppDelegate.h

#import < UIKit/UIKit.h>
#import "GADBannerView.h"
#import "GADBannerViewDelegate.h"
#import "GADCustomEventBanner.h"
#import "GADCustomEventBannerDelegate.h"
#import < YOCAdSDK/YOCAdView.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, GADBannerViewDelegate, GADCustomEventBanner, GADCustomEventBannerDelegate, YOCAdViewDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) UIViewController *root;

@end

AppDelegate.m

AppDelegate.m

#import "AppDelegate.h"
#import "GADBannerView.h"
#import <YOCAdSDK/YOCAdSize.h>

@implementation AppDelegate

@synthesize root;
@synthesize delegate; // GADCustomEventBannerDelegate set on GADCustomEventBanner

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    CGRect bounds = [[UIScreen mainScreen] bounds];
    self.window = [[UIWindow alloc] initWithFrame:bounds];
    self.window.backgroundColor = [UIColor greenColor];

    GADBannerView *banner = [[GADBannerView alloc] initWithAdSize:kGADAdSizeLeaderboard origin:CGPointMake(0, 0)];
    self.root = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    UIView *base = [[UIView alloc] initWithFrame:bounds];
    base.backgroundColor = [UIColor greenColor];
    self.root.view = base;

    // the adUnitID is always of our DFP account number of the format '/9999/company.app/aa_aa<channelName>_<channelName>app'
    banner.adUnitID = @"/9999/company.app/aa_aadebate_debateapp";

    banner.delegate = self;
    banner.rootViewController = self.root;

    self.delegate = self;

    [base addSubview:banner];
    [base bringSubviewToFront:banner];
    [banner loadRequest:[GADRequest request]];

    [self.window setRootViewController:self.root];

    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
    [self.window makeKeyAndVisible];
    return YES;
}


#pragma mark GADBannerViewDelegate

- (void)adViewDidReceiveAd:(GADBannerView *)view {
    NSLog(@" adViewDidReceiveAd ");
    NSLog(@" view: %@ ", [view description]);

    // for other ad networks here we get view.mediatedAdView = IMAdView (InMobi) or view.mediatedAdView = MMAdView (Millennial) but with YOC view.mediatedAdView = nil;

    [self.delegate customEventBanner:self didReceiveAd:view];
}

- (void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error {
    NSLog(@" didFailToReceiveAdWithError ");
    [self.delegate customEventBanner:self didFailAd:error];
}

- (void)adViewWillPresentScreen:(GADBannerView *)adView {
    NSLog(@" adViewWillPresentScreen ");
    [self.delegate customEventBanner:self clickDidOccurInAd:adView];
    [self.delegate customEventBannerWillPresentModal:self];
}

- (void)adViewWillDismissScreen:(GADBannerView *)adView {
    NSLog(@" adViewWillDismissScreen ");
    [self.delegate customEventBannerWillDismissModal:self];
}

- (void)adViewDidDismissScreen:(GADBannerView *)adView {
    NSLog(@" adViewDidDismissScreen ");
    [self.delegate customEventBannerDidDismissModal:self];
}

- (void)adViewWillLeaveApplication:(GADBannerView *)adView {
    NSLog(@" adViewWillLeaveApplication ");
    [self.delegate customEventBannerWillLeaveApplication:self];
}


#pragma mark GADCustomEventBanner

- (void)requestBannerAd:(GADAdSize)adSize
              parameter:(NSString *)serverParameter
                  label:(NSString *)serverLabel
                request:(GADCustomEventRequest *)request {
    NSLog(@" requestBannerAd ");

    // not sure if we initialiase the YOC tag here or how we would do this if can't hard code the yocTag to the format '9A9A9AA99999999A999AA9A99AA99AAAA999A9AA'
    // and we only have the banner view returned from DFP with the id '/9999/company.app/aa_aadebate_debateapp'

    YOCAdView *yocAdView = [[YOCAdView alloc] initWithYOCTag:serverParameter delegate:self size:kLeaderboard728x90 position:CGPointMake(0, 0)];
    yocAdView.delegate = self;
    [yocAdView load];

    [self.root.view addSubview:yocAdView];
}


#pragma mark GADCustomEventBannerDelegate

- (void)customEventBanner:(id<GADCustomEventBanner>)customEvent didReceiveAd:(UIView *)view {
    NSLog(@" [(GADBannerView *)view adUnitID]: %@ ", [(GADBannerView *)view adUnitID]);
    NSLog(@" [(GADBannerView *)view delegate]: %@ ", [(GADBannerView *)view delegate]);
    NSLog(@" [(id<YOCAdViewDelegate>)[customEvent delegate] viewControllerForPresentingYOCAdView]: %@ ", [(id<YOCAdViewDelegate>)[customEvent delegate] viewControllerForPresentingYOCAdView]);

    // not sure if we initialiase the YOC tag here or how we would do this if can't hard code the yocTag to '9A9A9AA99999999A999AA9A99AA99AAAA999A9AA"
    // and we only have the banner view returned from DFP with the id '/9999/company.app/aa_aadebate_debateapp'
    [customEvent requestBannerAd:kGADAdSizeLeaderboard parameter:@"???" label:nil request:nil];

    // the key might be that the [customEvent delegate] is of type YOCAdViewDelegate and we can do code specific to YOC here...
    // but again not sure how to initialize the YOCAdView because we already have the banner view returned from DFP (with a different format account id)
    // [(id<YOCAdViewDelegate>)[customEvent delegate] yocAdViewDidInitialize:yocAdView];
}

- (void)customEventBanner:(id<GADCustomEventBanner>)customEvent didFailAd:(NSError *)error {
    NSLog(@" customEventBanner:didFailAd ");
}

- (void)customEventBanner:(id<GADCustomEventBanner>)customEvent clickDidOccurInAd:(UIView *)view {
    NSLog(@" customEventBanner:clickDidOccurInAd ");
}

- (void)customEventBannerWillPresentModal:(id<GADCustomEventBanner>)customEvent {
    NSLog(@" customEventBannerWillPresentModal ");
}

- (void)customEventBannerWillDismissModal:(id<GADCustomEventBanner>)customEvent {
    NSLog(@" customEventBannerWillDismissModal ");
}

- (void)customEventBannerDidDismissModal:(id<GADCustomEventBanner>)customEvent {
    NSLog(@" customEventBannerDidDismissModal ");
}

- (void)customEventBannerWillLeaveApplication:(id<GADCustomEventBanner>)customEvent {
    NSLog(@" customEventBannerWillLeaveApplication ");
}


#pragma mark YOCAdViewDelegate

- (UIViewController *)viewControllerForPresentingYOCAdView {
    NSLog(@" viewControllerForPresentingYOCAdView ");
    return self.root;
}

- (void)yocAdViewDidInitialize:(YOCAdView *)yocAdView {
    NSLog(@" yocAdViewDidInitialize ");
}

- (void)yocAdView:(YOCAdView *)yocAdView didFailWithError:(NSError *)error {
    NSLog(@" didFailWithError: %@ ", error);
}

- (void)yocAdViewDidHide:(YOCAdView *)yocAdView {
    NSLog(@" yocAdViewDidHide ");
}

- (void)yocAdViewDidReload:(YOCAdView *)yocAdView {
    NSLog(@" yocAdViewDidReload ");
}

- (void)yocAdViewWillPresentModalViewController:(YOCAdView *)yocAdView {
    NSLog(@" yocAdViewWillPresentModalViewController ");
}

- (void)yocAdViewWillDismissModalViewController:(YOCAdView *)yocAdView {
    NSLog(@" yocAdViewWillDismissModalViewController ");
}


@end

Please can someone help give me things to try out and find out how to get the advert banner view returned from Google DFP responding to click events!?

请有人帮忙给我一些尝试,并了解如何从Google DFP广告管理系统返回的广告横幅视图回复点击事件!

1 个解决方案

#1


1  

There is a guide here on how to develop custom events.

这里有一个关于如何开发自定义事件的指南。

If you're using AdMob SDK Mediation with ad unit /9999/company.app/channel, then this ad unit should be an SDK Mediation creative within DFP. One of your networks should be a Custom Event with the following settings:

如果您将AdMob SDK Mediation与广告单元/9999/company.app/channel一起使用,则此广告单元应为DFP广告管理系统中的SDK中介广告素材。您的一个网络应该是具有以下设置的自定义事件:

Parameter: 9A9A9AA99999999A999AA9A99AA99AAAA999A9AA (or whatever your YOC tag is)
Label: YOC Group (This is just a label so you remember what this custom event is for)
Class Name: AppDelegate (You should really implement the custom event in it's own
                         class, and replace the class name with that class)

Then when implementing the custom event, you can reference serverParameter as the YOCTag like you already have.

然后,在实现自定义事件时,您可以将serverParameter引用为您已有的YOCTag。

You don't want to implement GADCustomEventBannerDelegate yourself. By your class implementing GADCustomEventBanner, and adding:

您不想自己实现GADCustomEventBannerDelegate。由您的类实现GADCustomEventBanner,并添加:

@synthesize delegate

at the top of your implementation, you have access to an instance of this object via:

在您的实现的顶部,您可以通过以下方式访问此对象的实例:

self.delegate

You'll want to use that delegate to tell the custom event (and thereby AdMob Mediation) that YOC returned or failed to return an ad. Based on the YOC delegate, your mapping might look something like this:

您将要使用该委托告知YOC返回或未能返回广告的自定义事件(以及AdMob Mediation)。基于YOC委托,您的映射可能如下所示:

- (UIViewController *)viewControllerForPresentingYOCAdView {
  NSLog(@" viewControllerForPresentingYOCAdView ");
  return self.root;
}

- (void)yocAdViewDidInitialize:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewDidInitialize ");
  // Assuming this means the yocAdView was received.
  [self.delegate customEventBanner:self didReceiveAd:yocAdView];
}

- (void)yocAdView:(YOCAdView *)yocAdView didFailWithError:(NSError *)error {
  NSLog(@" didFailWithError: %@ ", error);
  [self.delegate customEventBanner:self didFailAd:error];
}

- (void)yocAdViewDidHide:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewDidHide ");
}

- (void)yocAdViewDidReload:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewDidReload ");
  [self.delegate customEventBanner:self didReceiveAd:yocAdView];
}

- (void)yocAdViewWillPresentModalViewController:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewWillPresentModalViewController ");
  [self.delegate customEventBanner:self clickDidOccurInAd:yocAdView];
  [self.delegate customEventBannerWillPresentModal:self];
  [self.delegate customEventBannerWillLeaveApplication:self];
}

- (void)yocAdViewWillDismissModalViewController:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewWillDismissModalViewController ");
  [self.delegate customEventBannerWillDismissModal:self];
}

Finally, you don't want to invoke GADCustomEventBannerDelegate methods in your GADBannerViewDelegate callback methods. These are invoked by AdMob telling you that mediation came back with an ad. The GADBannerViewDelegate implementation is part of your main app, and should stay out of your custom event class's implementation.

最后,您不希望在GADBannerViewDelegate回调方法中调用GADCustomEventBannerDelegate方法。 AdMob会调用这些内容,告诉您调解是通过广告返回的。 GADBannerViewDelegate实现是主应用程序的一部分,应该远离自定义事件类的实现。

I know the guide invokes the custom event delegate methods in its GADBannerViewDelegate implementation. The difference is the guide is writing a custom event to implement AdMob, so in the context of the guide, the GADBannerViewDelegate is behaving like the YOCAdViewDelegate in your example.

我知道该指南在其GADBannerViewDelegate实现中调用自定义事件委托方法。不同之处在于指南正在编写自定义事件来实现AdMob,因此在本指南的上下文中,GADBannerViewDelegate的行为类似于示例中的YOCAdViewDelegate。

#1


1  

There is a guide here on how to develop custom events.

这里有一个关于如何开发自定义事件的指南。

If you're using AdMob SDK Mediation with ad unit /9999/company.app/channel, then this ad unit should be an SDK Mediation creative within DFP. One of your networks should be a Custom Event with the following settings:

如果您将AdMob SDK Mediation与广告单元/9999/company.app/channel一起使用,则此广告单元应为DFP广告管理系统中的SDK中介广告素材。您的一个网络应该是具有以下设置的自定义事件:

Parameter: 9A9A9AA99999999A999AA9A99AA99AAAA999A9AA (or whatever your YOC tag is)
Label: YOC Group (This is just a label so you remember what this custom event is for)
Class Name: AppDelegate (You should really implement the custom event in it's own
                         class, and replace the class name with that class)

Then when implementing the custom event, you can reference serverParameter as the YOCTag like you already have.

然后,在实现自定义事件时,您可以将serverParameter引用为您已有的YOCTag。

You don't want to implement GADCustomEventBannerDelegate yourself. By your class implementing GADCustomEventBanner, and adding:

您不想自己实现GADCustomEventBannerDelegate。由您的类实现GADCustomEventBanner,并添加:

@synthesize delegate

at the top of your implementation, you have access to an instance of this object via:

在您的实现的顶部,您可以通过以下方式访问此对象的实例:

self.delegate

You'll want to use that delegate to tell the custom event (and thereby AdMob Mediation) that YOC returned or failed to return an ad. Based on the YOC delegate, your mapping might look something like this:

您将要使用该委托告知YOC返回或未能返回广告的自定义事件(以及AdMob Mediation)。基于YOC委托,您的映射可能如下所示:

- (UIViewController *)viewControllerForPresentingYOCAdView {
  NSLog(@" viewControllerForPresentingYOCAdView ");
  return self.root;
}

- (void)yocAdViewDidInitialize:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewDidInitialize ");
  // Assuming this means the yocAdView was received.
  [self.delegate customEventBanner:self didReceiveAd:yocAdView];
}

- (void)yocAdView:(YOCAdView *)yocAdView didFailWithError:(NSError *)error {
  NSLog(@" didFailWithError: %@ ", error);
  [self.delegate customEventBanner:self didFailAd:error];
}

- (void)yocAdViewDidHide:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewDidHide ");
}

- (void)yocAdViewDidReload:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewDidReload ");
  [self.delegate customEventBanner:self didReceiveAd:yocAdView];
}

- (void)yocAdViewWillPresentModalViewController:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewWillPresentModalViewController ");
  [self.delegate customEventBanner:self clickDidOccurInAd:yocAdView];
  [self.delegate customEventBannerWillPresentModal:self];
  [self.delegate customEventBannerWillLeaveApplication:self];
}

- (void)yocAdViewWillDismissModalViewController:(YOCAdView *)yocAdView {
  NSLog(@" yocAdViewWillDismissModalViewController ");
  [self.delegate customEventBannerWillDismissModal:self];
}

Finally, you don't want to invoke GADCustomEventBannerDelegate methods in your GADBannerViewDelegate callback methods. These are invoked by AdMob telling you that mediation came back with an ad. The GADBannerViewDelegate implementation is part of your main app, and should stay out of your custom event class's implementation.

最后,您不希望在GADBannerViewDelegate回调方法中调用GADCustomEventBannerDelegate方法。 AdMob会调用这些内容,告诉您调解是通过广告返回的。 GADBannerViewDelegate实现是主应用程序的一部分,应该远离自定义事件类的实现。

I know the guide invokes the custom event delegate methods in its GADBannerViewDelegate implementation. The difference is the guide is writing a custom event to implement AdMob, so in the context of the guide, the GADBannerViewDelegate is behaving like the YOCAdViewDelegate in your example.

我知道该指南在其GADBannerViewDelegate实现中调用自定义事件委托方法。不同之处在于指南正在编写自定义事件来实现AdMob,因此在本指南的上下文中,GADBannerViewDelegate的行为类似于示例中的YOCAdViewDelegate。