Объявления с вознаграждением – это объявления, с которыми пользователи могут взаимодействовать в обмен на вознаграждения в приложении. В этом руководстве рассказывается, как интегрировать объявления с вознаграждением из Менеджера рекламы в приложение для iOS.
Требования
Прежде чем продолжить, настройте Google Mobile Ads SDK.
Всегда используйте тестовые объявления
При создании и тестировании приложений используйте тестовые объявления, а не реальные. В противном случае ваш аккаунт может быть заблокирован.
Проще всего загрузить тестовые объявления, используя идентификатор тестового рекламного блока для объявлений с вознаграждением в iOS:
/21775744923/example/rewarded
Он специально настроен так, чтобы возвращать тестовые объявления для каждого запроса. Вы можете использовать его в своих приложениях при написании кода, тестировании и отладке. Перед публикацией приложения не забудьте заменить его на идентификатор своего рекламного блока.
Подробнее о том, как работают тестовые объявления Google Mobile Ads SDK, читайте в статье Тестовые объявления.
Реализация
Основные этапы интеграции объявлений с вознаграждением:
- Загрузка объявления
- [Необязательно] Проверка обратных вызовов SSV
- Как зарегистрироваться для получения обратных вызовов
- Показ объявления и обработка события получения вознаграждения
Загрузка объявления
Чтобы загрузить объявление, вызовите метод load(adUnitID:request) в классе GADRewardedAd.
Swift
func loadRewardedAd() async {
do {
rewardedAd = try await RewardedAd.load(
// Replace this ad unit ID with your own ad unit ID.
with: "/21775744923/example/rewarded", request: AdManagerRequest())
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:@"/21775744923/example/rewarded"
request:[GAMRequest 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;
}];
[Необязательно] Проверка обратных вызовов проверки на стороне сервера
Если приложению требуются дополнительные данные в обратных вызовах для проверки на стороне сервера, используйте функцию специальных данных в объявлениях с вознаграждением. Любое строковое значение, заданное в объекте объявления с вознаграждением, передается в параметр запроса custom_data обратного вызова для проверки на стороне сервера. Если значение данных клиентов не задано, то значение параметра запроса custom_data не будет представлено в обратном вызове для проверки на стороне сервера.
В приведенном ниже фрагменте кода показано, как задать специальные данные для объекта объявления с вознаграждением перед отправкой запроса объявления:
Swift
Objective-C
Замените SAMPLE_CUSTOM_DATA_STRING своими данными.
Регистрация обратных вызовов
Чтобы получать уведомления о событиях презентации, необходимо назначить GADFullScreenContentDelegate свойству fullScreenContentDelegate возвращенного объявления:
Swift
rewardedAd?.fullScreenContentDelegate = self
SwiftUI
rewardedAd?.fullScreenContentDelegate = self
Objective-C
self.rewardedAd.fullScreenContentDelegate = self;
Протокол GADFullScreenContentDelegate обрабатывает обратные вызовы, когда объявление показывается успешно или нет, а также когда оно закрывается. В приведенном ниже коде показано, как реализовать протокол.
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);
}
Показать объявление и обработать событие получения вознаграждения
Перед показом объявления с вознаграждением пользователь должен явно согласиться на просмотр содержания объявления с вознаграждением в обмен на вознаграждение. Объявления с вознаграждением должны показываться только с согласия пользователя.
При показе объявления необходимо предоставить объект GADUserDidEarnRewardHandler, который будет обрабатывать вознаграждение для пользователя.
В примере кода ниже показан оптимальный способ показа объявления с вознаграждением.
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
Отслеживайте события пользовательского интерфейса в представлении, чтобы определить, когда показывать объявление.
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
Посмотреть примеры объявлений с вознаграждением на нужном языке можно по ссылкам ниже.
Дальнейшие действия
Подробнее о конфиденциальности пользователей…