آگهی‌های پاداش‌دار

آگهی‌های پاداش‌دار آگهی‌هایی هستند که کاربران این گزینه را دارند که با آن‌ها در ازای پاداش‌های درون‌برنامه تعامل کنند. این راهنما نحوه ادغام کردن آگهی‌های پاداش‌دار از AdMob در برنامه iOS را به شما نشان می‌دهد. برخی‌از داستان‌های موفقیت مشتری را بخوانید: مطالعه موردی ۱، مطالعه موردی ۲.

پیش‌نیازها

پیش‌از ادامه دادن، Google Mobile Ads SDK را راه‌اندازی کنید.

همیشه با آگهی‌های آزمایشی آزمایش کنید

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

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

ca-app-pub-3940256099942544/1712485313

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

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

پیاده‌سازی

مراحل اصلی برای ادغام آگهی‌های پاداش‌دار به شرح زیر است:

  • بار کردن آگهی
  • [اختیاری] تأیید درستی پاسخ‌های تماس SSV
  • ثبت‌نام برای پاسخ تماس
  • نمایش آگهی و مدیریت رویداد پاداش

بار کردن آگهی

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

Swift

func loadRewardedAd() async {
  do {
    rewardedAd = try await RewardedAd.load(
      // Replace this ad unit ID with your own ad unit ID.
      with: "ca-app-pub-3940256099942544/1712485313", request: Request())
    rewardedAd?.fullScreenContentDelegate = self
  } catch {
    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
  }
}

SwiftUI

import GoogleMobileAds

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

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

آبجکتیو-سی

// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
              request:[GADRequest request]
    completionHandler:^(GADRewardedAd *ad, NSError *error) {
      if (error) {
        NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
        return;
      }
      self.rewardedAd = ad;
      self.rewardedAd.fullScreenContentDelegate = self;
    }];

[اختیاری] اعتبارسنجی کردن برگشتی‌های درستی‌سنجی سمت سرور (SSV)

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

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

Swift

private func validateServerSideVerification() async {
  do {
    rewardedAd = try await RewardedAd.load(
      // Replace this ad unit ID with your own ad unit ID.
      with: "ca-app-pub-3940256099942544/1712485313", request: Request())
    let options = ServerSideVerificationOptions()
    options.customRewardText = "SAMPLE_CUSTOM_DATA_STRING"
    rewardedAd?.serverSideVerificationOptions = options
  } catch {
    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
  }
}

آبجکتیو-سی

// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
                        request:[GADRequest request]
              completionHandler:^(GADRewardedAd *ad, NSError *error) {
                if (error) {
                  NSLog(@"Rewarded ad failed to load with error: %@", error.localizedDescription);
                  return;
                }
                self.rewardedAd = ad;
                GADServerSideVerificationOptions *options =
                    [[GADServerSideVerificationOptions alloc] init];
                options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
                ad.serverSideVerificationOptions = options;
              }];

‫SAMPLE_CUSTOM_DATA_STRING را با داده‌های سفارشی خودتان جایگزین کنید.

ثبت‌نام برای پاسخ تماس

برای دریافت اعلان‌های رویدادهای ارائه، باید GADFullScreenContentDelegate را به دارایی fullScreenContentDelegate آگهی برگشتی اختصاص دهید:

Swift

rewardedAd?.fullScreenContentDelegate = self

SwiftUI

rewardedAd?.fullScreenContentDelegate = self

آبجکتیو-سی

self.rewardedAd.fullScreenContentDelegate = self;

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

Swift

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

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

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

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

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

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("\(#function) called with error: \(error.localizedDescription).")
}

SwiftUI

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

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

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

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

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

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

آبجکتیو-سی

- (void)adDidRecordImpression:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adDidRecordClick:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adWillPresentFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adWillDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adDidDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
  // Clear the rewarded ad.
  self.rewardedAd = nil;
}

- (void)ad:(id)ad didFailToPresentFullScreenContentWithError:(NSError *)error {
  NSLog(@"%s called with error: %@", __PRETTY_FUNCTION__, error.localizedDescription);
}

نمایش آگهی و مدیریت رویداد پاداش

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

هنگام ارائه آگهی‌تان، باید یک شیء GADUserDidEarnRewardHandler ارائه دهید تا پاداش کاربر را مدیریت کند.

کد زیر بهترین روش برای نمایش آگهی پاداش‌دار را ارائه می‌دهد:

Swift

rewardedAd.present(from: self) {
  let reward = rewardedAd.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
      }

آگهی پاداش‌دار را از مدل نمای ارائه دهید:

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

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

آبجکتیو-سی

[self.rewardedAd presentFromRootViewController:self
                      userDidEarnRewardHandler:^{
                        GADAdReward *reward = self.rewardedAd.adReward;
                        NSString *rewardMessage = [NSString
                            stringWithFormat:@"Reward received with currency %@ , amount %lf",
                                             reward.type, [reward.amount doubleValue]];
                        NSLog(@"%@", rewardMessage);

                        // TODO: Reward the user.
                      }];

پرسشگان

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

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

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

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

دارایی description شیء GADAdapterStatus توضیح می‌دهد که چرا آداپتور برای ارائه خدمات به درخواست‌های آگهی آماده نیست.

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

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

مثال‌ها در GitHub

نمونه‌های کامل آگهی‌های پاداش‌دار را به زبان ترجیحی‌تان مشاهده کنید:

مراحل بعدی

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