رویدادهای سفارشی آگهی‌های پاداش‌دار

پلاتفرم را انتخاب کنید: Android iOS Android (قدیمی)

پیش‌نیازها

راه‌اندازی رویدادهای سفارشی را تکمیل کنید.

درخواست آگهی پاداش‌دار

وقتی خط سفارش رویداد سفارشی در زنجیره میانجی‌گری آبشاری به‌دست می‌آید، روش loadRewarded:adConfiguration:completionHandler: در نام کلاسی که هنگام ایجاد رویداد سفارشی ارائه کرده‌اید فراخوانی می‌شود. در این مورد، آن روش در SampleCustomEvent است، که سپس روش loadRewarded:adConfiguration:completionHandler: را در SampleCustomEventRewarded فراخوانی می‌کند.

برای درخواست آگهی پاداش‌دار، کلاسی را ایجاد یا اصلاح کنید که GADMediationAdapter و loadRewarded:adConfiguration:completionHandler: را پیاده‌سازی می‌کند. اگر کلاسی که GADMediationAdapter را گسترش می‌دهد ازقبل وجود دارد، loadRewarded:adConfiguration:completionHandler: را در آنجا پیاده‌سازی کنید. علاوه‌براین، کلاس جدیدی برای پیاده‌سازی GADMediationRewardedAd ایجاد کنید.

در مثال رویداد سفارشی ما، SampleCustomEvent میانای GADMediationAdapter را پیاده‌سازی می‌کند و سپس به SampleCustomEventRewarded واگذار می‌کند.

Swift

import GoogleMobileAds

class SampleCustomEvent: NSObject, MediationAdapter {

  fileprivate var rewardedAd: SampleCustomEventRewarded?
  ...

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

آبجکتیو-سی

#import "SampleCustomEvent.h"

@implementation SampleCustomEvent
...

SampleCustomEventRewarded *sampleRewarded;

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

‫SampleCustomEventRewarded مسئول تکالیف زیر است:

  • درحال بار کردن آگهی پاداش‌دار.

  • درحال اجرای پروتکل GADMediationRewardedAd.

  • دریافت و گزارش کردن فراخوانی‌های رویداد آگهی به Google Mobile Ads SDK.

پارامتر اختیاری تعریف‌شده در AdMob UI در پیکربندی آگهی گنجانده شده است. ازطریق adConfiguration.credentials.settings[@"parameter"] می‌توانید به این پارامتر دسترسی پیدا کنید. این پارامتر معمولاً شناسه واحد آگهی است که کیت توسعه نرم‌افزار شبکه آگهی هنگام نمونه‌سازی شیء آگهی به آن نیاز دارد.

Swift

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

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

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

  func loadRewarded(
    for adConfiguration: MediationRewardedAdConfiguration,
    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)
  }
}

آبجکتیو-سی

#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 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];
}

چه آگهی باموفقیت واکشی شود یا با خطا مواجه شود، GADMediationRewardedLoadCompletionHandler را فراخوانی می‌کنید. درصورت موفقیت، از کلاسی که GADMediationRewardedAd را با مقدار nil برای پارامتر خطا پیاده‌سازی می‌کند عبور کنید؛ درصورت ناموفق بودن، از خطایی که با آن مواجه شدید عبور کنید.

معمولاً این روش‌ها در داخل فراخوانی‌های برگشتی از کیت توسعه نرم‌افزار طرف سوم که آداپتور شما پیاده‌سازی می‌کند، پیاده‌سازی می‌شوند. برای این مثال، «کیت توسعه نرم‌افزار نمونه» دارای SampleRewardedAdDelegate با فراخوانی‌های برگشتی مربوط است:

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)
  }
}

آبجکتیو-سی

- (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 برای نمایش آگهی به پیاده‌سازی روش present(viewController:) نیاز دارد:

Swift

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

آبجکتیو-سی

- (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]
  }
}

بازارسال رویدادهای میانجی‌گری به Google Mobile Ads SDK

وقتی GADMediationRewardedLoadCompletionHandler را با آگهی بارشده فراخوانی کردید، شیء نماینده GADMediationRewardedAdEventDelegate برگردانده‌شده می‌تواند توسط آداپتور برای بازارسال رویدادهای ارائه از کیت توسعه نرم‌افزار شخص ثالث به Google Mobile Ads SDK استفاده شود. کلاس SampleCustomEventRewarded پروتکل SampleRewardedAdDelegate را برای بازارسال تماس‌های برگشتی از شبکه آگهی نمونه به Google Mobile Ads SDK پیاده‌سازی می‌کند.

مهم است که رویداد سفارشی شما تا حد امکان تعداد بیشتری از این فراخوانی‌های برگشتی را بازارسال کند تا برنامه‌تان این رویدادهای معادل را از Google Mobile Ads SDK دریافت کند. در اینجا نمونه‌ای از استفاده از فراخوانی‌های برگشتی آورده شده است:

Swift

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

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

آبجکتیو-سی

- (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];
}

با این کار، پیاده‌سازی رویدادهای سفارشی برای آگهی‌های پاداشی تکمیل می‌شود. نمونه کامل در GitHub دردسترس است. می‌توانید از آن با شبکه آگهی‌ای که ازقبل پشتیبانی می‌شود استفاده کنید یا آن را برای نمایش آگهی‌های پاداش‌دار رویداد سفارشی اصلاح کنید.