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 AdMob z aplikacją na iOS. Przeczytaj historie sukcesu klientów: studium przypadku 1, studium przypadku 2.
Wymagania wstępne
- Zapoznaj się z przewodnikiem dla początkujących.
Zawsze testuj za pomocą reklam testowych
Podczas tworzenia i testowania aplikacji używaj reklam testowych zamiast reklam 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 testowej w przypadku reklam z nagrodą na iOS:
ca-app-pub-3940256099942544/1712485313
Został on specjalnie skonfigurowany tak, aby zwracać reklamy testowe w przypadku każdego żądania. Możesz go używać w swoich aplikacjach podczas kodowania, testowania i debugowania. Pamiętaj tylko, aby przed opublikowaniem aplikacji zastąpić go identyfikatorem swojej jednostki reklamowej.
Więcej informacji o działaniu reklam testowych w pakiecie SDK do reklam mobilnych znajdziesz w artykule Reklamy testowe.
Implementacja
Główne etapy integracji reklam z nagrodą są następujące:
- Wczytywanie reklamy
- [Opcjonalnie] Weryfikowanie wywołań zwrotnych SSV
- Rejestrowanie wywołań zwrotnych
- Wyświetlanie reklamy i obsługa zdarzenia związanego z nagrodą
Wczytywanie reklamy
Reklamę można wczytać za pomocą metody load(adUnitID:request)
w klasie GADRewardedAd
.
Swift
func loadRewardedAd() async {
do {
rewardedAd = try await RewardedAd.load(
// Replace this ad unit ID with your own ad unit ID.
with: "ca-app-pub-3940256099942544/1712485313", request: Request())
rewardedAd?.fullScreenContentDelegate = self
} catch {
print("Rewarded ad failed to load with error: \(error.localizedDescription)")
}
}
SwiftUI
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)")
}
}
Objective-C
// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
request:[GADRequest 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;
}];
[Opcjonalnie] Weryfikowanie wywołań zwrotnych weryfikacji po stronie serwera
Aplikacje, które wymagają dodatkowych danych w wywołaniach zwrotnych weryfikacji po stronie serwera, powinny korzystać z funkcji danych niestandardowych w reklamach z nagrodą. Każda wartość ciągu znaków ustawiona w obiekcie reklamy z nagrodą jest przekazywana do parametru zapytania custom_data
wywołania zwrotnego SSV. Jeśli nie ustawiono wartości danych niestandardowych, wartość parametru zapytania custom_data
nie będzie obecna w wywołaniu zwrotnym SSV.
Poniższy przykładowy kod pokazuje, jak ustawić dane niestandardowe w obiekcie reklamy z nagrodą przed wysłaniem żądania reklamy:
Swift
do {
rewardedAd = try await RewardedAd.load(
// Replace this ad unit ID with your own ad unit ID.
with: "ca-app-pub-3940256099942544/1712485313", request: Request())
let options = ServerSideVerificationOptions()
options.customRewardText = "SAMPLE_CUSTOM_DATA_STRING"
rewardedAd?.serverSideVerificationOptions = options
} catch {
print("Rewarded ad failed to load with error: \(error.localizedDescription)")
}
Objective-C
// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
request:[GADRequest request]
completionHandler:^(GADRewardedAd *ad, NSError *error) {
if (error) {
NSLog(@"Rewarded ad failed to load with error: %@", error.localizedDescription);
return;
}
self.rewardedAd = ad;
GADServerSideVerificationOptions *options =
[[GADServerSideVerificationOptions alloc] init];
options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
ad.serverSideVerificationOptions = options;
}];
Rejestrowanie wywołań zwrotnych
Aby otrzymywać powiadomienia o wydarzeniach związanych z prezentacją, musisz przypisać właściwość GADFullScreenContentDelegate to the
fullScreenContentDelegateGADFullScreenContentDelegate to the
zwróconej reklamy:
Swift
rewardedAd?.fullScreenContentDelegate = self
SwiftUI
rewardedAd?.fullScreenContentDelegate = self
Objective-C
self.rewardedAd.fullScreenContentDelegate = self;
Protokół GADFullScreenContentDelegate
obsługuje wywołania zwrotne w przypadku, gdy reklama zostanie wyświetlona lub nie, a także gdy zostanie zamknięta. Poniższy kod pokazuje, jak wdrożyć protokół:
Swift
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).")
}
SwiftUI
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
}
Objective-C
- (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);
}
Wyświetlanie reklamy i obsługa zdarzenia związanego z nagrodą
Zanim zaczniesz wyświetlać użytkownikom reklamę z nagrodą, musisz dać im możliwość wyrażenia zgody na obejrzenie treści reklamy z nagrodą w zamian za nagrodę. Reklamy z nagrodą zawsze muszą być wyświetlane po wyrażeniu zgody przez użytkownika.
Podczas wyświetlania reklamy musisz podać obiekt GADUserDidEarnRewardHandler
, który będzie obsługiwać nagrodę dla użytkownika.
Poniższy kod przedstawia najlepszą metodę wyświetlania reklamy z nagrodą:
Swift
rewardedAd.present(from: self) {
let reward = rewardedAd.adReward
print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
// TODO: Reward the user.
}
SwiftUI
Odbieraj zdarzenia interfejsu 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ą z modelu widoku:
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)
}
}
Objective-C
[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.
}];
Najczęstsze pytania
- Czy mogę uzyskać szczegółowe informacje o nagrodzie za
GADRewardedAd
? - Tak. Jeśli potrzebujesz kwoty nagrody przed wywołaniem
userDidEarnReward
funkcji zwrotnejGADRewardedAd
, w obiekcieadReward
znajduje się właściwość, którą możesz sprawdzić, aby zweryfikować kwotę nagrody po wczytaniu reklamy. - Czy połączenie inicjujące ma limit czasu?
- Po 10 sekundach pakiet SDK do reklam mobilnych Google wywołuje funkcję
GADInitializationCompletionHandler
podaną w metodziestartWithCompletionHandler:
, nawet jeśli sieć zapośredniczenia nie zakończyła jeszcze inicjowania. - Co się stanie, jeśli niektóre sieci mediacji nie będą gotowe, gdy otrzymam wywołanie zwrotne inicjowania?
Zalecamy wczytywanie reklamy w tagu
GADInitializationCompletionHandler
. Nawet jeśli sieć zapośredniczenia nie jest gotowa, pakiet SDK do reklam mobilnych Google nadal wysyła do niej żądanie reklamy. Jeśli więc sieć zapośredniczenia zakończy inicjowanie po upływie limitu czasu, nadal może obsługiwać przyszłe żądania reklamy w tej sesji.Podczas sesji w aplikacji możesz nadal sprawdzać stan inicjowania wszystkich adapterów, wywołując funkcję
GADMobileAds.initializationStatus
.- Jak sprawdzić, dlaczego konkretna sieć zapośredniczenia nie jest gotowa?
Właściwość
description
obiektuGADAdapterStatus
opisuje, dlaczego adapter nie jest gotowy do obsługi żądań reklamy.- Czy procedura obsługi zakończenia
userDidEarnRewardHandler
jest zawsze wywoływana przed metodą delegataadDidDismissFullScreenContent:
? W przypadku reklam Google wszystkie wywołania
userDidEarnRewardHandler
występują przedadDidDismissFullScreenContent:
. W przypadku reklam wyświetlanych w ramach zapośredniczenia kolejność wywołań zwrotnych zależy od implementacji pakietu SDK zewnętrznej sieci reklamowej. W przypadku pakietów SDK sieci reklamowych, które udostępniają jedną metodę delegowania z informacjami o nagrodzie, adapter zapośredniczeń wywołuje funkcjęuserDidEarnRewardHandler
przedadDidDismissFullScreenContent:
.
Przykłady w GitHubie
Zobacz pełne przykłady reklam z nagrodą w wybranym języku:
Dalsze kroki
Dowiedz się więcej o prywatności użytkowników.