Zdarzenia niestandardowe dotyczące reklam z nagrodą

Wymagania wstępne

Dokończ konfigurowanie zdarzeń niestandardowych.

Prośba o wyświetlenie reklamy z nagrodą

Gdy w łańcuchu zapośredniczenia kaskadowego zostanie osiągnięty element zamówienia zdarzenia niestandardowego, metoda loadRewarded:adConfiguration:completionHandler: zostanie wywołana w nazwie klasy podanej podczas tworzenia zdarzenia niestandardowego. W tym przypadku metoda znajduje się w klasie SampleCustomEvent, która wywołuje metodę loadRewarded:adConfiguration:completionHandler: w klasie SampleCustomEventRewarded.

Aby poprosić o reklamę z nagrodą, utwórz lub zmodyfikuj klasę, która implementuje interfejsy GADMediationAdapterloadRewarded:adConfiguration:completionHandler:. Jeśli klasa rozszerzająca klasę GADMediationAdapter już istnieje, zaimplementuj w niej funkcję loadRewarded:adConfiguration:completionHandler:. Dodatkowo utwórz nową klasę, aby zaimplementować GADMediationRewardedAd.

W naszym przykładzie zdarzenia niestandardowego funkcja SampleCustomEvent implementuje interfejs GADMediationAdapter, a potem przekazuje sterowanie do funkcji SampleCustomEventRewarded.

Swift

import GoogleMobileAds

class SampleCustomEvent: NSObject, GADMediationAdapter {

  fileprivate var rewardedAd: SampleCustomEventRewarded?
  ...

  func loadRewarded(
    for adConfiguration: GADMediationRewardedAdConfiguration,
    completionHandler: @escaping GADMediationRewardedLoadCompletionHandler
  ) {
    self.rewardedAd = SampleCustomEventRewarded()
    self.rewardedAd?.loadRewarded(
      for: adConfiguration, completionHandler: completionHandler)
  }
}

Objective-C

#import "SampleCustomEvent.h"

@implementation SampleCustomEvent
...

SampleCustomEventRewarded *sampleRewarded;

- (void)loadRewardedForAdConfiguration:
            (GADMediationRewardedAdConfiguration *)adConfiguration
                     completionHandler:
                         (GADMediationRewardedLoadCompletionHandler)
                             completionHandler {
  sampleRewarded = [[SampleCustomEventRewarded alloc] init];
  [sampleRewarded loadRewardedForAdConfiguration:adConfiguration
                               completionHandler:completionHandler];
}

SampleCustomEventRewarded odpowiada za te zadania:

  • Wczytywanie reklamy z nagrodą.

  • Zaimplementuj protokół GADMediationRewardedAd.

  • Odbieranie i zgłaszanie do pakietu SDK do reklam mobilnych Google wywołań zwrotnych zdarzeń reklamy.

Opcjonalny parametr zdefiniowany w interfejsie Ad Managera jest uwzględniany w konfiguracji reklamy. Dostęp do parametru można uzyskać za pomocą adConfiguration.credentials.settings[@"parameter"]. Ten parametr to zwykle identyfikator jednostki reklamowej, którego pakiet SDK sieci reklamowej wymaga do utworzenia obiektu reklamy.

Swift

class SampleCustomEventRewarded: NSObject, GADMediationRewardedAd {
  /// The Sample Ad Network rewarded ad.
  var nativeAd: SampleRewarded?

  /// The ad event delegate to forward ad rendering events to the Google Mobile Ads SDK.
  var delegate: GADMediationRewardedAdEventDelegate?

  /// Completion handler called after ad load.
  var completionHandler: GADMediationRewardedLoadCompletionHandler?

  func loadRewarded(
    for adConfiguration: GADMediationRewardedAdConfiguration,
    completionHandler: @escaping GADMediationRewardedLoadCompletionHandler
  ) {
    rewarded = SampleRewarded.init(
      adUnitID: adConfiguration.credentials.settings["parameter"] as? String)
    rewarded?.delegate = self
    let adRequest = SampleAdRequest()
    adRequest.testMode = adConfiguration.isTestRequest
    self.completionHandler = completionHandler
    rewarded?.fetchAd(adRequest)
  }
}

Objective-C

#import "SampleCustomEventRewarded.h"

@interface SampleCustomEventRewarded () <SampleRewardedAdDelegate,
                                         GADMediationRewardedAd> {
  /// The sample rewarded ad.
  SampleRewarded *_rewardedAd;

  /// The completion handler to call when the ad loading succeeds or fails.
  GADMediationRewardedLoadCompletionHandler _loadCompletionHandler;

  /// The ad event delegate to forward ad rendering events to the Google Mobile Ads SDK.
  id <GADMediationRewardedAdEventDelegate> _adEventDelegate;
}
@end

- (void)loadRewardedAdForAdConfiguration:(GADMediationRewardedAdConfiguration *)adConfiguration
                       completionHandler:
                           (GADMediationRewardedLoadCompletionHandler)completionHandler {
  __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT;
  __block GADMediationRewardedLoadCompletionHandler originalCompletionHandler =
      [completionHandler copy];

  _loadCompletionHandler = ^id<GADMediationRewardedAdEventDelegate>(
      _Nullable id<GADMediationRewardedAd> ad, NSError *_Nullable error) {
    // Only allow completion handler to be called once.
    if (atomic_flag_test_and_set(&completionHandlerCalled)) {
      return nil;
    }

    id<GADMediationRewardedAdEventDelegate> delegate = nil;
    if (originalCompletionHandler) {
      // Call original handler and hold on to its return value.
      delegate = originalCompletionHandler(ad, error);
    }

    // Release reference to handler. Objects retained by the handler will also be released.
    originalCompletionHandler = nil;

    return delegate;
  };

  NSString *adUnit = adConfiguration.credentials.settings[@"parameter"];
  _rewardedAd = [[SampleRewardedAd alloc] initWithAdUnitID:adUnit];
  _rewardedAd.delegate = self;
  SampleAdRequest *adRequest = [[SampleAdRequest alloc] init];
  adRequest.testMode = adConfiguration.isTestRequest;
  [_rewardedAd fetchAd:adRequest];
}

