העברת SDK

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

מעבר מגרסה 10 לגרסה 11

יעד פריסה מינימלי

יעד הפריסה המינימלי הועלה ל-iOS 12.

גרסת Xcode מינימלית

גרסת ה-Xcode המינימלית הנתמכת הוגדלה ל-15.1.

מודעות מפסיקות להופיע ב-iOS 12

גרסה 11.0.0 של Google Mobile Ads SDK מציגה מודעות רק במכשירים שמותקנת בהם מערכת ההפעלה iOS 13 גבוהה יותר.

הסרת התלות ב-GoogleAppMeasurement

בגרסה 11.0.0 התלות היעד GoogleAppMeasurement הוסר. התלות הזאת שמפעילה את מתג מדדי המשתמשים ב-AdMob תהיה הופסק בתחילת 2024. שפת תרגום להמשיך לאסוף מדדי משתמשים ב-AdMob, לקשר את האפליקציה ב-AdMob ל-Firebase וגם לשלב את SDK של Google Analytics for Firebase: באפליקציה שלך.

שינויים בהצגת מודעות במסך מלא

השינויים הבאים משפיעים על הפורמטים השונים של המודעות:

  • מודעות בפתיחת אפליקציה
  • מעברון
  • ההטבה הופעלה
  • מודעות מעברון מתגמלות

הפרמטר של בקר הצפיות ב--canPresentFromRootViewController:error: וב- הערך -presentFromRootViewController: הוא ערך null. אם ערך היעד הוא nil, המודעה מוצג מבקרת הצפיות ברמה העליונה ביותר בהיררכיה של בקר התצוגות המפורטות.

שיטות שהוסרו

השיטות הבאות יוסרו.

סוג גרסה 11.0.0 שיטה הערות
GADAppOpenAd load(withAdUnitID adUnitID: String, request: GADRequest?, orientation: UIInterfaceOrientation) במקום זאת, אתם צריכים להשתמש ב-load(withAdUnitID adUnitID: String, request: GADRequest?).
GADMediationBannerAdEventDelegate willBackgroundApplication() אין תחליף.
GADMediationInterstitialAdEventDelegate willBackgroundApplication() אין תחליף.
GADMediationNativeAdEventDelegate willBackgroundApplication() אין תחליף.
GADMediationRewardedAdEventDelegate didRewardUser(with reward: GADAdReward) במקום זאת, אתם צריכים להשתמש ב-didRewardUser().
GADMediatedUnifiedNativeAdNotificationSource mediatedNativeAdWillLeaveApplication(_ mediatedNativeAd: GADMediatedUnifiedNativeAd) אין תחליף.
GADRequestConfiguration setSameAppKeyEnabled(_ enabled: Bool) במקום זאת, אתם צריכים להשתמש ב-setPublisherFirstPartyIDEnabled(_ enabled: Bool).
tagForUnderAge(ofConsent underAgeOfConsent: Bool) במקום זאת, צריך להשתמש בנכס tagForUnderAgeOfConsent.
tag(forChildDirectedTreatment childDirectedTreatment: Bool) במקום זאת, צריך להשתמש בנכס tagForChildDirectedTreatment.

נכסים שהוסרו

המאפיינים הבאים הוסרו.

גרסה v11.0.0 נכס הערות
GADMediationAdConfiguration hasUserLocation אין תחליף.
userLatitude
userLongitude
userLocationAccuracyInMeters
childDirectedTreatment במקום זאת, אתם צריכים להשתמש ב-GADMobileAds.sharedInstance.requestConfiguration.tagForChildDirectedTreatment.
GADResponseInfo adNetworkClassName במקום זאת, יש להשתמש ב-adNetworkClassName מ-loadedAdNetworkResponseInfo.

הוסר GADAdFormat לא ידוע

בוצעה הסרה של GADAdFormatUnknown ללא החלפה.

שינויים בגרסת ה-SDK לרישום ביומן

גרסה 11.0.0 מסירה את sdkVersion. כדי לתעד את הגרסה של Google Mobile Ads SDK: להשתמש ב-versionNumber במקום זאת.

גרסה 10.0.0

GADMobileAds.sharedInstance().sdkVersion

גרסה 11.0.0

GADGetStringFromVersionNumber(GADMobileAds.sharedInstance().versionNumber)

שינויים בטיפול בשגיאות של GADAdLoader

החל מגרסה 11.0.0, GADAdLoader לא ישלח בקשה להצגת מודעה אם delegate לא תואמת לסוגי המודעות המבוקשות פרוטוקול להענקת גישה. בעבר, הוא נכשלה לאחר שליחת הבקשה להצגת מודעה.

