Реклама с вознаграждением — это реклама, с которой пользователи могут взаимодействовать в обмен на внутриигровые награды . В этом руководстве показано, как интегрировать рекламу с вознаграждением от AdMob в iOS-приложение. Ознакомьтесь с историями успеха клиентов: пример 1 , пример 2 .
Предварительные требования
- Пройдите руководство по началу работы .
Всегда проводите тестирование с помощью тестовых объявлений.
При разработке и тестировании приложений обязательно используйте тестовые объявления, а не рабочие. Несоблюдение этого правила может привести к блокировке вашего аккаунта.
Самый простой способ загрузить тестовые объявления — использовать наш специальный идентификатор тестового рекламного блока для рекламы с вознаграждением в iOS:
ca-app-pub-3940256099942544/1712485313
Он специально настроен на возврат тестовых объявлений для каждого запроса, и вы можете свободно использовать его в своих приложениях во время кодирования, тестирования и отладки. Просто убедитесь, что вы заменили его на свой собственный идентификатор рекламного блока перед публикацией приложения.
Для получения дополнительной информации о том, как работают тестовые объявления в Google Mobile Ads SDK, см. раздел «Тестовые объявления» .
Выполнение
Основные шаги по интеграции рекламы с вознаграждением следующие:
- Загрузить рекламу
- [Необязательно] Проверить обратные вызовы SSV
- Зарегистрируйтесь для участия в обратном звонке.
- Показать рекламу и обработать событие получения вознаграждения.
Загрузить рекламу
Загрузка рекламы осуществляется с помощью метода load(adUnitID:request) класса GADRewardedAd .
Быстрый
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;
}];
[Необязательно] Проверка обратных вызовов серверной проверки (SSV)
Приложениям, требующим дополнительных данных в коллбэках проверки на стороне сервера, следует использовать функцию пользовательских данных в объявлениях с вознаграждением. Любое строковое значение, заданное для объекта объявления с вознаграждением, передается в параметр запроса custom_data коллбэка SSV. Если значение пользовательских данных не задано, значение параметра запроса custom_data не будет присутствовать в коллбэке SSV.
Приведенный ниже пример кода демонстрирует, как установить пользовательские данные для объекта рекламного объявления с вознаграждением перед запросом показа объявления:
Быстрый
Objective-C
Замените SAMPLE_CUSTOM_DATA_STRING на ваши пользовательские данные.
Зарегистрируйтесь для участия в обратном звонке.
Для получения уведомлений о событиях презентации необходимо присвоить свойство GADFullScreenContentDelegate возвращаемого объявления свойству fullScreenContentDelegate :
Быстрый
rewardedAd?.fullScreenContentDelegate = self
SwiftUI
rewardedAd?.fullScreenContentDelegate = self
Objective-C
self.rewardedAd.fullScreenContentDelegate = self;
Протокол GADFullScreenContentDelegate обрабатывает обратные вызовы в случае успешного или неудачного показа рекламы, а также при её закрытии. Следующий код демонстрирует реализацию протокола:
Быстрый
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);
}
Показать рекламу и обработать событие получения вознаграждения.
Перед показом рекламы с вознаграждением пользователям необходимо предоставить им явный выбор: просматривать рекламный контент в обмен на вознаграждение. Показ рекламы с вознаграждением всегда должен быть добровольным.
При показе рекламы необходимо предоставить объект GADUserDidEarnRewardHandler для обработки вознаграждения пользователя.
Приведённый ниже код демонстрирует наилучший способ отображения рекламы с вознаграждением:
Быстрый
rewardedAd.present(from: self) {
let reward = rewardedAd.adReward
print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
// TODO: Reward the user.
}
SwiftUI
Отслеживайте события пользовательского интерфейса в представлении, чтобы определить, когда показывать рекламу.
var body: some View {
VStack(spacing: 20) {
Button("Watch video for additional 10 coins") {
viewModel.showAd()
showWatchVideoButton = false
}
Покажите рекламное объявление с вознаграждением, используя модель представления:
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.
}];
Часто задаваемые вопросы
- Могу ли я получить подробную информацию о вознаграждении за рекламу
GADRewardedAd? - Да, если вам нужна сумма вознаграждения до того, как сработает обратный вызов
userDidEarnReward,GADRewardedAdесть свойствоadReward, которое вы можете проверить, чтобы узнать сумму вознаграждения после загрузки объявления. - Предусмотрен ли тайм-аут для вызова инициализации?
- Через 10 секунд Google Mobile Ads SDK вызывает метод
GADInitializationCompletionHandler, переданный в методstartWithCompletionHandler:даже если инициализация сети посредничества еще не завершена. - Что произойдет, если некоторые сети-посредники окажутся не готовы к моменту получения обратного вызова инициализации?
Мы рекомендуем загружать рекламу внутри
GADInitializationCompletionHandler. Даже если посредническая сеть еще не готова, Google Mobile Ads SDK все равно запросит у нее рекламу. Таким образом, если посредническая сеть завершит инициализацию после истечения таймаута, она сможет обрабатывать будущие запросы на рекламу в этой сессии.Вы можете продолжать опрашивать статус инициализации всех адаптеров на протяжении всей сессии вашего приложения, вызывая метод
GADMobileAds.initializationStatus.- Как мне узнать, почему конкретная сеть медиации не готова?
Свойство
descriptionобъектаGADAdapterStatusописывает причину, по которой адаптер не готов обрабатывать рекламные запросы.- Всегда ли обработчик завершения
userDidEarnRewardHandlerвызывается до метода делегатаadDidDismissFullScreenContent::? Для рекламы Google все вызовы
userDidEarnRewardHandlerпроисходят до вызоваadDidDismissFullScreenContent:Для рекламы, показываемой через медиацию , порядок обратных вызовов определяется реализацией SDK рекламной сети стороннего разработчика. Для SDK рекламных сетей, предоставляющих один метод делегата с информацией о вознаграждении, адаптер медиации вызываетuserDidEarnRewardHandlerдо вызоваadDidDismissFullScreenContent:
Примеры на GitHub
Просмотрите полные примеры рекламных объявлений с вознаграждением на предпочитаемом вами языке:
Следующие шаги
Узнайте больше о конфиденциальности пользователей .