تبلیغات جایزهدار، تبلیغاتی هستند که کاربران میتوانند در ازای دریافت جوایز درونبرنامهای با آنها تعامل داشته باشند. این راهنما به شما نشان میدهد که چگونه تبلیغات جایزهدار را از Ad Manager در یک برنامه iOS ادغام کنید.
پیشنیازها
- راهنمای شروع به کار را تکمیل کنید.
همیشه با تبلیغات آزمایشی تست کنید
هنگام ساخت و آزمایش برنامههای خود، مطمئن شوید که از تبلیغات آزمایشی به جای تبلیغات زنده و تولیدی استفاده میکنید. عدم انجام این کار میتواند منجر به مسدود شدن حساب شما شود.
سادهترین راه برای بارگذاری تبلیغات آزمایشی، استفاده از شناسه واحد تبلیغات آزمایشی اختصاصی ما برای تبلیغات پاداشدار iOS است:
 /21775744923/example/rewarded
این ابزار به طور ویژه پیکربندی شده است تا برای هر درخواست، تبلیغات آزمایشی را برگرداند و شما میتوانید در برنامههای خود هنگام کدنویسی، آزمایش و اشکالزدایی از آن استفاده کنید. فقط قبل از انتشار برنامه، مطمئن شوید که آن را با شناسه واحد تبلیغاتی خود جایگزین میکنید.
برای اطلاعات بیشتر در مورد نحوه عملکرد تبلیغات آزمایشی SDK تبلیغات موبایلی گوگل، به بخش تبلیغات آزمایشی مراجعه کنید.
پیادهسازی
مراحل اصلی برای ادغام تبلیغات جایزهدار به شرح زیر است:
- بارگذاری یک تبلیغ
- [اختیاری] اعتبارسنجی فراخوانیهای SSV
- برای تماسهای برگشتی ثبتنام کنید
- نمایش تبلیغ و مدیریت رویداد پاداش
بارگذاری یک تبلیغ
 بارگذاری یک تبلیغ با استفاده از متد load(adUnitID:request) در کلاس GADRewardedAd انجام میشود. 
سویفت
func loadRewardedAd() async {
  do {
    rewardedAd = try await RewardedAd.load(
      // Replace this ad unit ID with your own ad unit ID.
      with: "/21775744923/example/rewarded", request: AdManagerRequest())
    rewardedAd?.fullScreenContentDelegate = self
  } catch {
    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
  }
}
سویفتیوآی
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:@"/21775744923/example/rewarded"
              request:[GAMRequest 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 وجود نخواهد داشت.
نمونه کد زیر نحوه تنظیم دادههای سفارشی روی یک شیء تبلیغاتی پاداشدار قبل از درخواست تبلیغ را نشان میدهد:
سویفت
هدف-سی
SAMPLE_CUSTOM_DATA_STRING با دادههای سفارشی خود جایگزین کنید.
برای تماسهای برگشتی ثبتنام کنید
 برای دریافت اعلانها برای رویدادهای ارائه، باید GADFullScreenContentDelegate را به ویژگی fullScreenContentDelegate تبلیغ برگردانده شده اختصاص دهید: 
سویفت
rewardedAd?.fullScreenContentDelegate = self
سویفتیوآی
rewardedAd?.fullScreenContentDelegate = self
هدف-سی
self.rewardedAd.fullScreenContentDelegate = self;
 پروتکل GADFullScreenContentDelegate فراخوانیهای برگشتی را برای زمانی که تبلیغ با موفقیت یا عدم موفقیت نمایش داده میشود و زمانی که رد میشود، مدیریت میکند. کد زیر نحوه پیادهسازی این پروتکل را نشان میدهد: 
سویفت
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).")
}
سویفتیوآی
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 ارائه دهید تا پاداش را برای کاربر مدیریت کند.
کد زیر بهترین روش برای نمایش یک تبلیغ جایزهدار را ارائه میدهد:
سویفت
rewardedAd.present(from: self) {
  let reward = rewardedAd.adReward
  print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
  // TODO: Reward the user.
}
سویفتیوآی
به رویدادهای رابط کاربری در نما گوش دهید تا زمان نمایش تبلیغ را تعیین کنید.
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دارد که میتوانید آن را بررسی کنید تا مبلغ پاداش را پس از بارگذاری تبلیغ تأیید کنید.
- آیا برای فراخوانی مقداردهی اولیه، مهلت زمانی وجود دارد؟
-  پس از 10 ثانیه، SDK تبلیغات موبایل گوگل، GADInitializationCompletionHandlerارائه شده به متدstartWithCompletionHandler:را فراخوانی میکند، حتی اگر یک شبکه میانجی هنوز مقداردهی اولیه را تکمیل نکرده باشد.
- اگر برخی از شبکههای میانجیگری هنگام دریافت پاسخ اولیه آماده نباشند، چه میشود؟
- توصیه میکنیم یک تبلیغ را درون - GADInitializationCompletionHandlerبارگذاری کنید. حتی اگر یک شبکه میانجیگری آماده نباشد، SDK تبلیغات موبایل گوگل همچنان از آن شبکه درخواست تبلیغ میکند. بنابراین اگر یک شبکه میانجیگری پس از اتمام زمان، مقداردهی اولیه را انجام دهد، همچنان میتواند درخواستهای تبلیغاتی آینده را در آن جلسه ارائه دهد.- شما میتوانید با فراخوانی - GADMobileAds.initializationStatusوضعیت مقداردهی اولیه همه آداپتورها را در طول جلسه برنامه خود بررسی کنید.
- چگونه بفهمم که چرا یک شبکه میانجیگری خاص آماده نیست؟
- ویژگی - descriptionاز یک شیء- GADAdapterStatusتوضیح میدهد که چرا یک آداپتور آمادهی سرویسدهی به درخواستهای تبلیغاتی نیست.
-  آیا کنترلکنندهی تکمیل userDidEarnRewardHandlerهمیشه قبل از متدadDidDismissFullScreenContent:delegate فراخوانی میشود؟
- برای تبلیغات گوگل، تمام فراخوانیهای - userDidEarnRewardHandlerقبل از- adDidDismissFullScreenContent:رخ میدهند. برای تبلیغاتی که از طریق میانجیگری ارائه میشوند، پیادهسازی SDK شبکه تبلیغاتی شخص ثالث، ترتیب فراخوانی را تعیین میکند. برای SDKهای شبکه تبلیغاتی که یک متد نماینده واحد با اطلاعات پاداش ارائه میدهند، آداپتور میانجیگری،- userDidEarnRewardHandlerقبل از- adDidDismissFullScreenContent:فراخوانی میکند.
مثالها در گیتهاب
نمونههای کامل تبلیغات پاداشدار را به زبان دلخواه خود مشاهده کنید:
مراحل بعدی
درباره حریم خصوصی کاربران بیشتر بدانید.