Реклама при открытии приложения
Реклама при открытии приложения (App Open Ad) — специальный формат рекламы для монетизации экранов загрузки своих приложений.
Внимание
Этот формат рекламы работает только в вертикальной ориентации. При горизонтальной ориентации реклама показываться не будет.
Примечание
Пример работы всех типов форматов есть в демопроекте.
Пример создания рекламы при открытии приложения
Основная идея реализации:
-
Создается отдельный контроллер, управляющий жизненным циклом рекламы при открытии приложения.
-
Реклама загружается заранее и хранится в памяти.
-
Показ рекламы триггерится событиями жизненного цикла приложения (переход в состояние
active).
Загружает и хранит рекламу, управляет показом и обрабатывает события SDK.
import UIKit
import YandexMobileAds
protocol AppOpenAdControllerDelegate: AnyObject {
func appOpenAdControllerDidLoad(_ controller: AppOpenAdController)
func appOpenAdControllerDidDismiss(_ controller: AppOpenAdController)
func appOpenAdController(_ controller: AppOpenAdController, didFailToLoadWithError error: Error)
func appOpenAdController(_ controller: AppOpenAdController, didFailToShowWithError error: Error)
}
class AppOpenAdController: NSObject {
static let shared = AppOpenAdController()
private let adUnitID = "ad-unit-ID" // Use R-M-XXXXXX-Y or "demo-appopenad-yandex" (look for the description below)
weak var delegate: AppOpenAdControllerDelegate?
private var appOpenAd: AppOpenAd?
private weak var presentingVC: UIViewController?
private lazy var appOpenAdLoader: AppOpenAdLoader = {
let loader = AppOpenAdLoader()
loader.delegate = self
return loader
}()
private override init() {
super.init()
}
func loadAd() {
print("[AppOpen] Loading ad...")
let configuration = AdRequestConfiguration(adUnitID: adUnitID)
appOpenAdLoader.loadAd(with: configuration)
}
func showAdIfAvailable() {
guard let ad = appOpenAd else {
return
}
let rootVC: UIViewController? = nil
ad.show(from: rootVC)
}
}
extension AppOpenAdController: AppOpenAdLoaderDelegate {
func appOpenAdLoader(_ adLoader: AppOpenAdLoader, didLoad appOpenAd: AppOpenAd) {
print("[AppOpen] didLoad")
self.appOpenAd = appOpenAd
self.appOpenAd?.delegate = self
delegate?.appOpenAdControllerDidLoad(self)
}
func appOpenAdLoader(_ adLoader: AppOpenAdLoader, didFailToLoadWithError error: AdRequestError) {
print("[AppOpen] didFailToLoad: \(error.error)")
appOpenAd = nil
delegate?.appOpenAdController(self, didFailToLoadWithError: error.error)
}
}
extension AppOpenAdController: AppOpenAdDelegate {
func appOpenAdDidShow(_ appOpenAd: AppOpenAd) {
print("[AppOpen] didShow")
}
func appOpenAdDidDismiss(_ appOpenAd: AppOpenAd) {
print("[AppOpen] didDismiss")
self.appOpenAd = nil
delegate?.appOpenAdControllerDidDismiss(self)
}
func appOpenAdDidClick(_ appOpenAd: AppOpenAd) {
print("[AppOpen] didClick")
}
func appOpenAd(_ appOpenAd: AppOpenAd, didFailToShowWithError error: Error) {
print("[AppOpen] didFailToShow: \(error)")
self.appOpenAd = nil
delegate?.appOpenAdController(self, didFailToShowWithError: error)
}
func appOpenAd(_ appOpenAd: AppOpenAd, didTrackImpressionWith impressionData: ImpressionData?) {
print("[AppOpen] didTrackImpression: \(impressionData?.rawData ?? "nil")")
}
}
Подписывается на события и реагирует на результат (UX/аналитика).
import UIKit
import YandexMobileAds
class AppOpenViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
loadAd()
}
private func loadAd() {
AppOpenAdController.shared.delegate = self
AppOpenAdController.shared.loadAd()
}
}
// MARK: - AppOpenAdControllerDelegate
extension AppOpenViewController: AppOpenAdControllerDelegate {
func appOpenAdControllerDidLoad(_ controller: AppOpenAdController) {
}
func appOpenAdControllerDidDismiss(_ controller: AppOpenAdController) {
}
func appOpenAdController(_ controller: AppOpenAdController, didFailToLoadWithError error: Error) {
}
func appOpenAdController(_ controller: AppOpenAdController, didFailToShowWithError error: Error) {
}
}
Отслеживает состояние приложения и инициирует показ рекламы при состоянии active.
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
// other settings
func sceneDidBecomeActive(_ scene: UIScene) {
AppOpenAdController.shared.showAdIfAvailable()
}
}