Interstitial ads are full-screen ads that cover the interface of an app until
closed by the user. They’re typically displayed at natural transition points in
the flow of an app, such as between activities or during the pause between
levels in a game. When an app shows an interstitial ad, the user has the choice
to either tap on the ad and continue to its destination or close it and return
to the app.
This guide shows you how to integrate interstitial ads into an iOS app.
Prerequisites
- Google Mobile Ads SDK 8.0.0 or higher.
- Complete the Get started guide.
Always test with test ads
When building and testing your apps, make sure you use test ads rather than
live, production ads. Failure to do so can lead to suspension of your account.
The easiest way to load test ads is to use our dedicated test ad unit ID
for iOS interstitials:
/6499/example/interstitial
It’s been specially configured to return test ads for every request, and you’re
free to use it in your own apps while coding, testing, and debugging. Just make
sure you replace it with your own ad unit ID before publishing your app.
For more information about how the Mobile Ads SDK’s test ads work, see
Test Ads.
Implementation
The main steps to integrate interstitial ads are:
- Load an ad.
- Register for callbacks.
- Display the ad and handle the reward event.
Load an ad
Loading an ad is accomplished using the static
loadWithAdUnitID:request:completionHandler:
method on the
GAMInterstitialAd
class. The load method requires
your ad unit ID, a GAMRequest
object, and a
completion handler which gets called when ad loading succeeds or fails. The
loaded GAMInterstitialAd
object is provided as a
parameter in the completion handler. The below example shows how to load a
GAMInterstitialAd
in your ViewController
class.
Swift
import GoogleMobileAds import UIKit class ViewController: UIViewController { private var interstitial: GAMInterstitialAd? override func viewDidLoad() { super.viewDidLoad() let request = GAMRequest() GAMInterstitialAd.load(withAdUnitID:"/6499/example/interstitial", request: request, completionHandler: { [self] ad, error in if let error = error { print("Failed to load interstitial ad with error: (error.localizedDescription)") return } interstitial = ad } ) } }
Objective-C
@import GoogleMobileAds; @import UIKit; @interface ViewController () @property(nonatomic, strong) GAMInterstitialAd *interstitial; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; GAMRequest *request = [GAMRequest request]; [GAMInterstitialAd loadWithAdUnitID:@"/6499/example/interstitial" request:request completionHandler:^(GAMInterstitialAd *ad, NSError *error) { if (error) { NSLog(@"Failed to load interstitial ad with error: %@", [error localizedDescription]); return; } self.interstitial = ad; }]; }
Register for callbacks
In order to receive notifications for presentation events, you must implement
the GADFullScreenContentDelegate
protocol and assign it to the
fullScreenContentDelegate
property of the returned ad. The
GADFullScreenContentDelegate
protocol handles callbacks for when the ad
presents successfully or unsuccessfully, and when it is dismissed. The following
code shows how to implement the protocol and assign it to the ad:
Swift
class ViewController: UIViewController, GADFullScreenContentDelegate { private var interstitial: GAMInterstitialAd? override func viewDidLoad() { super.viewDidLoad() let request = GAMRequest() GAMInterstitialAd.load(withAdUnitID:"/6499/example/interstitial", request: request, completionHandler: { [self] ad, error in if let error = error { print("Failed to load interstitial ad with error: (error.localizedDescription)") return } interstitial = ad interstitial?.fullScreenContentDelegate = self } ) } /// Tells the delegate that the ad failed to present full screen content. func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) { print("Ad did fail to present full screen content.") } /// Tells the delegate that the ad will present full screen content. func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) { print("Ad will present full screen content.") } /// Tells the delegate that the ad dismissed full screen content. func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) { print("Ad did dismiss full screen content.") } }
Objective-C
@interface ViewController ()<GADFullScreenContentDelegate> @property(nonatomic, strong) GAMInterstitialAd *interstitial; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; GAMRequest *request = [GAMRequest request]; [GAMInterstitialAd loadWithAdUnitID:@"/6499/example/interstitial" request:request completionHandler:^(GAMInterstitialAd *ad, NSError *error) { if (error) { NSLog(@"Failed to load interstitial ad with error: %@", [error localizedDescription]); return; } self.interstitial = ad; self.interstitial.fullScreenContentDelegate = self; }]; } /// Tells the delegate that the ad failed to present full screen content. - (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad didFailToPresentFullScreenContentWithError:(nonnull NSError *)error { NSLog(@"Ad did fail to present full screen content."); } /// Tells the delegate that the ad will present full screen content. - (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad { NSLog(@"Ad will present full screen content."); } /// Tells the delegate that the ad dismissed full screen content. - (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad { NSLog(@"Ad did dismiss full screen content."); }
GAMInterstitialAd
is a one-time-use object. This
means that once an interstitial ad is shown, it cannot be shown again. A best
practice is to load another interstitial ad in the
adDidDismissFullScreenContent:
method on GADFullScreenContentDelegate
so
that the next interstitial ad starts loading as soon as the previous one is
dismissed.
Display the ad
Interstitials should be displayed during natural pauses in the flow of an app.
Between levels of a game is a good example, or after the user completes a task.
Here’s an example of how to do this in one of the action methods in a
UIViewController
:
Swift
@IBAction func doSomething(_ sender: Any) { if interstitial != nil { interstitial.present(fromRootViewController: self) } else { print("Ad wasn't ready") } }
Objective-C
- (IBAction)doSomething:(id)sender { ... if (self.interstitial) { [self.interstitial presentFromRootViewController:self]; } else { NSLog(@"Ad wasn't ready"); } }
If you’re not getting any ads back, with the error response «Request Error: No
ads to show», make sure your line item has a creative targeted to the right
size. Interstitial sizes are 320×480 & 480×320 for phones and 1024×768 &
768×1024 for tablets. If a device isn’t big enough to fit a 1024×768 or
768×1024, it will fall back to the 320×480 or 480×320 size.
Best practices
- Consider whether interstitial ads are the right type of ad for your app.
- Interstitial ads work best in apps with natural transition points.
The conclusion of a task within an app, like sharing an image or completing a
game level, creates such a point. Because the user is expecting a break in the
action, it’s easy to present an interstitial ad without disrupting their
experience. Make sure you consider at which points in your app’s workflow you’ll
display interstitial ads and how the user is likely to respond. - Remember to pause the action when displaying an interstitial ad.
- There are a number of different types of interstitial ads: text, image,
video, and more. It’s important to make sure that when your app displays an
interstitial ad, it also suspends its use of some resources to allow the ad to
take advantage of them. For example, when you make the call to display an
interstitial ad, be sure to pause any audio output being produced by your app.
You can resume playing sounds in the
adDidDismissFullScreenContent:
event handler, which will be invoked when the user has finished interacting
with the ad. In addition, consider temporarily halting any intense computation
tasks (such as a game loop) while the ad is being displayed. This will ensure
that the user doesn’t experience slow or unresponsive graphics or stuttered
video. - Allow for adequate loading time.
- Just as it’s important to make sure you display interstitial ads at an
appropriate time, it’s also important to make sure the user doesn’t have to
wait for them to load. Loading the ad in advance before you intend to show
can ensure that your app has a fully loaded interstitial ad at the ready when
the time comes to display one. - Don’t flood the user with ads.
- While increasing the frequency of interstitial ads in your app might seem
like a great way to increase revenue, it can also degrade the user experience
and lower clickthrough rates. Make sure that users aren’t so frequently
interrupted that they’re no longer able to enjoy the use of your app. - Don’t use the load completion callback to show the interstitial.
- This can cause a poor user experience. Instead, pre-load the ad before you
need to show it. Then check thecanPresentFromRootViewController:error:
method
onGAMInterstitialAd
to find out if it is ready to be
shown.
Examples on GitHub
- Interstitial ads example:
Swift |
Objective-C
Next steps
- Learn about ad targeting and
interstitial ad guidelines.
Adam Howitt
unread,
May 16, 2014, 7:49:42 PM5/16/14
to google-adm…@googlegroups.com
I’m having trouble getting my DFP banner to show up. If I uncomment request.testDevices I see the test smart banner. If I leave it commented it out I continually get the error caught by my didFail delegate method: «Request Error: No ad to show.»
Here is my ad slot setup:
Here is my order and line item setup:
and here is the code:
NSString * const kDFPAdUnit320x50 = @»/mynetworkid/myadid»;
…
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (section== 0) {
return 60.0;
} else {
return 0.0;
}
}
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
if (section == 0) {
if (!bannerView_) {
bannerView_ = [[DFPBannerView alloc] initWithAdSize:kGADAdSizeBanner];
bannerView_.adUnitID = kDFPAdUnit320x50;
bannerView_.rootViewController = self;
bannerView_.delegate = self;
GADRequest *request = [GADRequest request];
//request.testDevices = @[ @»mydevice» ];
[bannerView_ loadRequest:request];
}
return bannerView_;
} else {
return nil;
}
}
— (void)adViewDidReceiveAd:(DFPBannerView *)bannerView {
DLog(@»Got banner»);
}
— (void)adView:(DFPBannerView *)bannerView
didFailToReceiveAdWithError:(GADRequestError *)error {
DLog(@»%@»,[error description]);
bannerView_ = nil;
}
Adam Howitt
unread,
May 16, 2014, 7:57:26 PM5/16/14
to google-adm…@googlegroups.com
Weirdly enough the DFP console now shows 9 impressions, none of which have appeared on my device yet.
Adam Howitt
unread,
May 16, 2014, 8:02:44 PM5/16/14
to google-adm…@googlegroups.com
Oh — and I see this in the console on the simulator
<Google> To get test ads on this device, call: request.testDevices = @[ GAD_SIMULATOR_ID ];
and a similar thing when running on the device:
<Google> To get test ads on this device, call: request.testDevices = @[ @»xxxxx» ];
But I’m not trying to get test ads — the line item I created was a house ads line item where impressions and CTR aren’t important. Is there a switch to tell it to serve impressions? Does it matter that I’m running the debug build and not an ad hoc?
On Friday, May 16, 2014 11:49:42 AM UTC-4, Adam Howitt wrote:
Adam Howitt
unread,
May 16, 2014, 11:06:34 PM5/16/14
to google-adm…@googlegroups.com
Okay — think I just figured this out. In my function I was returning the bannerview as the view for my footer (didn’t work). I tried creating a view and then adding the DFPBannerView as a subview and all was well at last. I moved the addSubView to the delegate method for receiving a banner. Here’s my final implementation for anyone trying to do do this (add a banner as a tableView footer:
NSString * const kDFPAdUnit320x50 = @»/networkid/adid»;
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (section== 0 && bannerView_ != nil) {
return 60.0;
} else {
return 0.0;
}
}
-(UIView *)tableView:(UITableView *)tv viewForFooterInSection:(NSInteger)section {
if (section == 0) {
if (!footerView) {
CGRect footerFrame = [tv rectForFooterInSection:0];
footerView = [[UIView alloc] initWithFrame:footerFrame];
footerView.backgroundColor = [UIColor whiteColor];
GADAdSize sz = GADAdSizeFromCGSize(CGSizeMake(320, 50));
bannerView_ = [[DFPBannerView alloc] initWithAdSize:sz];
//pad bannerview by five pixels above and below
CGRect newFrame= bannerView_.frame;
newFrame.origin.y += 5;
bannerView_.frame = newFrame;
bannerView_.adUnitID = kDFPAdUnit320x50;
bannerView_.rootViewController = self;
bannerView_.delegate = self;
GADRequest *request = [GADRequest request];
// Initiate a generic request to load it with an ad.
[bannerView_ loadRequest:request];
}
return footerView;
} else {
return nil;
}
}
— (void)adViewDidReceiveAd:(DFPBannerView *)bannerView {
DLog(@»Got banner»);
[footerView addSubview:bannerView_];
}
— (void)adView:(DFPBannerView *)bannerView
didFailToReceiveAdWithError:(GADRequestError *)error {
DLog(@»%@»,[error description]);
bannerView_ = nil;
[self.tableView reloadData];
}
Eric Leichtenschlag
unread,
May 17, 2014, 3:46:47 AM5/17/14
to google-adm…@googlegroups.com
I’m glad you got it working, although that code change shouldn’t have affected whether the ad request was successful. Perhaps you just needed to wait a little longer for your DFP UI changes to propagate to all servers.
As for your code, a couple small best practices I’d suggest are to use the kGADAdSizeBanner constant and pass an origin in when creating the banner:
CGPoint origin = CGPointMake(0, 5);
bannerView_ =[[DFPBannerView alloc] initWithAdSize:kGADAdSizeBanner origin:origin];
Thanks,
Eric
Я разрабатываю приложение iOS с помощью Swift2 и Xcode7. Я пытаюсь внедрить AdMob, но он не отображает мое межстраничное объявление.
override func viewDidLoad() {
super.viewDidLoad()
_interstitial = createAndLoadInterstitial()
}
func createAndLoadInterstitial()->GADInterstitial {
let interstitial = GADInterstitial(adUnitID: "interstitial_ID")
let gadRequest:GADRequest = GADRequest()
gadRequest.testDevices = ["test device id"]
interstitial.delegate = self
interstitial?.loadRequest(gadRequest)
return interstitial!
}
func interstitialDidReceiveAd(ad: GADInterstitial!) {
_interstitial?.presentFromRootViewController(self)
}
func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
print(error.localizedDescription)
}
func interstitialDidDismissScreen(ad: GADInterstitial!) {
_interstitial = createAndLoadInterstitial()
}
Я получаю эту ошибку:
Ошибка запроса: объявления не отображаются.
28 сен. 2015, в 14:40
Поделиться
Источник
2 ответа
Request Error: No ad to show.
означает, что ваш запрос был успешным, но Admob не имеет рекламы для вашего устройства в настоящее время. Лучший способ убедиться, что вы всегда показываете рекламу, — это использовать посредничество, чтобы невыполненный запрос попадал в другую рекламную сеть. Admob обеспечивает хорошие механизмы для этого.
William
01 окт. 2015, в 01:00
Поделиться
У вас должно быть два идентификатора рекламного блока. Один для вашего GADBannerView
и один для вашего GADInterstitial
. Убедитесь, что идентификатор рекламного блока, предоставленный AdMob для вашего межстраничного объявления, точно совпадает с тем, что они вам дали. Обновите последний SDK AdMob, в настоящее время 7.5.0. Также рассмотрите вызов presentFromRootViewController(self)
через определенные промежутки времени или после того, как пользователь выполнит требуемое действие. Способ, которым вы сейчас устанавливаете, будет продолжать представлять межстраничные объявления один за другим, потому что вы отправляете запросы на новые межстраничные объявления каждый раз, когда вас увольняют, а затем отображает интерстициальный текст, как только он получает объявление.
import UIKit
import GoogleMobileAds
class ViewController: UIViewController, GADInterstitialDelegate {
var myInterstitial : GADInterstitial?
override func viewDidLoad() {
super.viewDidLoad()
myInterstitial = createAndLoadInterstitial()
}
func createAndLoadInterstitial()->GADInterstitial {
let interstitial = GADInterstitial(adUnitID: "Your Ad Unit ID")
interstitial.delegate = self
interstitial?.loadRequest(GADRequest())
return interstitial
}
@IBAction func someButton(sender: AnyObject) {
myInterstitial?.presentFromRootViewController(self)
}
func interstitialDidReceiveAd(ad: GADInterstitial!) {
print("interstitialDidReceiveAd")
}
func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
print(error.localizedDescription)
}
func interstitialDidDismissScreen(ad: GADInterstitial!) {
print("interstitialDidDismissScreen")
myInterstitial = createAndLoadInterstitial()
}
Daniel Storm
28 сен. 2015, в 14:28
Поделиться
Ещё вопросы
- 0Как получить результаты из базы данных при наборе и сопоставлении всех данных?
- 1PyTest: автоматическое удаление временного каталога, созданного с помощью tmpdir_factory
- 0Как заполнить $ scope на начальной странице GET-запроса
- 0Как получить данные через API с помощью Angular?
- 0C ++ — организация служебного кода, избегая «множественного определения ..»
- 1Отправка команд в экземпляр putty.exe из программы C # (WPF)
- 1Расшифровка ответов разных кодировок
- 0Переменная в скрипте jQuery?
- 0Сообщение об ошибке загрузки файла Blueimp для недопустимых файлов
- 0MySQL создать составной ключ с различными типами данных
- 1Принудительное действие для запуска действия в ландшафте в Android 1.5
- 0PHP preg_replace () шаблон
- 1Не могу запустить Java в искровой рабочий
- 1генерировать случайные места рядом с моим местоположением
- 0код контрольной суммы в C ++
- 1Проблема безопасности JavaScript
- 1новичок, установка приложения на телефон Samsung
- 0отправлять через запятую значения, чтобы функционировать как один параметр
- 0утечка памяти в контейнере с ++
- 0Обнаружение изменения значения текстовой области
- 0Обрабатывать событие касания в перемещенном слое в проекте cocos2d-x cpp?
- 0Как избежать событий на элементах позади других в HTML и JavaScript / jQuery
- 1DatagramPacket getData vs getLength
- 1И TSV, и TXT выводят в тессеракт
- 0Новый объект C ++ для POD (простой старый тип данных)
- 0Половина полного предотвращения файлов PHP
- 1Как мне убедить средство проверки Typescript, что значение является определенным подклассом в Javascript?
- 1Передача информации между отдельными консолями и приложениями Windows
- 1Извлечь имя в текстовом файле между (: или, или;) и (ключевым словом) с помощью регулярного выражения в python
- 0генератор экспоненциальных чисел c ++, иногда возвращает inf
- 1Использование сканера и nextLine для завершения программы
- 1GUI-превью и кнопки вместе
- 0oci: использование массива вместо нескольких oci_bind_by_name
- 0Как создать и редактировать глобальный PCHAR без утечки памяти
- 1Python — Группировка по нескольким столбцам с .mean () и .agg ()
- 0AES: поиск ключа по расшифрованному тексту и зашифрованному тексту
- 1Номер уведомления отображается не на всех телефонах
- 0Объединение двух наборов результатов
- 0Как я могу получить и управлять потоковым ресурсом БД? PHP-DB2
- 0Невозможно сохранить холст с помощью перетаскиваемого объекта.
- 0Как мне установить класс на основе состояния дочернего элемента с Angular?
- 1Редактирование сообщений с использованием discord.js не работает
- 0Добавить больше данных в существующие данные
- 1flask_restful import Ошибка ресурса
- 1Получать данные udp с системного сервера udp на android?
- 0Адаптивный дизайн медиа-запросов для фиксированной разметки
- 0Загрузка данных из JSON с использованием Angular
- 0Динамически загружать JS в «Head» используя PHP
- 1Удаление пробела между словом и ссылкой на странице JSF
- 1Как получить доступ к значениям формы с именами переменных?
Вопрос:
Я разрабатываю приложение iOS с помощью Swift2 и Xcode7. Я пытаюсь внедрить AdMob, но он не отображает мое межстраничное объявление.
override func viewDidLoad() {
super.viewDidLoad()
_interstitial = createAndLoadInterstitial()
}
func createAndLoadInterstitial()->GADInterstitial {
let interstitial = GADInterstitial(adUnitID: "interstitial_ID")
let gadRequest:GADRequest = GADRequest()
gadRequest.testDevices = ["test device id"]
interstitial.delegate = self
interstitial?.loadRequest(gadRequest)
return interstitial!
}
func interstitialDidReceiveAd(ad: GADInterstitial!) {
_interstitial?.presentFromRootViewController(self)
}
func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
print(error.localizedDescription)
}
func interstitialDidDismissScreen(ad: GADInterstitial!) {
_interstitial = createAndLoadInterstitial()
}
Я получаю эту ошибку:
Ошибка запроса: объявления не отображаются.
Лучший ответ:
Request Error: No ad to show.
означает, что ваш запрос был успешным, но Admob не имеет рекламы для вашего устройства в настоящее время. Лучший способ убедиться, что вы всегда показываете рекламу, – это использовать посредничество, чтобы невыполненный запрос попадал в другую рекламную сеть. Admob обеспечивает хорошие механизмы для этого.
Ответ №1
У вас должно быть два идентификатора рекламного блока. Один для вашего GADBannerView
и один для вашего GADInterstitial
. Убедитесь, что идентификатор рекламного блока, предоставленный AdMob для вашего межстраничного объявления, точно совпадает с тем, что они вам дали. Обновите последний SDK AdMob, в настоящее время 7.5.0. Также рассмотрите вызов presentFromRootViewController(self)
через определенные промежутки времени или после того, как пользователь выполнит требуемое действие. Способ, которым вы сейчас устанавливаете, будет продолжать представлять межстраничные объявления один за другим, потому что вы отправляете запросы на новые межстраничные объявления каждый раз, когда вас увольняют, а затем отображает интерстициальный текст, как только он получает объявление.
import UIKit
import GoogleMobileAds
class ViewController: UIViewController, GADInterstitialDelegate {
var myInterstitial : GADInterstitial?
override func viewDidLoad() {
super.viewDidLoad()
myInterstitial = createAndLoadInterstitial()
}
func createAndLoadInterstitial()->GADInterstitial {
let interstitial = GADInterstitial(adUnitID: "Your Ad Unit ID")
interstitial.delegate = self
interstitial?.loadRequest(GADRequest())
return interstitial
}
@IBAction func someButton(sender: AnyObject) {
myInterstitial?.presentFromRootViewController(self)
}
func interstitialDidReceiveAd(ad: GADInterstitial!) {
print("interstitialDidReceiveAd")
}
func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
print(error.localizedDescription)
}
func interstitialDidDismissScreen(ad: GADInterstitial!) {
print("interstitialDidDismissScreen")
myInterstitial = createAndLoadInterstitial()
}