使用MoPub显示AdMob原生广告(iOS)

时间:2016-05-11 10:15:50

标签: ios objective-c admob advertisement mopub

我正在整合MoPub SDK来调解来自Google AdMob网络的广告。我可以在实现自己的customEvent和Adapter之后显示AD,但是我无法让AD自己处理点击事件。就像我点击AdMob原生AD一样,它不会指引我到任何地方。使用Facebook和Flurry的CustomEvent和Adapter时,会自动处理点击。任何人都有过这方面的经验吗?

先谢谢。代码如下:

MPGoogleAdMobCustomEvent

@interface MPGoogleAdMobCustomEvent()
@property(nonatomic, strong)GADAdLoader *loader;
@end

@implementation MPGoogleAdMobCustomEvent

- (void)requestAdWithCustomEventInfo:(NSDictionary *)info
{
    MPLogInfo(@"MOPUB: requesting AdMob Native Ad");

    NSString *adUnitID = [info objectForKey:@"adUnitID"];

    if (!adUnitID) {

        [self.delegate nativeCustomEvent:self didFailToLoadAdWithError:MPNativeAdNSErrorForInvalidAdServerResponse(@"MOPUB: No AdUnitID from GoogleAdMob")];

        return;
    }

    self.loader = [[GADAdLoader alloc] initWithAdUnitID:adUnitID rootViewController:nil  adTypes:@[kGADAdLoaderAdTypeNativeContent] options:nil];
    self.loader.delegate = self;
    GADRequest *request = [GADRequest request];

#if (TARGET_OS_SIMULATOR)

    request.testDevices = @[ kGADSimulatorID ];

#endif

    CLLocation *location = [[CLLocationManager alloc] init].location;
    if (location) {
        [request setLocationWithLatitude:location.coordinate.latitude
                               longitude:location.coordinate.longitude
                                accuracy:location.horizontalAccuracy];
    }
    request.requestAgent = @"MoPub";
    [self.loader loadRequest:request];
}

- (void)adLoader:(GADAdLoader *)adLoader didReceiveNativeContentAd:(GADNativeContentAd *)nativeContentAd
{
    MPLogDebug(@"MOPUB: Did receive nativeAd");

    MPGoogleAdMobNativeAdAdapter *adapter = [[MPGoogleAdMobNativeAdAdapter alloc] initWithGADNativeContentAd:nativeContentAd];
    adapter.url = nativeContentAd.advertiser;
    MPNativeAd *interfaceAd = [[MPNativeAd alloc] initWithAdAdapter:adapter];

    NSMutableArray *imageArray = [NSMutableArray array];

    for (GADNativeAdImage *images in nativeContentAd.images) {

        [imageArray addObject:images.imageURL];

    }


    [super precacheImagesWithURLs:imageArray completionBlock:^(NSArray *errors) {

        if ([errors count]) {
            [self.delegate nativeCustomEvent:self didFailToLoadAdWithError:errors[0]];
        } else {
            [self.delegate nativeCustomEvent:self didLoadAd:interfaceAd];
        }

    }];
}

- (void)adLoader:(GADAdLoader *)adLoader didFailToReceiveAdWithError:(GADRequestError *)error
{
    MPLogDebug(@"MOPUB: AdMob ad failed to load with error (customEvent): %@", error.description);
    [self.delegate nativeCustomEvent:self didFailToLoadAdWithError:error];
}

@end

MPGoogleAdMobNativeAdAdapter

@interface MPGoogleAdMobNativeAdAdapter()<GADNativeAdDelegate>
@property(nonatomic, strong)NSDictionary *properties;
@end

@implementation MPGoogleAdMobNativeAdAdapter

- (instancetype)initWithGADNativeContentAd:(GADNativeContentAd *)contentAD
{
    self = [super init];
    if (self) {
        self.contentAd = contentAD;
        self.contentAd.delegate = self;
        self.properties = [self convertAssetsToProperties:contentAD];
    }
    return self;
}

- (NSDictionary *)convertAssetsToProperties:(GADNativeContentAd *)adNative
{
    self.contentAd = adNative;
    NSMutableDictionary * dictionary = [NSMutableDictionary dictionary];
    if (adNative.headline) {
        dictionary[kAdTitleKey] = adNative.headline;
    }
    if (adNative.body) {
        dictionary[kAdTextKey] = adNative.body;
    }
    if (adNative.images[0]) {
        dictionary[kAdMainImageKey] = ((GADNativeAdImage *)adNative.images[0]).imageURL.absoluteString;
    }
    if (adNative.callToAction) {
        dictionary[kAdCTATextKey] = adNative.callToAction;
    }
    return [dictionary copy];
}

#pragma mark MPNativeAdAdapter
- (NSTimeInterval)requiredSecondsForImpression
{
    return 0.0;
}

- (NSURL *)defaultActionURL
{
    return nil;
}

- (BOOL)enableThirdPartyClickTracking
{
    return YES;
}


- (void)willAttachToView:(UIView *)view
{
    self.contentAd.rootViewController = [self.delegate viewControllerForPresentingModalView];
}

- (void)didDetachFromView:(UIView *)view
{
    self.contentAd.rootViewController = nil;
}

#pragma mark GADNativeAdDelegate

- (void)nativeAdWillPresentScreen:(GADNativeAd *)nativeAd
{
    if ([self.delegate respondsToSelector:@selector(nativeAdWillPresentModalForAdapter:)]) {
        [self.delegate nativeAdWillPresentModalForAdapter:self];
    }
}

- (void)nativeAdDidDismissScreen:(GADNativeAd *)nativeAd
{
    if ([self.delegate respondsToSelector:@selector(nativeAdDidDismissModalForAdapter:)]) {
        [self.delegate nativeAdDidDismissModalForAdapter:self];
    }
}

- (void)nativeAdWillLeaveApplication:(GADNativeAd *)nativeAd
{
    if ([self.delegate respondsToSelector:@selector(nativeAdWillLeaveApplicationFromAdapter:)]) {
        [self.delegate nativeAdWillLeaveApplicationFromAdapter:self];
    }
}

@end




`

1 个答案:

答案 0 :(得分:0)

如果您拥有AdMob广告的自定义用户界面,则会有一个按钮,您将用于callToAction部分。

首先你需要添加一个选择器来检测click的动作,为这个按钮添加选择器

[callToActionButton addTarget:self action:@selector(adCalled:) forControlEvents:UIControlEventTouchUpInside];

之后实现adCalled方法以获取点击&amp;进一步调用该方法,下面是代码供您参考 下面是我用来从我的集合视图中获取广告对象的示例。然后我重定向它。

- (void)adCalled:(id)sender
{
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:mainCollectionView];   // Get the button position
    NSIndexPath *indexPath = [collectionView indexPathForItemAtPoint:buttonPosition];    // Get the index path of button so that I can retrieve the correct ad object
    id selectedAd = [adArray objectAtIndex:indexPath.row];
    if ([selectedAd isKindOfClass:[GADNativeContentAd class]]) {
        NSString *url = [selectedAd valueForKey:@"googleClickTrackingURLString"];
        NSLog(@"URL is :%@", url);
        NSURL *googleUrl = [NSURL URLWithString:url];
        if ([[UIApplication sharedApplication] canOpenURL: googleUrl]) {
            [[UIApplication sharedApplication] openURL:googleUrl];
        }
    }
}

使用此功能,我可以使用Google跟踪网址打开网站链接。

希望这有帮助。