שינויים בהתנהגות הבדיקה

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

מחלקה נכס
GADMediationAdConfiguration isTestRequest
GADCustomEventRequest isTesting
v10.0.0 v11.0.0
  • המכשיר הוצהר במפורש כמכשיר בדיקה ב-testDeviceIdentifiers.
  • המכשיר הוצהר במפורש כמכשיר בדיקה ב-testDeviceIdentifiers.
  • המכשיר הוא סימולטור.
  • המכשיר מוצהר באופן מפורש כמכשיר בדיקה בממשק המשתמש Ad Manager .

מעבר מגרסה 9 לגרסה 10

הפסקת ההצגה של המודעות ב-iOS 11

בגרסה 10.0.0 של Google Mobile Ads SDK מוצגות מודעות רק במכשירים עם iOS מגרסה 12 ואילך.

שדרוג לגרסה 10.0.0 של Google Mobile Ads SDK לא יקטע את האפליקציה במכשירי iOS 11 ו-iOS 10, אבל לא יוצגו מודעות במכשירים האלה.

הדרישה למזהה אפליקציה ב-Ad Manager

עכשיו מזהה האפליקציה ב-Ad Manager נדרש עכשיו ב-Info.plist בכל האפליקציות ב-Ad Manager, ונדרש הפורמט ca-app-pub-################~##########. לפרטים נוספים, ראו עדכון ה-Info.plist.

דרישה של GoogleAppMeasurement.xcframework

עכשיו צריך להתקין את GoogleAppMeasurement.xcframework בכל האפליקציות של Ad Manager. אם מתקינים את Google Mobile Ads SDK דרך Cocoapods או Swift Package Manager, אין צורך לבצע פעולה נוספת. אם אתם מתקינים את frameworks באופן ידני, קראו את המאמר הורדה ידנית לקבלת פרטים נוספים.

אין יותר תמיכה במבנה עם קוד ביט

מעכשיו, כדי לשלב את Google Mobile Ads SDK צריך להשבית את ה-bitcode באפליקציות לנייד.

סוגים שהוסרו

תיאור הערות
GADGender אין החלפה.
GADMRewardBasedVideoAdNetworkAdapterProtocol כל המתאמים של תהליך בחירת הרשת ליחידת מודעות מתגמלות הרשומים ב- Choose Networks הפסיקו להשתמש בפרוטוקולים האלה במשך יותר משנה. שימוש ב- GADMediationAdapter לתהליך בחירת הרשת ולאירועים בהתאמה אישית.
GADMRewardBasedVideoAdNetworkConnectorProtocol

הנכסים הוסרו

המאפיינים הבאים הוסרו ללא החלפה.

רמה 10.0.0 נכס
GADMediationAdRequest userBirthday
userGender
userHasLocation
userLatitude
userLongitude
userLocationAccuracyInMeters
userLocationDescription
GADCustomEventRequest userHasLocation
userLatitude
userLongitude
userLocationAccuracyInMeters
userLocationDescription

מעבר מגרסה 8 לגרסה 9

הפסקת ההצגה של מודעות ב-iOS 10

גרסת iOS המינימלית שנתמכת בגרסה 9.0.0 של Google Mobile Ads SDK היא iOS 11.

שדרוג לגרסה 9.0.0 של Google Mobile Ads SDK לא יכבה את האפליקציה במכשירי iOS 10, אבל לא יוצגו מודעות במכשירים האלה.

אכיפה מחמירה יותר של הפקדים בשורת הסטטוס

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

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

שינוי השם של adDidShowFullScreenContent: ל-adWillpresentFullScreenContent:

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

הסרת API של הגדרת מיקום ב-GADRequest

- (void)setLocationWithLatitude:longitude:accuracy: נמחק מ-GADRequest מפני ש-Google לא משתמשת בנתוני מיקום כדי למקד מודעות. שימוש בממשקי API של צד שלישי כדי לספק את המידע לרשתות המודעות של הצד השלישי, במקרה הצורך.

הוצאה משימוש של ממשקים של אירועים מותאמים אישית

אירועים מותאמים אישית מאפשרים לבעלי אפליקציות שמשתמשים ב Ad Manager תהליך בחירת הרשת (Mediation) להוסיף את תהליך בחירת הרשת (Mediation) ב-Waterfall עבור רשת מודעות שאינה אחת מרשתות המודעות הנתמכות.

