تبلیغات با پاداش

تبلیغات پاداش، تبلیغاتی هستند که کاربران در ازای دریافت جوایز درون‌برنامه، می‌توانند با آن‌ها تعامل داشته باشند. این راهنما به شما نشان می دهد که چگونه تبلیغات پاداش از Ad Manager را در یک برنامه iOS ادغام کنید.

پیش نیازها

همیشه با تبلیغات آزمایشی تست کنید

هنگام ساخت و آزمایش برنامه های خود، مطمئن شوید که از تبلیغات آزمایشی به جای تبلیغات زنده و تولیدی استفاده می کنید. عدم انجام این کار می تواند منجر به تعلیق حساب شما شود.

ساده ترین راه برای بارگیری تبلیغات آزمایشی استفاده از شناسه واحد آگهی آزمایشی اختصاصی ما برای تبلیغات دارای پاداش iOS است:

/21775744923/example/rewarded

این به‌طور ویژه پیکربندی شده است تا تبلیغات آزمایشی را برای هر درخواست بازگرداند، و شما می‌توانید هنگام کدنویسی، آزمایش و اشکال‌زدایی از آن در برنامه‌های خود استفاده کنید. فقط مطمئن شوید که قبل از انتشار برنامه خود، آن را با شناسه واحد تبلیغاتی خود جایگزین کنید.

برای کسب اطلاعات بیشتر در مورد نحوه عملکرد تبلیغات آزمایشی SDK Ads Mobile، به Test Ads مراجعه کنید.

پیاده سازی

مراحل اولیه برای ادغام تبلیغات پاداش به شرح زیر است:

  • یک تبلیغ را بارگیری کنید
  • [اختیاری] اعتبار سنجی تماس های SSV
  • برای پاسخ به تماس ها ثبت نام کنید
  • تبلیغ را نمایش دهید و رویداد پاداش را مدیریت کنید

یک تبلیغ را بارگیری کنید

بارگیری تبلیغ با استفاده از روش load(adUnitID:request) در کلاس GADRewardedAd انجام می شود.

سویفت

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "/21775744923/example/rewarded", request: GAMRequest())
    } catch {
      print("Rewarded ad failed to load with error: \(error.localizedDescription)")
    }
  }
}

SwiftUI

import GoogleMobileAds

class RewardedViewModel: NSObject, ObservableObject, GADFullScreenContentDelegate {
  @Published var coins = 0
  private var rewardedAd: GADRewardedAd?

  func loadAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest())
      rewardedAd?.fullScreenContentDelegate = self
    } catch {
      print("Failed to load rewarded ad with error: \(error.localizedDescription)")
    }
  }

هدف-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GAMRequest *request = [GAMRequest request];
  [GADRewardedAd
      loadWithAdUnitID:@"/21775744923/example/rewarded"
                request:request
      completionHandler:^(GADRewardedAd *ad, NSError *error) {
        if (error) {
          NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
          return;
        }
        self.rewardedAd = ad;
        NSLog(@"Rewarded ad loaded.");
      }];
}

[اختیاری] تأیید اعتبار سمت سرور (SSV) تماس های برگشتی

برنامه‌هایی که به داده‌های اضافی در تماس‌های تأیید سمت سرور نیاز دارند، باید از ویژگی داده سفارشی تبلیغات پاداش استفاده کنند. هر مقدار رشته تنظیم شده روی یک شیء تبلیغاتی پاداش داده شده به پارامتر query custom_data در SSV ارسال می شود. اگر مقدار داده سفارشی تنظیم نشده باشد، مقدار پارامتر query custom_data در پاسخ تماس SSV وجود نخواهد داشت.

نمونه کد زیر نشان می‌دهد که چگونه داده‌های سفارشی را روی یک شی تبلیغاتی پاداش داده شده قبل از درخواست آگهی تنظیم کنید.

سویفت

do {
  rewardedAd = try await GADRewardedAd.load(
    withAdUnitID: "/21775744923/example/rewarded", request: GAMRequest())
  let options = GADServerSideVerificationOptions()
  options.customRewardString = "SAMPLE_CUSTOM_DATA_STRING"
  rewardedAd.serverSideVerificationOptions = options
} catch {
  print("Rewarded ad failed to load with error: \(error.localizedDescription)")
}

