מודעות מתגמלות

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

מודעות מתגמלות הן מודעות שמשתמשים יכולים לקיים איתן אינטראקציה בתוספת תגמול באפליקציה. במדריך הזה נסביר איך לשלב מודעות מתגמלות באפליקציה של iOS: AdMob קראו סיפורי הצלחה של לקוחות: מקרה לדוגמה 1, מקרה לדוגמה 2.

דרישות מוקדמות

תמיד לבדוק עם מודעות בדיקה

כשאתם בונים ובודקים את האפליקציות, הקפידו להשתמש במודעות בדיקה ולא במודעות ייצור חיות. אי-ציות לחוקים או לתנאים עלול להוביל להשעיה של החשבון.

הדרך הקלה ביותר לטעון מודעות בדיקה היא להשתמש במזהה ייחודי של יחידת מודעות עבור מודעות מתגמלות ב-iOS:

ca-app-pub-3940256099942544/1712485313

הוא הוגדר במיוחד כך שיחזיר מודעות בדיקה לכל בקשה, ותוכלו להשתמש בו באפליקציות משלכם תוך כדי קידוד, בדיקה וניפוי באגים. לפני שתפרסמו את האפליקציה, הקפידו להחליף אותה במזהה יחידת המודעות שלכם.

למידע נוסף על אופן הפעולה של מודעות בדיקה של SDK למודעות לנייד, ניתן לעיין במאמר מודעות בדיקה.

יישום

אלה השלבים העיקריים לשילוב מודעות מעברון מתגמלות:

  • טעינת מודעה
  • [אופציונלי] אימות קריאות חוזרות (callback) של אימות בצד השרת
  • הרשמה לקבלת שיחות חוזרות
  • מציגים את המודעה ומטפלים באירוע הפרס

טעינת מודעה