כל הפרוטוקולים של אירועים מותאמים אישית הוצאו משימוש. במקום זאת, כדאי להשתמש בפרוטוקולים הקיימים GADMediationAdapter ו-GADMediationAdEventDelegate כדי להשיג את אותן פונקציות. השינוי הזה משפר את הבהירות ומאפשר לך ליצור אירועים מותאמים אישית למודעות מתגמלות ולמודעות מעברון גלילה שלא היו זמינות קודם לכן.

ממשקי API

בטבלה הבאה מפורטים ממשקי ה-API המתאימים של המתאמים לתהליך בחירת הרשת אל ממשקי API של אירועים מותאמים אישית, שבהם יש להשתמש החל מגרסה 9.0.0.

v8 v9
GADCustomEventBanner
GADCustomEventInterstitial
GADCustomEventNativeAd
GADMediationAdapter GADMediationBannerAd
GADMediationInterstitialAd
GADMediationInterscrollerAd
GADMediationRewardedAd
GADMediationNativeAd
delegate מקבל הגישה מוחזר על ידי המטפל להשלמת הטעינה של כל פונקציית טעינה של מחלקה GADMediationAdapter
-init -init
-requestBannerAd:parameter:label:request: -loadBannerForAdConfiguration:completionHandler:
-requestInterstitialAdWithParameter:label:request: -loadInterstitialForAdConfiguration:completionHandler:
-requestNativeAdWithParameter:request:adTypes:options:rootViewController: -loadNativeAdForAdConfiguration:completionHandler:
לא רלוונטי -loadInterscrollerAdForAdConfiguration:completionHandler:
לא רלוונטי -loadRewardedAdForAdConfiguration:completionHandler:
-presentFromRootViewController: -presentFromViewController:
-handlesUserClicks -handlesUserClicks
-handlesUserImpressions -handlesUserImpressions

שיטות להאצלת זכויות

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

v8 v9
GADCustomEventBannerOwner
GADCustomEventInterstitial()
GADCustomEventNativeAd בוצע
GADMediationAdEventDelegate מודעת GADMediation
-customEventBanner:didReceiveAd:
-customEventInterstitialDidReceiveAd:
סטטוס טעינת המודעות נכלל ב-handler של השלמת הטעינה של כל פונקציית טעינה במחלקה GADMediationAdapter
-customEventBanner:didFailAd:
-customEventInterstitial:didFailAd:
-customEventBannerWasClicked:
-customEventInterstitialWasClicked:
-reportClick
-customEventBannerWillPresentModal:
-customEventInterstitialWillPresentModal:
-willPresentFullScreenView
-customEventBannerWillDismissModal:
-customEventInterstitialWillDismissModal:
-willDismissFullScreenView
-customEventBannerDidDismissModal:
-customEventInterstitialDidDismissModal:
-didDismissFullScreenView
-customEventBannerWillLeaveApplication:
-customEventInterstitialWillLeaveApplication:
-willBackgroundApplication
viewControllerForPresentingModalView -[GADMediationBannerAd view]

שיטות וקבועים אחרים שהוסרו/הוחלפו

שינויים ב-method, בקבוע או בנכס
קבועים (kGAD-) עם קידומת הנושא הוסר. שימוש בקבועים עם קידומת GAD-.
GADAdNetworkResponseInfo credentials הוסרו. במקומה צריך להשתמש במדיניות adUnitMapping.
GAMRequest האפשרות kGAMSimulatorID ב-GAMRequest הוצאה משימוש. במקום זאת, יש להשתמש בתוסף GADSimulatorID ב-GADRequestConfiguration.
GADCustomNativeAd האפשרות mediaView ב-GADCustomNativeAd הוצאה משימוש. במקומה צריך להשתמש במדיניות mediaContent.
ממשקי API לרכישה מתוך האפליקציה ב-GoogleMobileAds הוסרו inAppPurchase ממשקי API ב-GoogleMobileAds.

מעבר מגרסה 7 לגרסה 8

גרסה 8.0.0 של Google Mobile Ads SDK כוללת כמה שינויים משמעותיים, וגם שינויי שמות והסרות של ממשקי API.

עדכונים לגבי פורמט במסך מלא