هدف-C

[GADRewardedAd
     loadWithAdUnitID:@"/21775744923/example/rewarded"
              request:[GAMRequest request];
    completionHandler:^(GADRewardedAd *ad, NSError *error) {
      if (error) {
        // Handle Error
        return;
      }
      self.rewardedAd = ad;
      GADServerSideVerificationOptions *options =
          [[GADServerSideVerificationOptions alloc] init];
      options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
      ad.serverSideVerificationOptions = options;
    }];

برای پاسخ به تماس ها ثبت نام کنید

برای دریافت اعلان‌ها برای رویدادهای ارائه، باید پروتکل GADFullScreenContentDelegate را پیاده‌سازی کنید و آن را به ویژگی fullScreenContentDelegate تبلیغ برگشتی اختصاص دهید. پروتکل GADFullScreenContentDelegate برای زمانی که تبلیغ با موفقیت یا ناموفق نمایش داده می شود و زمانی که رد می شود، پاسخ به تماس ها را کنترل می کند. کد زیر نحوه پیاده سازی پروتکل و اختصاص آن به تبلیغ را نشان می دهد:

سویفت

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADFullScreenContentDelegate {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "/21775744923/example/rewarded", request: GAMRequest())
      rewardedAd?.fullScreenContentDelegate = self
    } catch {
      print("Rewarded ad failed to load with error: \(error.localizedDescription)")
    }
  }

  /// Tells the delegate that the ad failed to present full screen content.
  func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
    print("Ad did fail to present full screen content.")
  }

  /// Tells the delegate that the ad will present full screen content.
  func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("Ad will present full screen content.")
  }

  /// Tells the delegate that the ad dismissed full screen content.
  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("Ad did dismiss full screen content.")
  }
}

SwiftUI

ویژگی fullScreenContentDelegate را به تبلیغ برگشتی اختصاص دهید:

rewardedAd?.fullScreenContentDelegate = self

اجرای پروتکل:

func adDidRecordImpression(_ ad: GADFullScreenPresentingAd) {
  print("\(#function) called")
}

func adDidRecordClick(_ ad: GADFullScreenPresentingAd) {
  print("\(#function) called")
}

func ad(
  _ ad: GADFullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("\(#function) called")
}

func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
  print("\(#function) called")
}

func adWillDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
  print("\(#function) called")
}

func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
  print("\(#function) called")
  // Clear the rewarded ad.
  rewardedAd = nil
}

هدف-C

@interface ViewController () <GADFullScreenContentDelegate>

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GAMRequest *request = [GAMRequest request];
  [GADRewardedAd
      loadWithAdUnitID:@"ca-app-pub-3940256099942544/4806952744"
                request:request
      completionHandler:^(GADRewardedAd *ad, NSError *error) {
        if (error) {
          NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
          return;
        }
        self.rewardedAd = ad;
        NSLog(@"Rewarded ad loaded.");
        self.rewardedAd.fullScreenContentDelegate = self;
      }];
}

/// Tells the delegate that the ad failed to present full screen content.
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
    NSLog(@"Ad did fail to present full screen content.");
}

/// Tells the delegate that the ad will present full screen content.
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
    NSLog(@"Ad will present full screen content.");
}

/// Tells the delegate that the ad dismissed full screen content.
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
    NSLog(@"Ad did dismiss full screen content.");
}

GADRewardedAd یک شی یک بار مصرف است. این بدان معناست که هنگامی که یک تبلیغ پاداش نشان داده می شود، دیگر نمی توان آن را نشان داد. بهترین روش این است که یک تبلیغ پاداش دار دیگر را در روش adDidDismissFullScreenContent: در GADFullScreenContentDelegate بارگیری کنید تا آگهی پاداش بعدی به محض رد شدن آگهی قبلی شروع به بارگیری کند.

تبلیغ را نمایش دهید و رویداد پاداش را مدیریت کنید

قبل از نمایش یک تبلیغ پاداش به کاربران، باید به کاربر یک انتخاب صریح برای مشاهده محتوای تبلیغاتی با پاداش در ازای دریافت پاداش ارائه دهید. تبلیغات با پاداش همیشه باید یک تجربه انتخابی باشد.

