Баннеры
Классический тип рекламы, который обычно располагается внизу или вверху экрана приложения. Appodeal поддерживает стандартные размеры баннеров 320x50 для телефонов, 728x90 для планшетов и смарт баннеры на всю ширину экрана.
Вы можете использовать наше демо приложение в качестве примера по интеграции.
Баннер С Фиксированной Позицией
Отображение
В Appodeal SDK Баннеры являются синглтонами: если на разных контроллерах у вас есть и bannerTop, и bannerBottom, то Appodeal SDK будет использовать для них один и тот же экземпляр Баннера. Баннеры обновляются автоматически каждые 15 секунд. Для отображения Баннера внизу экрана используйте следующий код:
- Swift
- Objective-C
Appodeal.showAd(.bannerBottom, rootViewController: self)
[Appodeal showAd:AppodealShowStyleBannerBottom rootViewController:self];
Отображение Баннера Вверху Экрана
- Swift
- Objective-C
Appodeal.showAd(.bannerTop, rootViewController: self)
[Appodeal showAd:AppodealShowStyleBannerTop rootViewController:self];
Отображение Баннера С Правой Или Левой Стороны
Если ваше приложение использует ландшафтную ориентацию, вы можете показывать баннеры с левой или правой стороны. Такой баннер будет иметь отступ в соответствии с safe area layout guide.
Выключите banner smart sizing, если вы используете AppodealShowStyleBannerLeft или AppodealShowStyleBannerRight
- Swift
- Objective-C
// Overrides default rotation angles
// Appodeal.setBannerLeftRotationAngleDegrees(90, rightRotationAngleDegrees: 180)
Appodeal.showAd(.bannerLeft, forPlacement: placement, rootViewController: self)
// Appodeal.showAd(.bannerRight, forPlacement: placement, rootViewController: self)
// Overrides default rotation angles
// [Appodeal setBannerLeftRotationAngleDegrees:90 rightRotationAngleDegrees:180];
[Appodeal showAd: AppodealShowStyleBannerLeft forPlacement: placement rootViewController: self];
// [Appodeal showAd: AppodealShowStyleBannerRight forPlacement: placement rootViewController: self];
Проверка Загрузки
Вы можете проверить статус загрузки перед показом. Этот метод возвращает булевое значение, которое указывает, была ли загружена реклама.
- Swift
- Objective-C
Appodeal.isReadyForShow(with: .bannerTop)
[Appodeal isReadyForShowWithStyle: AppodealShowStyleBannerTop];
Мы рекомендуем проверять статус загрузки перед показом рекламы.
Скрытие
Чтобы удалить Баннер из иерархии представлений:
- Swift
- Objective-C
Appodeal.hideBanner()
[Appodeal hideBanner];
Методы Обратного Вызова
Методы обратного вызова позволяют отслеживать различные события в жизненном цикле рекламного блока, например, момент, когда пользователь нажал на рекламу или закрыл ее. Для их вызова установите следующее значение делегата:
- Swift
- Objective-C
//set delegate
Appodeal.setBannerDelegate(self)
//set delegate
[Appodeal setBannerDelegate:self];
Обычно класс, который работает с баннерами, одновременно является и
классом делегата, поэтому в качестве свойства делегата можно указать
self
.
Теперь вы можете использовать следующие методы обратного вызова:
- Swift
- Objective-C
// banner was loaded (precache flag shows if the loaded ad is precache)
func bannerDidLoadAdIsPrecache(_ precache: Bool) {}
// banner was shown
func bannerDidShow() {}
// banner failed to load
func bannerDidFailToLoadAd() {}
// banner was clicked
func bannerDidClick() {}
// banner did expire and could not be shown
func bannerDidExpired() {}
// banner was loaded (precache flag shows if the loaded ad is precache)
- (void)bannerDidLoadAdIsPrecache:(BOOL)precache {}
// banner was shown
- (void)bannerDidShow {}
// banner failed to load
- (void)bannerDidFailToLoadAd {}
// banner was clicked
- (void)bannerDidClick {}
// banner did expire and could not be shown
- (void)bannerDidExpired {}
Все функции обратного вызова вызываются в главном потоке.
Если автоматическое кеширование для типа рекламы Баннер включено, не
используйте метод обратного вызова bannerDidLoadAdIsPrecache
для
показа рекламы. Баннер будет обновляться автоматически после первого
показа.
Баннер С Кастомной Позицией
Отображение Баннера В Программно Созданном Представлении
Вы можете добавить баннер в иерархию представлений вручную.
For example:
- Swift
- Objective-C
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let banner = Appodeal.banner() {
self.view.addSubview(banner)
banner.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 50)
}
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.view addSubview:[Appodeal banner]];
[Appodeal banner].frame = CGRectMake(0, 0, self.view.bounds.size.width, 50);
}
Пользовательский BannerView
должен быть вверху иерархии и не должен
перекрываться другими представлениями.
Дополнительно
Плейсменты
Appodeal SDK позволяет вам отмечать показы различными тегами с помощью плейсментов. Для использования данной функции вам необходимо создать плейсмент в настройках вашего приложения. Больше информации о плейсментах в нашем руководстве.
- Swift
- Objective-C
Appodeal.showAd(.bannerTop, forPlacement: placement, rootViewController: self)
[Appodeal showAd:AppodealShowStyleBannerTop forPlacement:placement rootViewController:self];
Если загруженный креатив не может быть показан для настроек выбранного плейсмента, показа не будет. Если включен автоматический режим загрузки рекламных креативов, SDK начнет грузить новый рекламный креатив, что может повлиять на display rate вашего приложения. В подобных случаях мы рекомендуем проверять возможность показа с помощью метода canShow:
- Swift
- Objective-C
Appodeal.canShow(.bannerTop, forPlacement: placement)
[Appodeal canShow:AppodealAdTypeBannerTop forPlacement:placement];
Вы можете настраивать логику показа для каждого плейсмента.
Если в приложении нет настроенных плейсментов или вы пробуете показать рекламу для плейсмента который не существует в настройках вашего приложения, каждый показ будет записан в плейсмент с именем 'default' и будут применены его настройки.
Настройки плейсментов влияют только на показ рекламы и не влияют на ее загрузку.
Расширенные Возможности Интеграции
Если классические методы отображения Баннеров не подходят для вашего
приложения вы можете использовать AppodealBannerView
- UIView
сабкласс
для реализации:
- Swift
- Objective-C
import UIKit
import Appodeal
class YourViewController : UIViewController, AppodealBannerViewDelegate {
override func viewDidLoad () {
super.viewDidLoad()
// required: init ad banner
var bannerView: AppodealBannerView!
bannerView.init(size: bannerSize, rootViewController: self);
// optional: set delegate
bannerView.setDelegate(self);
// required: add banner to superview and call -loadAd to start banner loading
self.view addSubview(bannerView);
bannerView.loadAd();
}
// optional: implement any of AppodealBannerViewDelegate methods
func bannerViewDidLoadAd(_ bannerView: APDBannerView, isPrecache precache: Bool) {
NSLog("bannerView was loaded")
}
func bannerView(_ bannerView: APDBannerView, didFailToLoadAdWithError error: Error) {
NSLog("bannerView failed to load");
}
func bannerViewDidInteract(_ bannerView: APDBannerView) {
NSLog("bannerView was clicked")
}
func bannerViewDidShow(_ bannerView: APDBannerView) {
NSLog("bannerView was shown")
}
func bannerViewExpired(_ bannerView: APDBannerView) {
NSLog("bannerView did expire and could not be shown")
}
}
#import "YourViewController.h"
#import <Appodeal/Appodeal.h>
@interface YourViewController () <AppodealBannerViewDelegate>
@end
@implementation YourViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// required: init ad banner
AppodealBannerView *bannerView = [[AppodealBannerView alloc] initWithSize:kAppodealUnitSize_320x50 rootViewController:self];
// optional: set delegate
bannerView.delegate = self;
// required: add banner to superview and call -loadAd to start banner loading
[self.view addSubview:bannerView];
[bannerView loadAd];
}
// optional: implement any of AppodealBannerViewDelegate methods
- (void)bannerViewDidLoadAd:(APDBannerView *)bannerView isPrecache:(BOOL)precache{
NSLog(@"Banner %@ did load!", bannerView);
}
- (void)bannerViewDidInteract:(APDBannerView *)bannerView {
NSLog(@"Banner %@ did interact", bannerView);
}
- (void)bannerView:(APDBannerView *)bannerView didFailToLoadAdWithError:(NSError *)error {
NSLog(@"Banner %@ did fail with error: %@", bannerView, error);
}
- (void)bannerViewDidShow:(APDBannerView *)bannerView {
NSLog(@"Banner %@ did show ad ", bannerView);
}
- (void)bannerViewExpired:(APDBannerView *)bannerView {
NSLog(@"Banner %@ expired", bannerView);
}
@end
Для улучшения пользовательского опыта, мы рекомендуем использовать
единственный экземпляр APDBannerView
для всех экранов, где
должен отображаться баннер.
Даллее предложены несолько примеров: использование UIStoryboardSegue
в Storyboard приложении и
передача баннера в приложении с програмной навигацией с помощью UINavigationController
.
Storyboard приложение.
- Создадим вспомогательный протокол, который будут использовать
реализации
UIViewController
для размещения баннера.
import Foundation
import UIKit
import Appodeal
protocol BannerContainableController: UIViewController {
var bannerContainerView: UIView! { get }
}
extension BannerContainableController {
func layoutBannerView(_ bannerView: APDBannerView) {
bannerView.removeFromSuperview()
bannerView.rootViewController = self
bannerContainerView.addSubview(bannerView)
NSLayoutConstraint.activate([
bannerView.topAnchor.constraint(equalTo: bannerContainerView.topAnchor),
bannerView.bottomAnchor.constraint(equalTo: bannerContainerView.bottomAnchor),
bannerView.leftAnchor.constraint(equalTo: bannerContainerView.leftAnchor),
bannerView.rightAnchor.constraint(equalTo: bannerContainerView.rightAnchor),
])
}
}
Этот проотокол будет использован в ParentViewController
и
ChildViewController
для отображения баннера внизу экрана
- Создадим новый переход с идентификатором:
ShowChildViewController
- Переопределим метод
prepare(for segue:, sender:)
вParentViewController
для передачи экземпляра баннера вChildViewController
.
import UIKit
import Appodeal
class ParentViewController: UIViewController, BannerContainableController {
@IBOutlet weak var bannerContainerView: UIView!
private lazy var bannerView = APDBannerView(size: kAPDAdSize320x50)
override func viewDidLoad() {
super.viewDidLoad()
// Load banner and it to the view in hierarchy
bannerView.loadAd()
bannerView.translatesAutoresizingMaskIntoConstraints = false
layoutBannerView(bannerView)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard
segue.identifier == "ShowChildViewController",
let childViewController = segue.destination as? ChildViewController
else { return }
childViewController.onDismiss = { [weak self] in
guard let self else { return }
self.layoutBannerView(self.bannerView)
}
childViewController.bannerView = bannerView
}
}
- При возвращении пользователя на
ParentViewController
, требуется вернуть экземпляр баннера в иерархию этого контроллера. Чтобы достичь данного метода будем использовать метод обратного вызоваonDismiss
.
import Foundation
import UIKit
import Appodeal
class ChildViewController: UIViewController, BannerContainableController {
@IBOutlet weak var bannerContainerView: UIView!
weak var bannerView: APDBannerView?
var onDismiss: (() -> ())?
override func viewDidLoad() {
super.viewDidLoad()
guard let bannerView = bannerView else { return }
layoutBannerView(bannerView)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
onDismiss?()
}
}
Приложение с in-code
навигацией с помощью UINavigationController
Создадим вспомогательный протокол, который будут использовать реализации
UIViewController
для размещения баннера по аналогии с предыдущим примером.В
ParentViewController
создаем новый инстансChildViewController
и передаем в него экземпляр баннера.
import UIKit
import Appodeal
class ParentViewController: UIViewController, BannerContainableController {
private lazy var bannerView = APDBannerView(size: kAPDAdSize320x50)
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "Root View Controller"
bannerView.translatesAutoresizingMaskIntoConstraints = false
bannerView.rootViewController = self
bannerView.loadAd()
layoutBannerView(bannerView)
setupNavigationButton()
}
func setupNavigationButton() {
var configuration = UIButton.Configuration.filled()
configuration.titlePadding = 16
configuration.imagePadding = 16
let button = UIButton(configuration: configuration)
button.setImage(UIImage(systemName: "chevron.right"), for: .normal)
button.setTitle("Go To The Next View Controller", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.addTarget(self, action: #selector(navigateToChildrenViewController), for: .touchUpInside)
view.addSubview(button)
NSLayoutConstraint.activate([
button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.heightAnchor.constraint(equalToConstant: 44)
])
}
@objc func navigateToChildrenViewController() {
let destinationViewController = ChildViewController()
destinationViewController.layoutBannerView(bannerView)
destinationViewController.onDismiss = { [weak self] in
guard let self = self else { return }
self.layoutBannerView(self.bannerView)
}
navigationController?.pushViewController(destinationViewController, animated: true)
}
}
- В
ChildViewController
так же требуется вернуть экземпляр баннера в иерархию родительского контроллера при возвращении пользователя.
import UIKit
class ChildViewController: UIViewController, BannerContainableController {
var onDismiss: (() -> ())?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
onDismiss?()
}
}
BannerView в приложениях использующих SwifUI
Также как и для UIKit приложений, для SwiftUI мы рекомендуем
использовать единственный экземпляр APDBannerView
для всех экранов,
Чтобы добиться указанного поведения, потребуется создать несколько вспомогательных классов.
- Создадим
APDBannerViewController
- контроллер, который будет использоваться для отображения баннера и мониторинга его жизненного цикла.
import UIKit
import Appodeal
final class APDBannerViewController: UIViewController {
weak var bannerView: APDBannerView?
var onDismiss: (() -> ())?
override func viewDidLoad() {
super.viewDidLoad()
layoutBannerView()
}
deinit {
onDismiss?()
}
func layoutBannerView() {
guard let bannerView = bannerView else { return }
bannerView.removeFromSuperview()
bannerView.rootViewController = self
view.addSubview(bannerView)
NSLayoutConstraint.activate([
bannerView.topAnchor.constraint(equalTo: view.topAnchor),
bannerView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
bannerView.leftAnchor.constraint(equalTo: view.leftAnchor),
bannerView.rightAnchor.constraint(equalTo: view.rightAnchor),
])
}
}
- Создадим
BannerView
- структура, которая имплементирует протоколUIViewControllerRepresentable
. Данная структура будет использована для размещения баннера в иерархии отображений приложения. Также потребуется создать произвольныйCoordinator
(в данном примеры он будет единственным экземпляром). Он будет использоватьNSHashTable
для хранения и управления ссылками на экземплярыAPDBannerViewController
.
import SwiftUI
struct BannerView: UIViewControllerRepresentable {
typealias UIViewControllerType = APDBannerViewController
func makeUIViewController(context: Context) -> APDBannerViewController {
let controller = APDBannerViewController()
controller.bannerView = context.coordinator.bannerView
controller.onDismiss = context.coordinator.dismiss
context.coordinator.store(controller)
return controller
}
func updateUIViewController(
_ uiViewController: APDBannerViewController,
context: Context
) {}
func makeCoordinator() -> Coordinator {
return .shared
}
final class Coordinator {
static let shared = Coordinator()
private lazy var storage = NSHashTable<APDBannerViewController>(options: .weakMemory)
lazy var bannerView: APDBannerView = {
let bannerView = APDBannerView(size: kAPDAdSize320x50)
bannerView.translatesAutoresizingMaskIntoConstraints = false
bannerView.loadAd()
return bannerView
}()
func store(_ controller: APDBannerViewController) {
storage.add(controller)
}
func dismiss() {
let previousController = storage.allObjects.last
previousController?.bannerView = bannerView
previousController?.layoutBannerView()
}
}
}
- Теперь мы можем добавить
BannerView
в ирархию отображений SwiftUI.
Для BannerView требуется передать frame
фиксированной высоты.
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationStack {
VStack {
BannerView()
.frame(height: 50)
.frame(maxWidth: .infinity)
.background(Color(uiColor: .secondarySystemFill))
Spacer()
NavigationLink(
destination: {
ChildView()
},
label: {
HStack {
Image(systemName: "chevron.right")
Text("Go To The Next View")
}
.foregroundColor(.white)
.padding()
.background(RoundedRectangle(cornerRadius: 8).fill(Color.blue))
}
)
}
.navigationTitle("Root View")
}
}
}
struct ChildView: View {
var body: some View {
NavigationStack {
VStack {
Spacer()
BannerView()
.frame(height: 50)
.frame(maxWidth: .infinity)
.background(Color(uiColor: .secondarySystemFill))
}
.navigationTitle("Child View")
}
}
}
Включение Смарт Баннеров
Смарт-баннеры – это баннеры, которые автоматически подстраиваются под размеры экрана/контейнера. Их использование позволяет добиться корректного отображения рекламы на устройствах с любым размером экрана. Для того, чтобы подключить их, используйте следующий метод:
- Swift
- Objective-C
//for top/bottom banners allows banner view to resize automatically to fit device screen
Appodeal.setSmartBannersEnabled(true)
//for banner view allows banner view to resize automatically to fit device screen
bannerView.usesSmartSizing = true
//for top/bottom banners allows banner view to resize automatically to fit device screen
[Appodeal setSmartBannersEnabled:YES];
//for banner view allows banner view to resize automatically to fit device screen
bannerView.usesSmartSizing = YES;
Изменение Фона Для Баннеров
Этот метод позволяет создать фон серого цвета для Баннеров:
- Swift
- Objective-C
//for top/bottom banners
Appodeal.setBannerBackgroundVisible(true)
//for bannerView
bannerView.backgroundVisible = true
//for top/bottom banners
[Appodeal setBannerBackgroundVisible: YES];
//for bannerView
[bannerView setBannerBackgroundVisible: YES];
Включение Анимации При Смене Баннеров
- Swift
- Objective-C
//for top/bottom banners
Appodeal.setBannerAnimationEnabled(true)
//for bannerView
bannerView.bannerAnimationEnabled = true
//for top/bottom banners
[Appodeal setBannerAnimationEnabled:YES];
//for bannerView
[bannerView setBannerAnimationEnabled:YES];
Получение Прогнозируемого eCPM
Этот метод возвращает ожидаемый eCPM для загруженного креатива. Цена высчитывается из исторических данных для конкретного рекламного блока.
- Swift
- Objective-C
Appodeal.predictedEcpm(for: .banner)
[Appodeal predictedEcpmForAdType: AppodealAdTypeBanner];
Проверка Инициализации
- Swift
- Objective-C
Appodeal.isInitialized(for: .banner)
[Appodeal isInitalizedForAdType: AppodealAdTypeBanner];
Возвращает true
, если Баннерная реклама была инициализирована.
Проверка Типа Кеширования
- Swift
- Objective-C
Appodeal.isAutocacheEnabled(.banner)
[Appodeal isAutocacheEnabled: AppodealAdTypeBanner];
Возвращает true
, если было включено автоматическое кеширование для
Баннерной рекламы.