ניתן לטעון מודעה באמצעות השיטה הסטטית loadWithAdUnitID:request:completionHandler: במחלקה GADRewardedAd. שיטת הטעינה מחייבת את המזהה של יחידת המודעות, אובייקט GADRequest וגורם handler של השלמה שמכונה אם טעינת המודעה מצליחה או נכשלה. האובייקט GADRewardedAd שנטענו מסופק כפרמטר ב-handler של ההשלמה. בדוגמה הבאה מוסבר איך לטעון GADRewardedAd בכיתת ViewController.

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() {
    let request = GADRequest()
    GADRewardedAd.load(withAdUnitID:"ca-app-pub-3940256099942544/1712485313",
                       request: request,
                       completionHandler: { [self] ad, error in
      if let error = error {
        print("Failed to load rewarded ad with error: \(error.localizedDescription)")
        return
      }
      rewardedAd = ad
      print("Rewarded ad loaded.")
    }
    )
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GADRequest *request = [GADRequest request];
  [GADRewardedAd
       loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
                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)

אפליקציות שדורשות נתונים נוספים במסגרת אימות בצד השרת קריאות חוזרות (callback) צריכות להשתמש בתכונת הנתונים המותאמים אישית של מודעות מתגמלות. כל ערך מחרוזת שמוגדר באובייקט של מודעה מתגמלת מועבר לפרמטר השאילתה custom_data של הקריאה החוזרת (callback) של האימות בצד השרת. אם לא יוגדר ערך של נתונים מותאמים אישית, הערך של פרמטר השאילתה custom_data לא יופיע בקריאה החוזרת (callback) של האימות בצד השרת.

דוגמת הקוד הבאה מדגימה איך להגדיר נתונים מותאמים אישית במודעה מתגמלת לפני ששולחים בקשה להצגת מודעה.

Swift

GADRewardedInterstitialAd.load(withAdUnitID:"ca-app-pub-3940256099942544/1712485313",
                       request: request,
                       completionHandler: { [self] ad, error in
      if let error != error {
      rewardedInterstitialAd = ad
      let options = GADServerSideVerificationOptions()
      options.customRewardString = "SAMPLE_CUSTOM_DATA_STRING"
      rewardedInterstitialAd.serverSideVerificationOptions = options
    }

Objective-C

GADRequest *request = [GADRequest request];
[GADRewardedInterstitialAd
     loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
              request:request
    completionHandler:^(GADRewardedInterstitialAd *ad, NSError *error) {
      if (error) {
        // Handle Error
        return;
      }
      self.rewardedInterstitialAd = ad;
      GADServerSideVerificationOptions *options =
          [[GADServerSideVerificationOptions alloc] init];
      options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
      ad.serverSideVerificationOptions = options;
    }];

הרשמה לקבלת שיחות חוזרות

כדי לקבל הודעות על אירועי מצגות, צריך להטמיע את הפרוטוקול GADFullScreenContentDelegate ולהקצות אותו לנכס fullScreenContentDelegate של המודעה שהוחזרה. הפרוטוקול GADFullScreenContentDelegate מטפל בקריאות חוזרות (callback) כשהמודעה מוצגת בהצלחה או כשנכשלה, וכשהיא נסגרת. הקוד הבא מראה איך להטמיע את הפרוטוקול ולהקצות אותו למודעה:

Swift

class ViewController: UIViewController, GADFullScreenContentDelegate {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() {
    let request = GADRequest()
    GADRewarded.load(withAdUnitID:"ca-app-pub-3940256099942544/1712485313",
                     request: request,
                     completionHandler: { [self] ad, error in
      if let error = error {
        print("Failed to load rewarded ad with error: \(error.localizedDescription)")
        return
      }
      rewardedAd = ad
      print("Rewarded ad loaded.")
      rewardedAd?.fullScreenContentDelegate = self
    }
    )
  }

  /// 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.")
  }
}

Objective-C

@interface ViewController ()<GADFullScreenContentDelegate>

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GADRequest *request = [GADRequest 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 כדי לטפל בתגמול של המשתמש.

הקוד הבא מציג את השיטה הטובה ביותר להצגת מודעה מתגמלת.

Swift

func show() {
  if let ad = rewardedAd {
    ad.present(fromRootViewController: self) {
      let reward = ad.adReward
      print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
      // TODO: Reward the user.
    }
  } else {
    print("Ad wasn't ready")
  }
}

Objective-C

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

שאלות נפוצות

האם אפשר לקבל את פרטי הפרס של GADRewardedAd?
כן, אם אתם צריכים את סכום התגמול לפני הפעלת הקריאה החוזרת (userDidEarnReward) ל-GADRewardedAd יש נכס adReward שאפשר לבדוק כדי לאמת את סכום התגמול אחרי שהמודעה נטענת.
האם יש זמן קצוב לתפוגה של שיחת האתחול?
לאחר 10 שניות, ה-SDK של מודעות Google לנייד מפעיל את השיטה GADInitializationCompletionHandler שסופקה בשיטה startWithCompletionHandler:, גם אם רשת הגישור עדיין לא השלימה את האיפוס.
מה קורה אם רשתות מסוימות לבחירת רשת אינן מוכנות כאשר מתקבלת קריאה חוזרת לאתחול?

מומלץ לטעון מודעה בתוך GADInitializationCompletionHandler. גם אם רשת לבחירת רשת לא מוכנה, ה-Google Mobile Ads SDK עדיין מבקש מודעה מרשת ה-SDK הזו. כך, אם רשת לבחירת רשת מסתיימת באתחול לאחר הזמן הקצוב לתפוגה, היא עדיין יכולה לשרת בקשות עתידיות למודעות מהסשן הזה.

תוכלו להמשיך לבדוק את סטטוס האתחול של כל המתאמים במהלך הסשן באפליקציה. לשם כך, עליכם להתקשר למספר GADMobileAds.initializationStatus.

איך אפשר לדעת למה רשת מסוימת לבחירת רשת לא מוכנה?

המאפיין description של אובייקט GADAdapterStatus מתאר למה מתאם לא מוכן לטיפול בבקשות להצגת מודעות.

האם ה-handler של ההשלמה של userDidEarnRewardHandler תמיד מקבל שיחה לפני השיטה 'הענקת גישה' adDidDismissFullScreenContent:?

במודעות Google, כל השיחות מסוג userDidEarnRewardHandler מתרחשות לפני adDidDismissFullScreenContent:. עבור מודעות המוצגות דרך תהליך בחירת הרשת, הטמעה של רשת המודעות של הצד השלישי היא ה-SDK של הסדר הזה. אם מדובר בערכות SDK של רשתות מודעות שמכילות שיטת הענקת גישה אחת למידע על תגמולים, המתאם לתהליך בחירת הרשת מפעיל את userDidEarnRewardHandler לפני adDidDismissFullScreenContent:.

דוגמאות ב-GitHub