החל מגרסה 8.0.0, מודעות המעברון והמודעות המתגמלות כוללות חוויה כללית של של המודעה במסך לקבלת יותר עקביות. ממשקי ה-API החדשים להצגת מודעות במסך מלא כוללים ההבדלים העיקריים בין ממשקי ה-API של מודעות במסך מלא בגרסה 7:

  1. שיטת הכיתה הסטטית load.

    הגישה הקודמת לטעינה/הצגה של מודעה במסך מלא היא:

    1. יצירת מופע של אובייקט מודעה והפניה אליו.
    2. הקצאת משתמש אחר המטפל בטעינה והצגה של התקשרות חזרה.
    3. טוענים מודעה.
    4. אפשר להשתמש ב-isReady כדי לבדוק אם המודעה נטענה.
    5. מציגים את המודעה.

    בגרסה 8 הגישה משתנה מעט. אין יותר קריאות חוזרות (callback) חלק מהענקת גישה. במקום זאת, הן מועברות ל-method load בתור רכיב handler של השלמה:

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

    הגישה החדשה מספקת את היתרונות הבאים:

    • אף פעם לא יהיה לך הפניה למודעה שלא נטענה.
    • אין צורך להחזיק אובייקט של מודעה בזמן שהיא נטענת.
  2. אירועי מודעות עקביים.

    סוג אירוע API קיים v8 API
    טעינת אירועים GADInterstitialDelegate או GADRewardedAdDelegate GAMInterstitialAdLoadCompletionHandler או GADRewardedAdLoadCompletionHandler
    אירועי מצגת GADFullScreenContentDelegate

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

    בגרסה 8, אירועי הטעינה וההצגה הם נפרדים. מעכשיו אפשר לרשום GADFullScreenContentDelegate בכל שלב לפני הצגת המודעה במקום להידרש להגדיר כלל בעל גישה לפני טעינת המודעה. אירועים של טעינת מודעות, שהם ספציפיים לכל אירוע , מעבר ל-handler יחיד של השלמת טעינה שהועברה בשיטת הטעינה.

מעברון

טעינת מודעה

קטעי הקוד הבאים מראים איך לטעון מודעת מעברון ולהאזין אירועים שבהם המודעה מצליחה או לא נטענת.

