# ModalWindow

In App Message — это всплывающие окна внутри приложения. Подробнее о формате — в разделе Рекламные форматы.

# 1. Загрузка рекламы

При загрузке рекламы необходимо передавать padId, который можно получить в рекламной админке либо от менеджера. Для отладки можно использовать тестовые padId (см. Отладка).

Создайте загрузчик и подпишитесь через делегат:

import MadsSDK

private let loader = InAppAdLoader()
loader.delegate = self

Вызовите loader.load(...):

let request = InAppAdRequest(
    padId: "1",
    targetings: ["some_targeting": "value"],
    isDebugCreativeEnabled: false
)

loader.load(request)

Отмена загрузки:

let cancellable = loader.load(request)

// Отмена в любой момент
cancellable.cancel()

Для загрузки вызовите MadsSDK.inApp.load(...):

import MadsSDK

let request = InAppAdRequest(
    padId: "1",
    targetings: ["some_targeting": "value"],
    isDebugCreativeEnabled: false
)

let response = await MadsSDK.inApp.load(request)

Простановка таймаута загрузки рекламы:

let task = Task {
    await MadsSDK.inApp.load(request)
}

Task {
    try? await Task.sleep(for: .seconds(10))
    task.cancel()
}

Отмена загрузки:

let task = Task {
    await MadsSDK.inApp.load(request)
}

// Отмена в любой момент
task.cancel()

# Параметры запроса

Параметр Тип Обязательный Описание
padId String Id места размещения
targetings [String: String] Словарь таргетингов для персонализации рекламы
isDebugCreativeEnabled Bool Загрузка дебаг-креативов (по умолчанию: false)

# 2. Таргетирование

Передайте словарь таргетингов при загрузке рекламы. Подробнее о таргетингах — в разделе Таргетирование.

let targetings: [String: String] = ["gender": "female"]

loader.load(
    InAppAdRequest(
        padId: "1",
        targetings: targetings
    )
)
let targetings: [String: String] = ["gender": "female"]

let request = InAppAdRequest(
    padId: "1",
    targetings: targetings
)

let response = await MadsSDK.inApp.load(request)

# 3. Обработка результата запроса и показ загруженной рекламы

Обработайте результат загрузки рекламы:

extension ViewController: InAppAdLoaderDelegate {
    func inAppAdLoader(
        _ loader: InAppAdLoaderProtocol,
        didReceive response: InAppAdLoader.Response
    ) {
        switch response {
        case let .success(inAppAd, slot):
            // Для показа можно передать UIViewController (опционально)
            MadsSDK.showInAppAd(inAppAd, inVC: self)
        case let .failure(error, slot):
            // Загрузка завершилась с ошибкой
            break
        case let .noContent(slot):
            // Реклама не была подобрана
            break
        }
    }
}
let response = await MadsSDK.inApp.load(request)

switch response {
case let .success(inAppAd, slot):
    // Для показа можно передать UIViewController (опционально)
    MadsSDK.showInAppAd(inAppAd, inVC: self)
case let .failure(error, slot):
    // Загрузка завершилась с ошибкой
    break
case let .noContent(slot):
    // Реклама не была подобрана
    break
}

# Возможные состояния

Тип значения Параметры Описание
Success inAppAd — загруженная реклама, slot — информация о размещении Реклама загружена успешно. Отобразить вызвав MadsSDK.showInAppAd(...).
Failure error — причина ошибки, slot — информация о размещении Загрузка рекламы завершилась ошибкой.
NoContent slot — информация о размещении Запрос завершился без ошибок, но реклама не была подобрана.

# Возможные ошибки загрузки (InAppAdLoadError)

Тип значения Описание
network Ошибка сети при загрузке рекламы
sdkNotInitialized SDK не инициализирован
adLoad Не удалось загрузить рекламу
cancelled Загрузка рекламы отменена

# 4. Кастомизация UI (Modal Window)

# 5. Реакция на действия пользователя

SDK не реагирует на действия пользователя на рекламном объявлении (такие как "нажатие на кнопку" и т.д.). Реакцию на эти действия необходимо реализовать на стороне интегрирующего приложения:

Подпишитесь на события рекламного объекта через делегат:

inAppAd.delegate = self

Реализуйте протокол:

extension ViewController: InAppAdDelegate {
    func inAppAd(_ ad: InAppAd, didEmit action: InAppAd.Action) {
        switch action {
        case let .onUrlClicked(info, url):
            openUrl(url) // открытие ссылки
        case let .onPromocodeCopy(info, promocode):
            applyPromocode(promocode) // применение промокода
        }
    }

    func inAppAd(_ ad: InAppAd, didEmit event: InAppAd.Event) {
        // см. секцию «6. Реакция на события показа рекламы»
    }
}
for await action in inAppAd.actions {
    switch action {
    case let .onUrlClicked(info, url):
        openUrl(url) // открытие ссылки
    case let .onPromocodeCopy(info, promocode):
        applyPromocode(promocode) // применение промокода
    }
}

# Возможные значения InAppAd.Action

Тип значения Параметры Описание
InAppAd.Action.onUrlClicked info — информация о рекламном объявлении
url — ссылка для перехода
Нажатие на кнопку перехода по ссылке
InAppAd.Action.onPromocodeCopy info — информация о рекламном объявлении
promocode — промокод для копирования
Нажатие на кнопку копирования промокода

# 6. Реакция на события показа рекламы

При необходимости приложение может отслеживать события показа рекламы:

func inAppAd(_ ad: InAppAd, didEmit event: InAppAd.Event) {
    switch event {
    case let .onCreativeView(info):
        break // объявление показано
    case let .onCreativeFailedToShow(info):
        break // не удалось показать объявление
    case let .onCreativeDismissed(info, type):
        break // объявление скрыто
    }
}
for await event in inAppAd.events {
    switch event {
    case let .onCreativeView(info):
        break // объявление показано
    case let .onCreativeFailedToShow(info):
        break // не удалось показать объявление
    case let .onCreativeDismissed(info, type):
        break // объявление скрыто
    }
}

# Возможные значения InAppAd.Event

Тип значения Параметры Описание
InAppAd.Event.onCreativeView info — информация о рекламном объявлении Показ рекламного объявления
InAppAd.Event.onCreativeFailedToShow info — информация о рекламном объявлении Не удалось показать объявление
InAppAd.Event.onCreativeDismissed info — информация о рекламном объявлении
type — способ закрытия
Скрытие рекламного объявления

# Возможные значения DismissType

Тип значения Описание
close Тап по кнопке закрытия (крестик)
closeSwipe Свайп вниз
closeOutsideClick Тап вне модалки (на overlay)

# Пример

Полный пример интеграции In App рекламы — в репозитории на GitHub.