هنگام ارائه تبلیغ خود، باید یک شی GADUserDidEarnRewardHandler برای مدیریت پاداش برای کاربر ارائه دهید.

کد زیر بهترین روش برای نمایش یک تبلیغ با پاداش را ارائه می دهد.

سویفت

func show() {
  guard let rewardedAd = rewardedAd else {
    return print("Ad wasn't ready.")
  }

  // The UIViewController parameter is an optional.
  ad.present(fromRootViewController: nil) {
    let reward = ad.adReward
    print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
    // TODO: Reward the user.
  }
}

SwiftUI

برای تعیین زمان نمایش آگهی، به رویدادهای رابط کاربری در نما گوش دهید.

var body: some View {
  VStack(spacing: 20) {
      Button("Watch video for additional 10 coins") {
        viewModel.showAd()
        showWatchVideoButton = false
      }

تبلیغ پاداش را از مدل view ارائه دهید:

func showAd() {
  guard let rewardedAd = rewardedAd else {
    return print("Ad wasn't ready.")
  }

  rewardedAd.present(fromRootViewController: nil) {
    let reward = rewardedAd.adReward
    print("Reward amount: \(reward.amount)")
    self.addCoins(reward.amount.intValue)
  }
}

هدف-C

- (void)show {
  if (self.rewardedAd) {
    // The UIViewController parameter is nullable.
    [self.rewardedAd presentFromRootViewController:nil
                                  userDidEarnRewardHandler:^{
                                  GADAdReward *reward =
                                      self.rewardedAd.adReward;
                                  // TODO: Reward the user!
                                }];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

سوالات متداول

آیا می توانم جزئیات پاداش GADRewardedAd را دریافت کنم؟
بله، اگر قبل از شروع به تماس userDidEarnReward به مقدار پاداش نیاز دارید، GADRewardedAd دارای یک ویژگی adReward است که می‌توانید پس از بارگیری آگهی، مقدار پاداش را بررسی کنید.
آیا مهلت زمانی برای تماس اولیه وجود دارد؟
پس از 10 ثانیه، Google Mobile Ads SDK GADInitializationCompletionHandler ارائه شده به روش startWithCompletionHandler: را فراخوانی می کند، حتی اگر یک شبکه میانجی هنوز مقداردهی اولیه را کامل نکرده باشد.
اگر برخی از شبکه‌های میانجی آماده نباشند، چه باید کرد؟

توصیه می کنیم یک آگهی را در داخل GADInitializationCompletionHandler بارگیری کنید. حتی اگر یک شبکه میانجی آماده نباشد، Google Mobile Ads SDK همچنان از آن شبکه درخواست تبلیغ می‌کند. بنابراین، اگر یک شبکه میانجی پس از اتمام زمان، شروع به کار کند، همچنان می‌تواند درخواست‌های تبلیغات آینده را در آن جلسه سرویس دهد.

می‌توانید با تماس با GADMobileAds.initializationStatus به بررسی وضعیت اولیه همه آداپتورها در طول جلسه برنامه خود ادامه دهید.

چگونه می توانم بفهمم که چرا یک شبکه میانجی خاص آماده نیست؟

ویژگی description یک شی GADAdapterStatus توضیح می دهد که چرا یک آداپتور برای سرویس دهی به درخواست های تبلیغاتی آماده نیست.

آیا کنترل کننده تکمیل userDidEarnRewardHandler همیشه قبل از متد adDidDismissFullScreenContent: delegate فراخوانی می شود؟

برای تبلیغات Google، همه تماس‌های userDidEarnRewardHandler قبل از adDidDismissFullScreenContent: برای تبلیغاتی که از طریق میانجیگری ارائه می‌شوند، پیاده‌سازی SDK شبکه تبلیغاتی شخص ثالث ترتیب برگشت به تماس را تعیین می‌کند. برای SDK های شبکه تبلیغاتی که یک روش نماینده واحد را با اطلاعات پاداش ارائه می کنند، آداپتور میانجی userDidEarnRewardHandler قبل از adDidDismissFullScreenContent: فراخوانی می کند.

نمونه هایی در GitHub

نمونه‌های کامل تبلیغات پاداش را به زبان دلخواه خود مشاهده کنید:

مراحل بعدی

درباره حریم خصوصی کاربر بیشتر بیاموزید.