v7

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADInterstitialDelegate {

  var interstitial: DFPInterstitial!

  override func viewDidLoad() {
    super.viewDidLoad()
    interstitial = DFPInterstitial(adUnitID: "/21775744923/example/interstitial")
    interstitial.delegate = self
    let request = GAMRequest()
    interstitial.load(request)
  }

  /// Tells the delegate an ad request succeeded.
  func interstitialDidReceiveAd(_ ad: DFPInterstitial) {
    print("Interstitial ad loaded.")
  }

  /// Tells the delegate an ad request failed.
  func interstitial(_ ad: DFPInterstitial, didFailToReceiveAdWithError error: GADRequestError) {
    print("Interstitial ad failed to load with error: \(error.localizedDescription)")
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController () 

@property(nonatomic, strong) DFPInterstitial *interstitial;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.interstitial = [[DFPInterstitial alloc]
      initWithAdUnitID:@"/21775744923/example/interstitial"];
  self.interstitial.delegate = self;
  GAMRequest *request = [GAMRequest request];
  [self.interstitial loadRequest:request];
}

/// Tells the delegate an ad request succeeded.
- (void)interstitialDidReceiveAd:(DFPInterstitial *)ad {
  NSLog(@"Insterstitial ad loaded.");
}

/// Tells the delegate an ad request failed.
- (void)interstitial:(DFPInterstitial *)ad
    didFailToReceiveAdWithError:(GADRequestError *)error {
  NSLog(@"Interstitial ad failed to load with error: %@", [error localizedDescription]);
}

v8

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADFullScreenContentDelegate {

  var interstitial: GAMInterstitialAd?

  override func viewDidLoad() {
    super.viewDidLoad()
    let request = GAMRequest()
    GAMInterstitialAd.load(withAdUnitID:"ca-app-pub-8123415297019784/4985798738",
                                request: request,
                      completionHandler: { (ad, error) in
                        if let error = error {
                          print("Failed to load interstitial ad with error: \(error.localizedDescription)")
                          return
                        }
                        self.interstitial = ad
                        self.interstitial.fullScreenContentDelegate = self
                      }
    )
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController () 

@property(nonatomic, strong) GAMInterstitialAd *interstitial;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  GAMRequest *request = [GAMRequest request];
  [GAMInterstitialAd loadWithAdUnitID:@"/21775744923/example/interstitial"
                              request:request
                    completionHandler:^(GAMInterstitialAd *ad, NSError *error) {
    if (error) {
      NSLog(@"Failed to load interstitial ad with error: %@", [error localizedDescription]);
      return;
    }
    self.interstitial = ad;
    self.interstitial.fullScreenContentDelegate = self;
  }];
}

מודעה ברשת המדיה

v7

Swift

func showInterstitial() {
  ...
  if interstitial.isReady {
    interstitial.present(fromRootViewController: self)
  } else {
    print("Ad wasn't ready")
  }
}

Objective-C

- (void)showInterstitial: {
  ...
  if (self.interstitial.isReady) {
    [self.interstitial presentFromRootViewController:self];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

v8

Swift

func showInterstitial() {
  ...
  if let ad = interstitial {
    ad.present(fromRootViewController: self)
  } else {
    print("Ad wasn't ready")
  }
}

Objective-C

- (void)showInterstitial: {
  ...
  if (self.interstitial) {
    [self.interstitial presentFromRootViewController:self];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

אירועים של מודעות מצגת

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

v7

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  interstitial = DFPInterstitial(adUnitID: "/21775744923/example/interstitial")
  interstitial.delegate = self
  ...
}

/// Tells the delegate that an interstitial will be presented.
func interstitialWillPresentScreen(_ ad: DFPInterstitial) {
  print("Interstitial ad will be presented.")
}

/// Tells the delegate the interstitial is to be animated off the screen.
func interstitialWillDismissScreen(_ ad: DFPInterstitial) {
  print("Interstitial ad will be dismissed.")
}

/// Tells the delegate the interstitial had been animated off the screen.
func interstitialDidDismissScreen(_ ad: DFPInterstitial) {
  print("Interstitial ad dismissed.")
}

/// Tells the delegate that a user click will open another app
/// (such as the App Store), backgrounding the current app.
///
/// This is not a reliable callback for an ad click event and is removed in
/// version 8. If you wish to listen to an ad causing a user to leave the app,
/// use applicationWillResignActive: or sceneWillResignActive: instead.
func interstitialWillLeaveApplication(_ ad: DFPInterstitial) {
  print("Interstitial ad will leave application.")
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  self.interstitial = [[DFPInterstitial alloc] initWithAdUnitID:"/21775744923/example/interstitial"];
  self.interstitial.delegate = self;
  ...
}

/// Tells the delegate that an interstitial will be presented.
- (void)interstitialWillPresentScreen:(DFPInterstitial *)ad {
  NSLog(@"Interstitial ad will be presented.");
}

/// Tells the delegate the interstitial is to be animated off the screen.
- (void)interstitialWillDismissScreen:(DFPInterstitial *)ad {
  NSLog(@"Interstitial ad will be dismissed.");
}

/// Tells the delegate the interstitial had been animated off the screen.
- (void)interstitialDidDismissScreen:(DFPInterstitial *)ad {
  NSLog(@"Interstitial ad dismissed.");
}

/// Tells the delegate that a user click will open another app
/// (such as the App Store), backgrounding the current app.
///
/// This is not a reliable callback for an ad click event and is removed in
/// version 8. If you wish to listen to an ad causing a user to leave the app,
/// use applicationWillResignActive: or sceneWillResignActive: instead.
- (void)interstitialWillLeaveApplication:(DFPInterstitial *)ad {
  NSLog(@"Interstitial ad will leave application.");
}

v8

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  let request = GAMRequest()
  GAMInterstitialAd.load(withAdUnitID:"ca-app-pub-8123415297019784/4985798738",
                              request: request,
                    completionHandler: { (ad, error) in
                      if let error = error {
                        print(error.localizedDescription)
                        return
                      }
                      self.interstitial = ad
                      self.interstitial.fullScreenContentDelegate = self
                    }
  )
}

func adDidPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
  print("Ad did present full screen content.")
}

func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
  print("Ad failed to present full screen content with error \(error.localizedDescription).")
}

func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
  print("Ad did dismiss full screen content.")
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  GAMRequest *request = [GAMRequest request];
  [GAMInterstitialAd loadWithAdUnitID:@"/21775744923/example/interstitial"
                              request:request
                    completionHandler:^(GAMInterstitialAd *ad, NSError *error) {
    if (error) {
      NSLog(@"interstitial:didFailToReceiveAdWithError: %@", [error localizedDescription])
      return;
    }
    self.interstitial = ad;
    self.interstitial.fullScreenContentDelegate = self;
  }];
}

- (void)adDidPresentFullScreenContent:(id)ad {
  NSLog(@"Ad did present full screen content.");
}

- (void)ad:(id)ad didFailToPresentFullScreenContentWithError:(NSError *)error {
  NSLog(@"Ad failed to present full screen content with error %@.", [error localizedDescription]);
}

- (void)adDidDismissFullScreenContent:(id)ad {
  NSLog(@"Ad did dismiss full screen content.");
}

ההטבה הופעלה

טעינת מודעה

v7

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADRewardedAdDelegate {
  /// The rewarded ad.
  var rewardedAd: GADRewardedAd?

  override func viewDidLoad() {
    super.viewDidLoad()
    rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
    rewardedAd.delegate = self
    rewardedAd?.load(GAMRequest()) { error in
      if let error = error {
        print("Rewarded ad failed to load with error: \(error.localizedDescription)")
      } else {
        print("Rewarded ad loaded.")
      }
    }
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController () 

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];
  self.rewardedAd.delegate = self;
  GAMRequest *request = [GAMRequest request];
  [self.rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
    } else {
      NSLog(@"Rewarded ad loaded.");
    }
  }];
}

