Реклама с вознаграждением — это реклама, с которой пользователи могут взаимодействовать в обмен на вознаграждение внутри приложения . Это руководство покажет вам, как интегрировать рекламу с вознаграждением от AdMob в приложение iOS. Ознакомьтесь с историями успеха клиентов: пример 1 , пример 2 .
Предпосылки
- Заполните руководство по началу работы .
Всегда проверяйте с помощью тестовых объявлений
При создании и тестировании приложений обязательно используйте тестовые объявления, а не реальные, производственные. В противном случае ваш аккаунт может быть заблокирован.
Самый простой способ загрузить тестовую рекламу — использовать наш специальный идентификатор тестового рекламного блока для объявлений с вознаграждением на iOS:
ca-app-pub-3940256099942544/1712485313
Он специально настроен для возврата тестовых объявлений при каждом запросе, и вы можете использовать его в своих приложениях при кодировании, тестировании и отладке. Просто убедитесь, что вы заменили его на свой идентификатор рекламного блока перед публикацией приложения.
Дополнительную информацию о работе тестовых объявлений 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.
В следующем примере кода показано, как задать пользовательские данные для объекта вознагражденной рекламы перед запросом рекламы:
Быстрый
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;
}];
Зарегистрируйтесь для обратных звонков
Чтобы получать уведомления о событиях презентации, необходимо назначить GADFullScreenContentDelegate to the
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:
. Для объявлений, показываемых через mediation , порядок обратных вызовов определяется реализацией SDK сторонних рекламных сетей. Для SDK рекламных сетей, предоставляющих один метод делегата с информацией о вознаграждении, адаптер медиации вызываетuserDidEarnRewardHandler
доadDidDismissFullScreenContent:
.
Примеры на GitHub
Посмотрите полные примеры объявлений с вознаграждением на предпочитаемом вами языке:
Следующие шаги
Узнайте больше о конфиденциальности пользователей .