Reklamy z nagrodą

Reklamy z nagrodą to reklamy, z którymi użytkownicy mogą wchodzić w interakcję w zamian do nagród w aplikacji. Ten przewodnik pokazuje, jak zintegrować reklamy z nagrodą w AdMob w aplikację na iOS. Zapoznaj się z historiami sukcesu klientów: studium przypadku 1. studium przypadku 2.

Wymagania wstępne

Zawsze korzystaj z reklam testowych

Podczas tworzenia i testowania aplikacji używaj reklam testowych, a nie reklam produkcyjnych. Jeśli tego nie zrobisz, możemy zawiesić Twoje konto.

Najłatwiej wczytywać reklamy testowe, używając identyfikatora testowej jednostki reklamowej na potrzeby reklam z nagrodą na iOS:

ca-app-pub-3940256099942544/1712485313

Został on specjalnie skonfigurowany tak, aby wyświetlać reklamy testowe w odpowiedzi na każde żądanie. do wykorzystania we własnych aplikacjach przy kodowaniu, testowaniu i debugowaniu. Pamiętaj tylko, aby przed opublikowaniem aplikacji zastąpić go własnym identyfikatorem jednostki reklamowej.

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

Implementacja

Oto główne etapy integracji reklam z nagrodą:

  • Wczytywanie reklamy
  • [Opcjonalnie] Zweryfikuj wywołania zwrotne SSV
  • Zarejestruj się na wywołania zwrotne
  • Wyświetl reklamę i obsługuje zdarzenie nagrody

Wczytywanie reklamy

Reklamę można wczytać za pomocą funkcji load(adUnitID:request) w klasie GADRewardedAd.

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest())
    } catch {
      print("Rewarded ad failed to load with error: \(error.localizedDescription)")
    }
  }
}

SwiftUI

import GoogleMobileAds

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

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

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] Weryfikacja wywołań zwrotnych weryfikacji po stronie serwera (SSV)

Aplikacje, które wymagają dodatkowych danych po stronie serwera weryfikacji powinny używać funkcji funkcji danych niestandardowych w przypadku reklam z nagrodą. Dowolny ciąg znaków ustawiony w reklamie z nagrodą jest przekazywany do parametru zapytania custom_data w wywołaniu zwrotnym SSV. Jeśli nie niestandardowych wartości danych, wartość parametru zapytania custom_data nie będzie w wywołaniu zwrotnym SSV.

Przeanalizuj przykładowy kod poniżej pokazuje, jak skonfigurować dane niestandardowe w reklamie z nagrodą przed wysłaniem żądania reklamy.

Swift

do {
  rewardedAd = try await GADRewardedAd.load(
    withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest())
  let options = GADServerSideVerificationOptions()
  options.customRewardString = "SAMPLE_CUSTOM_DATA_STRING"
  rewardedAd.serverSideVerificationOptions = options
} catch {
  print("Rewarded ad failed to load with error: \(error.localizedDescription)")
}

Objective-C

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

Zarejestruj się na wywołania zwrotne

Aby otrzymywać powiadomienia o zdarzeniach związanych z prezentacją, musisz zaimplementować protokół GADFullScreenContentDelegate i przypisać go do właściwości fullScreenContentDelegate zwracanej reklamy. Protokół GADFullScreenContentDelegate obsługuje wywołania zwrotne, gdy reklama jest wyświetlany prawidłowo lub nieskutecznie oraz kiedy jest zamykany. Poniżej pokazuje, jak wdrożyć protokół i przypisać go do reklamy:

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADFullScreenContentDelegate {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest())
      rewardedAd?.fullScreenContentDelegate = self
    } catch {
      print("Rewarded ad failed to load with error: \(error.localizedDescription)")
    }
  }

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

SwiftUI

Przypisz właściwość fullScreenContentDelegate do zwróconej reklamy:

rewardedAd?.fullScreenContentDelegate = self