v8

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADFullScreenContentDelegate {
  /// The rewarded ad.
  var rewardedAd: GADRewardedAd?

  override func viewDidLoad() {
  super.viewDidLoad()
  let request = GAMRequest()
  GADRewardedAd.load(withAdUnitID: "ca-app-pub-8123415297019784/9501821136",
                          request: request, completionHandler: { (ad, error) in
                            if let error = error {
                              print("Rewarded ad failed to load with error: \(error.localizedDescription)")
                              return
                            }
                            self.rewardedAd = ad
                            self.rewardedAd?.fullScreenContentDelegate = self
                          }
  )
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController () 

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  GAMRequest *request = [GAMRequest 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.");
    self.rewardedAd.fullScreenContentDelegate = self;
}

המודעה לרשת המדיה וכינוי התגמול

כדי להשתמש במודעות מתגמלות, צריך לטפל באירוע כשמשתמש צובר פרס. ב- גרסה 7 של ה-API של GADRewardedAd, מטמיעים rewardedAd:userDidEarnReward: כחלק מהפרוטוקול GADRewardedAdDelegate. בגרסה 8, אתם צריכים להטמיע את GADUserDidEarnRewardHandler כדי מציגים את המודעה.

v7

Swift

func showRewardedAd() {
  ...
  if rewardedAd.isReady {
    rewardedAd.present(fromRootViewController: self delegate:self)
  } else {
    print("Ad wasn't ready")
  }
}

/// Tells the delegate that the user earned a reward.
func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarnReward: GADAdReward) {
  // TODO: Reward the user.
}

Objective-C

- (void)showRewardedAd: {
  ...
  if (self.rewardedAd.isReady) {
    [self.rewardedAd presentFromRootViewController:self delegate:self];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

/// Tells the delegate that the user earned a reward.
- (void)rewardedAd:(GADRewardedAd *)rewardedAd userDidEarnReward:(GADAdReward *)reward {
  // TODO: Reward the user.
}

v8

Swift

func showRewardedAd() {
  ...
  if let ad = rewardedAd {
      ad.present(fromRootViewController: self,
               userDidEarnRewardHandler: {
                 let reward = ad.adReward
                 // TODO: Reward the user.
               }
      )
  } else {
    print("Ad wasn't ready")
  }
}

Objective-C

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

אירועים של מודעות מצגת

באמצעות ה-API של GADRewardedAd מעבירים GADRewardedAdDelegate ל-method שמציג את המודעה. באמצעות ה-API של GADRewardedAd מגדירים GADFullscreenContentDelegate כנכס במודעה לפני הצגת המודעה.

v7

Swift

func showRewardedAd() {
  ...
  if rewardedAd.isReady {
    rewardedAd.present(fromRootViewController: self delegate:self)
  } else {
    print("Ad wasn't ready")
  }
}

/// Tells the delegate that the rewarded ad was presented.
func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd) {
  print("Rewarded ad presented.")
}
/// Tells the delegate that the rewarded ad was dismissed.
func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {
  print("Rewarded ad dismissed.")
}
/// Tells the delegate that the rewarded ad failed to present.
func rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error) {
  print("Rewarded ad failed to present with error: \(error.localizedDescription).")
}

Objective-C

- (void)showRewardedAd: {
  ...
  if (self.rewardedAd.isReady) {
    [self.rewardedAd presentFromRootViewController:self delegate:self];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

/// Tells the delegate that the rewarded ad was presented.
- (void)rewardedAdDidPresent:(GADRewardedAd *)rewardedAd {
  NSLog(@"Rewarded ad presented.");
}

/// Tells the delegate that the rewarded ad failed to present.
- (void)rewardedAd:(GADRewardedAd *)rewardedAd didFailToPresentWithError:(NSError *)error {
  NSLog(@"Rewarded ad failed to present with error: %@",
        [error localizedDescription]);
}

/// Tells the delegate that the rewarded ad was dismissed.
- (void)rewardedAdDidDismiss:(GADRewardedAd *)rewardedAd {
  NSLog(@"Rewarded ad dismissed.");
}

v8

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  let request = GAMRequest()
  GADRewardedAd.load(withAdUnitID: "ca-app-pub-8123415297019784/9501821136",
                          request: request, completionHandler: { (ad, error) in
                            if let error = error {
                              print(error.localizedDescription)
                              return
                            }
                            self.rewardedAd = ad
                            self.rewardedAd?.fullScreenContentDelegate = self
                          }
  )
}

/// Tells the delegate that the rewarded ad was presented.
func adDidPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
  print("Rewarded ad presented.")
}
/// Tells the delegate that the rewarded ad was dismissed.
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
  print("Rewarded ad dismissed.")
}
/// Tells the delegate that the rewarded ad failed to present.
func ad(_ ad: GADFullScreenPresentingAd,
    didFailToPresentFullScreenContentWithError error: Error) {
  print("Rewarded ad failed to present with error: \(error.localizedDescription).")
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];

  GAMRequest *request = [GAMRequest 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.");
    self.rewardedAd.fullScreenContentDelegate = self;
}

