Podziel się opinią i pomóż nam opracować harmonogram rozwoju pakietu SDK do reklam mobilnych Google. Wypełnij roczną ankietę dotyczącą pakietu SDK do reklam mobilnych Google na 2023 r., aby została zakończona 5 maja 2023 roku.

Reklamy z nagrodą

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Reklamy z nagrodą to reklamy, z którymi użytkownicy mogą wchodzić w interakcje w zamian za nagrody w aplikacji. Z tego przewodnika dowiesz się, jak zintegrować reklamy z nagrodą z aplikacji AdMobdo aplikacji na iOS. Przeczytaj historie sukcesu klientów: studium przypadku 1, studium przypadku 2.

Wymagania wstępne

Zawsze testuj z reklamami testowymi

Tworząc i testując aplikacje, upewnij się, że używasz reklam testowych zamiast produkcyjnych. Jeśli tego nie zrobisz, Twoje konto może zostać zawieszone.

Najłatwiejszym sposobem wczytywania reklam testowych jest użycie specjalnego identyfikatora jednostki reklamowej na potrzeby reklam z nagrodą.

ca-app-pub-3940256099942544/1712485313

Został on specjalnie skonfigurowany pod kątem zwracania reklam testowych dla każdego żądania. Możesz używać go we własnych aplikacjach podczas kodowania, testowania i debugowania. Pamiętaj, aby przed opublikowaniem aplikacji zastąpić go własnym identyfikatorem jednostki reklamowej.

Więcej informacji o działaniu reklam testowych pakietu SDK do reklam mobilnych znajdziesz w artykule Testowanie reklam.

Wdrażanie

Główne etapy integracji reklam pełnoekranowych z nagrodą:

  • Wczytywanie reklamy
  • [Opcjonalnie] Zweryfikuj wywołania zwrotne SSV
  • Rejestrowanie połączeń zwrotnych
  • wyświetlać reklamę i obsługiwać zdarzenie związane z nagrodą;

Wczytywanie reklamy

Reklama jest ładowana za pomocą statycznej metody loadWithAdUnitID:request:completionHandler: w klasie GADRewardedAd. Aby wczytać metodę, potrzebny jest identyfikator jednostki reklamowej, obiekt GADRequest i moduł obsługi ukończenia, który jest wywoływany, gdy reklama się powiedzie. Wczytany obiekt GADRewardedAd jest podany jako parametr w procedurze zakończenia. Poniższy przykład pokazuje, jak wczytać GADRewardedAd w klasie 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.");
      }];
}

[Opcjonalnie] Weryfikowanie wywołań zwrotnych po stronie serwera (SSV)

Aplikacje, które wymagają dodatkowych danych w wywołaniach weryfikacji po stronie serwera, powinny używać funkcji niestandardowych danych z reklamami z nagrodą. Każda wartość ciągu ustawiona w obiekcie reklamy z nagrodą jest przekazywana do parametru zapytania custom_data wywołania zwrotnego SSV. Jeśli nie ustawisz żadnej niestandardowej wartości danych, wartość parametru zapytania custom_data nie będzie podana w wywołaniu zwrotnym SSV.

Poniższy przykładowy kod pokazuje, jak skonfigurować dane niestandardowe w obiekcie reklamy z nagrodą, zanim prześlesz żądanie reklamy.

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;
    }];

Rejestrowanie połączeń zwrotnych

Aby otrzymywać powiadomienia o zdarzeniach związanych z prezentacją, musisz wdrożyć protokół GADFullScreenContentDelegate i przypisać go do właściwości fullScreenContentDelegate zwróconej reklamy. Protokół GADFullScreenContentDelegate obsługuje wywołania zwrotne w przypadku udanego lub nieudanego wyświetlenia reklamy oraz jej odrzucenia. Ten kod pokazuje, jak wdrożyć protokół i przypisać go do reklamy:

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 to obiekt jednorazowy. Oznacza to, że po wyświetleniu reklamy z nagrodą nie można jej ponownie wyświetlić. Sprawdzoną metodą jest wczytanie innej reklamy z nagrodą w metodzie adDidDismissFullScreenContent: w aplikacji GADFullScreenContentDelegate, aby następna reklama zaczęła się wyświetlać zaraz po odrzuceniu poprzedniej.

wyświetlać reklamę i obsługiwać zdarzenie związane z nagrodą;

Przed wyświetleniem użytkownikom reklamy z nagrodą musisz umożliwić mu wyraźne wyświetlenie treści reklamy z nagrodą w zamian za nagrodę. Reklamy z nagrodą zawsze muszą być zaakceptowane.

Gdy prezentujesz reklamę, musisz przekazać obiekt GADUserDidEarnRewardHandler, by obsłużyć nagrodę dla użytkownika.

Ten kod przedstawia najlepszą metodę wyświetlania reklamy z nagrodą.

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");
  }
}

Najczęstsze pytania

Czy mogę uzyskać szczegółowe informacje o nagrodzie na GADRewardedAd?
Tak, jeśli potrzebujesz kwoty nagrody przed uruchomieniem wywołania zwrotnego userDidEarnReward, GADRewardedAd ma właściwość adReward, którą możesz sprawdzić po wczytaniu reklamy.
Czy istnieje czas oczekiwania na wywołanie inicjowania?
Po 10 sekundach pakiet SDK do reklam mobilnych Google wywołuje metodę GADInitializationCompletionHandler podaną w metodzie startWithCompletionHandler:, nawet gdy sieć zapośredniczeń nie zakończy inicjowania.
Co w sytuacji, gdy niektóre sieci zapośredniczenia nie są gotowe do pobrania, gdy otrzymam wywołanie inicjujące?

Zalecamy wczytanie reklamy w obrębie znaczników GADInitializationCompletionHandler. Nawet jeśli sieć zapośredniczeń nie jest gotowa, pakiet SDK do reklam mobilnych Google nadal będzie wysyłać do niej żądanie reklamy. Jeśli więc sieć zapośredniczenia kończy proces po upływie limitu czasu, może nadal obsługiwać kolejne żądania reklamy w ramach tej sesji.

Możesz kontynuować ankietowanie stanu zainicjowania wszystkich adapterów podczas sesji aplikacji, wywołując GADMobileAds.initializationStatus.

Jak mogę sprawdzić, dlaczego dana sieć zapośredniczenia nie jest gotowa?

Właściwość description obiektu GADAdapterStatus opisuje, dlaczego adapter nie jest gotowy do obsługi żądań reklamy.

Czy moduł obsługi ukończenia userDidEarnRewardHandler jest zawsze wywoływany przed metodą przekazywania adDidDismissFullScreenContent:?

W przypadku reklam Google wszystkie wywołania userDidEarnRewardHandler występują przed adDidDismissFullScreenContent:. W przypadku reklam wyświetlanych przy użyciu zapośredniczenia pakiet SDK zewnętrznej sieci reklamowej określa kolejność wywołań zwrotnych. W przypadku pakietów SDK sieci reklamowych, które dostarczają jedną metodę przekazywania dostępu z informacjami o nagrodach, adapter zapośredniczenia wywołuje metodę userDidEarnRewardHandler przed adDidDismissFullScreenContent:.

Przykłady w GitHubie