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
Zanim przejdziesz dalej, skonfiguruj Google Mobile Ads SDK.
Zawsze przeprowadzaj testy z użyciem reklam testowych
Podczas tworzenia i testowania aplikacji używaj reklam testowych, a nie aktywnych reklam produkcyjnych. Jeśli tego nie zrobisz, Twoje konto może zostać zawieszone.
Najłatwiejszym sposobem wczytywania reklam testowych jest użycie naszego specjalnego identyfikatora testowej jednostki reklamowej na potrzeby reklam z nagrodą na iOS:
ca-app-pub-3940256099942544/1712485313
Została ona specjalnie skonfigurowana tak, aby zwracać reklamy testowe w przypadku każdego żądania. Możesz jej swobodnie używać we własnych aplikacjach podczas kodowania, testowania i debugowania. Pamiętaj, aby przed opublikowaniem aplikacji zastąpić go identyfikatorem własnej jednostki reklamowej.
Więcej informacji o tym, jak działają reklamy testowe Google Mobile Ads SDK, znajdziesz w artykule Reklamy testowe.
Implementacja
Główne etapy integracji reklam z nagrodą:
- Wczytywanie reklamy
- [Opcjonalnie] Sprawdzanie poprawności wywołań zwrotnych SSV
- Rejestrowanie wywołań zwrotnych
- Wyświetlanie reklamy i obsługa zdarzenia po otrzymaniu nagrody
Wczytywanie reklamy
Reklamę wczytuje się 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] Sprawdzanie wywołań zwrotnych weryfikacji po stronie serwera (SSV)
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
Objective-C
Zastąp SAMPLE_CUSTOM_DATA_STRING danymi niestandardowymi.
Rejestrowanie wywołań zwrotnych
Aby otrzymywać powiadomienia o zdarzeniach związanych z prezentacją, musisz przypisać obiekt GADFullScreenContentDelegate do właściwości fullScreenContentDelegate zwracanej reklamy:
Swift
rewardedAd?.fullScreenContentDelegate = self
SwiftUI
rewardedAd?.fullScreenContentDelegate = self
Objective-C
self.rewardedAd.fullScreenContentDelegate = self;
Protokół GADFullScreenContentDelegate obsługuje wywołania zwrotne, gdy reklama wyświetla się prawidłowo lub nieprawidłowo oraz gdy zostaje 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 po otrzymaniu nagrody
Zanim zaczniesz wyświetlać użytkownikom reklamę z nagrodą, musisz im dać możliwość wyraźnego wyboru, czy chcą obejrzeć treść reklamy z nagrodą w zamian za nagrodę. Reklamy z nagrodą muszą zawsze być wyświetlane za zgodą użytkownika.
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
rewardedAd.present(from: self) {
let reward = rewardedAd.adReward
print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
// TODO: Reward the user.
}
SwiftUI
Nasłuchuj zdarzeń 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 informacji o wysokości nagrody, zanim zostanie wywołane wywołanie zwrotne
userDidEarnReward,GADRewardedAdma właściwośćadReward, którą możesz sprawdzić, aby zweryfikować wysokość nagrody po wczytaniu reklamy. - Czy wywołanie inicjujące ma limit czasu?
- Po 10 sekundach Google Mobile Ads SDK wywołuje
GADInitializationCompletionHandlerpodany w metodziestartWithCompletionHandler:, nawet jeśli sieć zapośredniczenia nie zakończyła jeszcze inicjowania. - Co się stanie, jeśli niektóre sieci zapośredniczenia nie będą gotowe, gdy otrzymam wywołanie zwrotne inicjowania?
Zalecamy wczytywanie reklamy w metodzie
GADInitializationCompletionHandler. Nawet jeśli sieć zapośredniczenia nie jest gotowa, Google Mobile Ads SDK i tak prosi ją o reklamę. 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.Możesz nadal sprawdzać stan inicjowania wszystkich adapterów podczas sesji aplikacji, wywołując metodę
GADMobileAds.initializationStatus.- Jak sprawdzić, dlaczego dana sieć zapośredniczenia nie jest gotowa?
Właściwość
descriptionobiektuGADAdapterStatusopisuje, dlaczego adapter nie jest gotowy do obsługi żądań reklamy.- Czy moduł obsługi zakończenia
userDidEarnRewardHandlerjest zawsze wywoływany przed metodą delegowanąadDidDismissFullScreenContent:? W przypadku reklam Google wszystkie wywołania
userDidEarnRewardHandlerwystępują przedadDidDismissFullScreenContent:. W przypadku reklam wyświetlanych w ramach zapośredniczenia kolejność wywołań zwrotnych określa implementacja pakietu SDK zewnętrznej sieci reklamowej. W przypadku pakietów SDK sieci reklamowych, które udostępniają pojedynczą metodę delegowania z informacjami o nagrodzie, adapter zapośredniczenia wywołuje metodęuserDidEarnRewardHandlerprzed metodąadDidDismissFullScreenContent:.
Przykłady na 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.