/// Tells the delegate that the rewarded ad was presented.
- (void)adDidPresentFullScreenContent:(id)ad {
  NSLog(@"Rewarded ad presented.");
}

/// Tells the delegate that the rewarded ad failed to present.
- (void)ad:(id)ad
    didFailToPresentFullScreenContentWithError:(NSError *)error {
  NSLog(@"Rewarded ad failed to present with error: %@",
       [error localizedDescription]);
}

/// Tells the delegate that the rewarded ad was dismissed.
- (void)adDidDismissFullScreenContent:(id)ad {
  NSLog(@"Rewarded ad dismissed.");
}

הסרה של GADRewardedbasedVideoAd API מהגרסה הקודמת

הגרסה החדשה יותר GADRewardedAd ממשק API הושק לראשונה במרץ 2019, והוא הפך למתגמל המועדף API למשך יותר מ-18 חודשים. יש בה יותר שיפורים בהשוואה לדור הקודם API של GADRewardedBasedVideoAd, כולל היכולת לטעון יותר מממשק אחד מודעה מתגמלת אחת בכל פעם.

ה-API הקודם של GADRewardedBasedVideoAd הוסר בגרסת ה-SDK בגרסה 8.0.0.

הוצאה משימוש של מודעות באנר חכמות לטובת מודעות באנר מותאמות

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

Swift

class ViewController: UIViewController {

  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // Note: The safe area is not known until viewWillAppear.
    let adSize = getFullWidthAdaptiveAdSize()
  }

  func getFullWidthAdaptiveAdSize() -> GADAdSize {
    // Here safe area is taken into account, hence the view frame is used after the
    // view has been laid out.
    let frame = { () -> CGRect in
      if #available(iOS 11.0, *) {
        return view.frame.inset(by: view.safeAreaInsets)
      } else {
        return view.frame
      }
    }()
    return GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(frame.size.width)
  }
}

Objective-C

@implementation ViewController

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  // Note: The safe area is not known until viewWillAppear.
  GADAdSize adSize = [self getFullWidthAdaptiveAdSize];
}

- (GADAdSize)getFullWidthAdaptiveAdSize {
  CGRect frame = self.view.frame;
  // Here safe area is taken into account, hence the view frame is used after
  // the view has been laid out.
  if (@available(iOS 11.0, *)) {
    frame = UIEdgeInsetsInsetRect(self.view.frame, self.view.safeAreaInsets);
  }
  return GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(frame.size.width);
}

@end

יציאה מהסרת הקריאה החוזרת של האפליקציה

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

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

שינויי שמות של כיתה

בטבלה הבאה מפורטים שמות של כיתות ספציפיים שהשתנו או הוסרו 8. לסיכום:

  • השם של כל הכיתות שקשורות אל GADUnifiedNativeAd השתנה ל- GADNativeAd.
  • נוספו ל-GADRewardBasedVideoAd, ל-GADNativeExpressAdView ול-GADInstreamAd הוסר.
  • כל הכיתות עם הקידומת DFP הוחלפו בקידומת GAM.