Bez względu na to, czy udało się pobrać reklamę, czy wystąpił błąd, wywołasz funkcję GADMediationRewardedLoadCompletionHandler. W przypadku powodzenia prześlij klasę implementującą GADMediationRewardedAd z wartością nil dla parametru błędu. W przypadku niepowodzenia prześlij wygenerowany błąd.

Zwykle te metody są implementowane w ramach wywołań zwrotnych z zewnętrznego pakietu SDK, który jest używany przez adapter. W tym przykładzie pakiet SDK Sample ma element SampleRewardedAdDelegate z odpowiednimi wywołaniami zwrotnymi:

Swift

func rewardedDidLoad(_ interstitial: SampleRewarded) {
  if let handler = completionHandler {
    delegate = handler(self, nil)
  }
}

func rewarded(
  rewarded: SampleRewarded, didFailToLoadAdWith errorCode: SampleErrorCode
) {
  let error =
    SampleCustomEventUtils.SampleCustomEventErrorWithCodeAndDescription(
      code: SampleCustomEventErrorCode
        .SampleCustomEventErrorAdLoadFailureCallback,
      description:
        "Sample SDK returned an ad load failure callback with error code: \(errorCode)"
    )
  if let handler = completionHandler {
    delegate = handler(nil, error)
  }
}

Objective-C

- (void)rewardedDidLoad:(SampleRewarded *)rewarded {
  _adEventDelegate = _loadCompletionHandler(self, nil);
}

- (void)rewarded:(SampleInterstitial *)rewarded
    didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {
  NSError *error = SampleCustomEventErrorWithCodeAndDescription(
      SampleCustomEventErrorAdLoadFailureCallback,
      [NSString stringWithFormat:@"Sample SDK returned an ad load failure "
                                 @"callback with error code: %@",
                                 errorCode]);
  _adEventDelegate = _loadCompletionHandler(nil, error);
}

GADMediationrewardedAd wymaga zaimplementowania metody present(viewController:), aby wyświetlić reklamę:

Swift

func present(from viewController: UIViewController) {
  if let rewarded = rewarded, rewarded.isRewardedLoaded {
    rewarded.show()
  }
}

Objective-C

- (void)presentFromViewController:(UIViewController *)viewController {
  if ([_rewardedAd isRewardedLoaded]) {
    [_rewardedAd show];
  } else {
    NSError *error = SampleCustomEventErrorWithCodeAndDescription(
        SampleCustomEventErrorAdNotLoaded,
        [NSString stringWithFormat:
                      @"The rewarded ad failed to present because the ad was not loaded."]);
    [_adEventDelegate didFailToPresentWithError:error]
  }
}

Przekazywanie zdarzeń zapośredniczenia do pakietu SDK do reklam mobilnych Google

Po wywołaniu metody GADMediationRewardedLoadCompletionHandler z załadowaną reklamą adapter może użyć zwróconego obiektu GADMediationRewardedAdEventDelegate, aby przekazywać zdarzenia związane z prezentacją z zewnętrznego pakietu SDK do pakietu SDK do reklam mobilnych Google. Klasa SampleCustomEventRewarded implementuje protokół SampleRewardedAdDelegate, aby przekazywać wywołania zwrotne z próbnej sieci reklamowej do pakietu SDK do reklam mobilnych Google.

Ważne jest, aby Twoje zdarzenie niestandardowe przekazywało jak najwięcej wywołań zwrotnych, aby aplikacja otrzymywała te zdarzenia od pakietu SDK do reklam mobilnych Google. Oto przykład użycia wywołań zwrotnych:

Swift

func rewardedAdDidPresent(_ rewarded: SampleRewardedAd) {
  delegate?.willPresentFullScreenVideo()
  delegate?.didStartVideo()
}

func rewardedAdUserDidEarnReward(_ rewarded: SampleRewardedAd) {
  GADAdReward aReward = GADAdReward("", rewarded)
  delegate.didRewardUser()
}

Objective-C

- (void)rewardedAdDidPresent:(SampleRewardedAd *)rewardedAd {
  [_adEventDelegate willPresentFullScreenView];
  [_adEventDelegate didStartVideo];
}

- (void)rewardedAd:(nonnull SampleRewardedAd *)rewardedAd
    userDidEarnReward:(NSUInteger)reward {
  GADAdReward *aReward = [[GADAdReward alloc]
      initWithRewardType:@""
            rewardAmount:[NSDecimalNumber numberWithUnsignedInt:reward]];
  [_adEventDelegate didRewardUserWithReward];
}

To kończy implementację zdarzeń niestandardowych w przypadku reklam z nagrodą. Pełny przykład jest dostępny na GitHub. Możesz go używać z siecią reklamową, która jest już obsługiwana, lub zmodyfikować go, aby wyświetlać reklamy z nagrodą oparte na zdarzeniach niestandardowych.