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 opinie klientów: studium przypadku 1, studium przypadku 2.
Wymagania wstępne
Zanim przejdziesz dalej, skonfiguruj Google Mobile Ads SDK.
Zawsze testuj za pomocą reklam testowych
Podczas tworzenia i testowania aplikacji używaj reklam testowych, a nie reklam produkcyjnych. Jeśli tego nie zrobisz, Twoje konto może zostać zawieszone.
Najłatwiejszym sposobem na wczytanie reklam testowych jest użycie naszego specjalnego identyfikatora jednostki reklamowej na potrzeby reklam z nagrodą na iOS:
ca-app-pub-3940256099942544/1712485313
Został on specjalnie skonfigurowany tak, aby zwracać reklamy testowe w odpowiedzi na każde żądanie. Możesz go używać w swoich aplikacjach podczas kodowania, testowania i debugowania. Pamiętaj tylko, aby przed opublikowaniem aplikacji zastąpić go własnym identyfikatorem jednostki reklamowej.
Więcej informacji o tym, jak działają Google Mobile Ads SDK reklamy testowe, znajdziesz w artykule Test Ads.
Implementacja
Główne kroki integracji reklam z nagrodą:
- Wczytaj reklamę
- [Opcjonalnie] Sprawdź wywołania zwrotne SSV
- Zarejestruj wywołania zwrotne
- Wyświetl reklamę i obsłuż zdarzenie nagrody
Wczytaj reklamę
Reklamę wczytuje się za pomocą load(adUnitID:request)
metody 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] Sprawdź wywołania zwrotne weryfikacji po stronie serwera (SSV)
Aplikacje, które wymagają dodatkowych danych w weryfikacji
po stronie serwera wywołaniach zwrotnych, 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 swoimi danymi niestandardowymi.
i może wymagać dekodowania podczas analizowania wywołania zwrotnego SSV.Zarejestruj wywołania zwrotne
Aby otrzymywać powiadomienia o zdarzeniach wyświetlania, musisz przypisać GADFullScreenContentDelegate do właściwości fullScreenContentDelegate zwróconej 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ę lub nie wyświetla się oraz gdy jest zamykana. Poniższy kod pokazuje, jak zaimplementować 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świetl reklamę i obsłuż zdarzenie nagrody
Zanim zaczniesz wyświetlać użytkownikom reklamę z nagrodą, musisz dać im wyraźną możliwość obejrzenia treści reklamy z nagrodą w zamian za nagrodę. Reklamy z nagrodą muszą zawsze wymagać zgody 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óły nagrody za
GADRewardedAd? - Tak. Jeśli potrzebujesz kwoty nagrody, zanim zostanie wywołane wywołanie zwrotne
userDidEarnRewardjest wywoływane,GADRewardedAdmaadRewardwłaściwość, którą możesz sprawdzić, aby zweryfikować kwotę nagrody po wczytaniu reklamy. - Czy jest jakiś limit czasu na wywołanie inicjujące?
- Po 10 sekundach pakiet 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 wczytanie reklamy w
GADInitializationCompletionHandler. Nawet jeśli sieć zapośredniczenia nie jest gotowa, Google Mobile Ads SDK 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 reklam w tej sesji.Możesz nadal sprawdzać stan inicjowania wszystkich adapterów w sesji aplikacji, wywołując
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ń reklam.- Czy wywołanie zwrotne
userDidEarnRewardHandlerjest zawsze wywoływane przed metodą delegataadDidDismissFullScreenContent:? W przypadku reklam Google wszystkie wywołania
userDidEarnRewardHandlerwystępują przedadDidDismissFullScreenContent:. W przypadku reklam wyświetlanych w ramach zapośredniczenia kolejność wywołań zwrotnych jest określana przez implementację pakietu SDK sieci reklamowej firmy zewnętrznej. W przypadku pakietów SDK sieci reklamowych, które udostępniają jedną metodę delegata z informacjami o nagrodzie, adapter zapośredniczenia wywołujeuserDidEarnRewardHandlerprzedadDidDismissFullScreenContent:.
Przykłady w GitHubie
Wyświetl pełne przykłady reklam z nagrodą w wybranym języku:
Dalsze kroki
Dowiedz się więcej o prywatności użytkowników.