גרסה 7.68.0 גרסה v8.0.0
DFPBannerView GAMBannerView
DFPBannerViewOptions GAMBannerViewOptions
DFPInterstitial GAMInterstitialAd
DFPRequest GAMRequest
GADRequestError NSError
GADUnifiedNativeAdView GADNativeAdView
GADUnifiedNativeAd GADNativeAd
GADUnifiedNativeAdAssetIdentifiers GADNativeAdAssetIdentifiers
GADUnifiedNativeAdDelegate GADNativeAdDelegate
GADUnifiedNativeAdUnconfirmedClickDelegate GADNativeAdUnconfirmedClickDelegate
GADNativeCustomTemplateAd GADCustomNativeAd
GADNativeCustomTemplateAdLoaderDelegate GADCustomNativeAdLoaderDelegate
GADNativeAdDelegate GADCustomNativeAdDelegate
GADInAppPurchase הוסר
GADInterstitial GADInterstitialAd
GADNativeExpressAdView הוסר
GADRewardBasedVideoAd הוסר
GADInstreamAd הוסר
GADInstreamAdView הוסר

שיטות שהוסרו/הוחלפו

הטבלה הבאה מפרטת את השינויים הספציפיים בגרסה 8. לסיכום:

  • שיטות ומאפיינים שכבר הוצאו משימוש הוסרו.
  • -willLeaveApplication: שיטות להענקת גישה הוסרו לכל הפורמטים.
  • שם הסיווג של רשת המודעות הועבר לנכס GADResponseInfo.
  • מזהה מכשיר הבדיקה הועבר אל GADRequestConfiguration לנכס.
גרסה 7.68.0 ממשק API של גרסה 7.68.0 ממשק API של גרסה 8.0.0 הערות
GADMobileAds +configureWithApplicationID: -startWithCompletionHandler: מזהה האפליקציה מוגדר עכשיו ב-Info.plist.
+disableAutomatedInAppPurchaseReporting -disableAutomatedInAppPurchaseReporting
+disableSDKCrashReporting -disableSDKCrashReporting
GADRequest testDevices GADRequestConfiguration.testdeviceidentifiers המאפיין testDeviceIdentifiers חל על כל הבקשות להצגת מודעות, ואילו המאפיין המאפיין הישן מסוג testdevice הוגדר לפי בקשה.
gender הוסר
יום הולדת הוסר
+sdkVersion GADMobileAds.sharedInstance.sdkVersion
-setBirthdayWithMonth:day:year: הוסר
-setLocationWithDescription: -setLocationWithLatitude:longitude:accuracy:
-tagForChildDirectedTreatment: [GADMobileAds.sharedInstance.requestConfiguration tagForChildDirectedTreatment]
GADErrorCode kGADError* GADError* הקידומת k מושמטת מכל הקבועים של קודי שגיאה.
GADBannerView hasAutoRefreshed autoloadEnabled
inAppPurchaseDelegate הוסר
mediatedAdView הוסר
adNetworkClassName responseInfo.adNetworkClassName
DFPBannerView -setValidAdSizesWithSizes: -setValidAdSizes:
DFPBannerViewOptions -adSizeDelegate הוסר
GADBannerViewDelegate -adViewDidReceiveAd: -bannerViewDidReceiveAd:
-adView:didFailToReceiveAdWithError: -bannerView:didFailToReceiveAdWithError:
-adViewWillPresentScreen: -bannerViewWillPresentScreen:
-adViewWillDismissScreen: -bannerViewWillDismissScreen:
-adViewDidDismissScreen: -bannerViewDidDismissScreen:
-adViewWillLeaveApplication: הוסר
GADNativeCustomTemplateAd templateID GADCustomNativeAd.formatID
-performClickOnAssetWithKey:customClickHandler: -performClickOnAssetWithKey:
GADNativeAdImageAdLoaderOptions preferredImageOrientation GADNativeAdMediaAdOptions.mediaAspectRatio
GADInterstitial inAppPurchaseDelegate הוסר
isReady הוסר במקום זאת, יש להשתמש ב-canpresentFromRootViewController:error: .
hasBeenUsed הוסר
-init -initWithAdUnitID:
-setAdUnitID: -initWithAdUnitID:
adNetworkClassName responseInfo.adNetworkClassName
-interstitialWillLeaveApplication: הוסר
GADUnifiedNativeAd videoController mediaContent.videoController
adNetworkClassName responseInfo.adNetworkClassName