Zaimplementuj protokół:

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

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

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

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

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

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

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 jednorazowego użytku. Oznacza to, że gdy reklama z nagrodą zostanie nie można pokazać ponownie. Sprawdzoną metodą jest wczytanie kolejnej reklamy z nagrodą w metodzie adDidDismissFullScreenContent: w GADFullScreenContentDelegate aby następna reklama z nagrodą zaczęła się wczytywać, gdy tylko poprzednia odrzucono.

Wyświetl reklamę i obsługuje zdarzenie nagrody

Zanim zaczniesz wyświetlać użytkownikom reklamę z nagrodą, musisz umożliwić im wyraźny wybór treści reklamy z nagrodą w zamian za nagrodę. Reklama z nagrodą reklamy muszą być zawsze opcjonalne.

Podczas wyświetlania reklamy musisz podać obiekt GADUserDidEarnRewardHandler, aby obsłużyć nagrodę dla użytkownika.

Poniższy kod przedstawia najlepszą metodę wyświetlania reklamy z nagrodą.

Swift

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

  // The UIViewController parameter is an optional.
  ad.present(fromRootViewController: nil) {
    let reward = ad.adReward
    print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
    // TODO: Reward the user.
  }
}

SwiftUI

Odbieraj zdarzenia interfejsu użytkownika w widoku, aby określić, kiedy wyświetlić reklamę.

var body: some View {
  VStack(spacing: 20) {
      Button("Watch video for additional 10 coins") {
        viewModel.showAd()
        showWatchVideoButton = false
      }

Wyświetl reklamę z nagrodą w ramach modelu wyświetlania:

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

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

Objective-C

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

Najczęstsze pytania

Czy mogę poznać szczegóły nagrody w postaci aplikacji GADRewardedAd?
Tak, jeśli potrzebujesz nagrody o wartości przed wywołaniem zwrotnym (userDidEarnReward) jest uruchamiany, GADRewardedAd ma adReward którą możesz sprawdzić, aby zweryfikować kwotę nagrody po wczytaniu reklamy.
Czy istnieje limit czasu oczekiwania na wywołanie inicjujące?
Po 10 sekundach pakiet SDK do reklam mobilnych Google wywołuje funkcję GADInitializationCompletionHandler podana w parametry startWithCompletionHandler:, nawet jeśli sieć zapośredniczenia nie ukończyła jeszcze inicjalizacji.
Co zrobić, jeśli niektóre sieci zapośredniczenia nie są gotowe, gdy otrzymam wywołanie zwrotne inicjujące?

Zalecamy wczytanie reklamy w ramach GADInitializationCompletionHandler. Nawet jeśli sieć zapośredniczeń nie jest gotowa, pakiet SDK do reklam mobilnych Google nadal wysyła do tej sieci żądanie reklamy. Jeśli więc sieć zapośredniczenia zakończy inicjowanie po upływie czasu oczekiwania, może nadal działać. żądań reklamy w tej sesji.

Możesz nadal przeprowadzać sondowanie stanu inicjowania wszystkich adapterów przez cały czas w sesji aplikacji po wywołaniu usługi GADMobileAds.initializationStatus.

Jak sprawdzić, dlaczego dana sieć pośrednicząca nie jest gotowa?

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

Czy metodę obsługi zakończenia userDidEarnRewardHandler wywołuje się zawsze przed metodą podrzędną adDidDismissFullScreenContent:?

W przypadku Google Ads wszystkie userDidEarnRewardHandler połączenia są wykonywane przed adDidDismissFullScreenContent:. W przypadku reklam wyświetlanych przez zapośredniczenie, zewnętrzna sieć reklamowa, Kolejność wywołań zwrotnych zależy od implementacji pakietu SDK. W przypadku pakietów SDK sieci reklamowych, udostępnia jedną metodę przekazywania informacji z informacjami o nagrodzie, adapter zapośredniczenia wywołuje funkcję userDidEarnRewardHandler przed adDidDismissFullScreenContent:.

Przykłady w GitHub

Zobacz przykłady pełnych reklam z nagrodą w wybranym języku:

Dalsze kroki

Dowiedz się więcej o prywatności użytkowników.