Skip to content
On this page

Advertising SDK Standard iOS

iOS Ads SDK (далее SDK) предназначено для монетизации рекламного инвентаря в ваших приложениях.

SDK предоставляет возможность загрузки и отображения следующих типов рекламных креативов в вашем приложении:

Баннеры:

  • HTML Banner (html рекламный контент) - баннеры, представляющие собой HTML-разметку, встраивается внутрь CreativeView иерархии. Для рендеринга HTML (под капотом) используется WebKit > WKWebView (встроенный движок браузера), который рендерид и отображает HTML код.

  • Image Banner (рекламный контент, представленный в виде картиники) - в качестве рекламного контента, встраивается простая картинка.

  • Media Banner (video, audio) - медиа рекламный контент, базируется на VAST спецификации.

Для просмотра детальной информации смотри раздел Показ баннерной рекламы.

Товарные:

  • Товарный креатив - специальный тип рекламного креатива для RetailMedia платформ, использующий в своей основе SKU идентификатор товара в RetailMedia платформе.

Для просмотра детальной информации смотри раздел Показ товарных креативов.

Прежде чем начать

Вам должны быть известны следующие параметры, необходимые для инициализации и использования SDK. Попросите команду SDK выдать их вам.

  • bannerUrl - URL для загрузки баннерной рекламы (HTML Banner, Image Banner, Media Banner). Пример: "https://my.server.com/banner_creative".
  • productUrl - URL для загрузки товарных креативов. Пример: "https://my.server.com/product_creative".

Версия SDK:

Демо: Advertising SDK Example

Репозиторий со стабильным релизом: Advertising SDK Standard

Требования

  • Swift 5 и выше
  • iOS 12 и выше

Установка

Подключение CocoaPods зависимости.

Для использования iOS Ads SDK необходимо установить следующие зависимось в Podfile файле вашего проекта:

pod 'SAAdvertisingSDKStandard'

или

pod 'SAAdvertisingSDKStandard', :git => 'https://github.com/solutionarchitectstech/mobile_sdk_release_ios.git', :tag => '{{ version }}'

Инициализация SDK

Инициализация библиотеки и создание рекламных мест выполняется разработчиком вызовом метода TechAdvetrising.initialize() в момент запуска приложения или в момент авторизации пользователя.

Вам необходимо передать (в качестве параметров инициализации) initConfig или remoteConfigUrl. Если вы передадите оба объектаб то initConfig будет иметь больший приоритет.

Swift
// Если вы планируете использовать внутренний 'CUSTOM' протокол SDK.
TechAdvertising.initialize(options: TechAdvertisingOptions(
    sessionId: "YOUR_SESSION_ID",
    storeUrl: "https://apps.apple.com/us/app/myapp/id12345678",
    initConfig: .init(
        core: .init(
            bannerUrl: "https://YOUR_BANNER_CREATIVE_ENDPOINT",
            productUrl: "https://YOUR_PRODUCT_CREATIVE_ENDPOINT"
        )
    ),
    debugMode: true,
    httpHeaders: [
        "Authorization": "Bearer CUSTOM_AUTH_TOKEN"
    ]
))

// В случае, если вы хотите использовать 'OpenRTB' протокол внутри SDK.
TechAdvertising.initialize(options: TechAdvertisingOptions(
    sessionId: "YOUR_SESSION_ID",
    storeUrl: "https://apps.apple.com/us/app/myapp/id12345678",
    transactionProtocol: .OPEN_RTB(
        publisherId: "YOUR_PUBLISHER_ID", // Optional, set this up here if you have it
        appContentType: .OTHER, // Optional
        appContentProductionQuality: .PROFESSIONALLY_PRODUCED, // Optional
        appContentMediaRating: .ALL_AUDIENCES // Optional
    ),
    initConfig: .init(
        core: .init(
            bannerUrl: "https://YOUR_OPENRTB_ENDPOINT"
        )
    ),
    debugMode: true,
    httpHeaders: [
        "Authorization": "Bearer CUSTOM_AUTH_TOKEN"
    ]
))

// Если ваше приложение инициализирует SDK (в рамках жизненного цикла) после того как,
// пользователь авторизовался, то вы можете выставить уникальный идетификатор
// авторизованного пользователя здесь же после инициализации. В этом случае используйте
// следующую строку как пример.
// В противном случае (рекоммендуемый вариант), если вы инициализируете SDK еще до того
// как получили ID авторизованного пользователя (например в AppDelegate), то удалите строку
// ниже и следуйте нашим рекомендациям из секции 'User (UID)'.
TechAdvertising.shared.uid = "YOUR_AUTHORIZED_USER_ID"
Swift
TechAdvertising.initialize(options: TechAdvertisingOptions)

public struct TechAdvertisingOptions {
    public init(
        sessionId: String,
        storeUrl: String,
        transactionProtocol: TransactionProtocol = .CUSTOM,
        initConfig: InitConfig? = nil,
        remoteConfigUrl: String? = nil,
        debugMode: Bool = false,
        httpHeaders: [String: String] = [:]
    )
}

public class TechAdvertising {
    public var uid: String?
}
  • sessionId - Уникальный идентификатор сессии, который определяет текущую сессию приложения. Мобильное приложение можно отнести к одному из след. типов:

    • Online приложение (ваше приложение использует ваш backend, серверную часть для хранения и доступа к данным) - в этом случае, в качестве значения, используйте ID сессии, которая соответствует сессии на стороне вашей серверной части - это наиболее предпочтительный вариант значения.
    • Offline приложение (ваше приложение не использует ваш собственный backend, все бизнес данные хранятся локально). В этом случае у вас нет никакой сессии на серверной стороне. При таком сценарии, можно использовать сгенерированный UUID в качестве значения. ВАЖНО: UUID значение должно генерироваться один раз на моменте старта приложения и не меняться пока приложение остается в памяти. Вы не должны перегенерировать UUID в течении жизненного цикла приложения. Новое значение допустимо только, после удаления вашего приложения из памяти, после нового рестарта приложения.
  • storeUrl - ссылка на приложение в магазине приложений. Пример: https://apps.apple.com/us/app/myapp/id12345678.

  • transactionProtocol - Транзакционный протокол для получения рекламы (со специфичными инициализационными опциями внутри). Это свойство определяет "Layer-3 Transaction", согласно AdCOM v1.0. SDK поддерживает следующие протоколы:

    • CUSTOM - внутренний 'CUSTOM' протокол (используется по умолчанию).
    • OPEN_RTB - OpenRTB 2.6
      OPEN_RTB(
          publisherId: String? = nil,
          appContentType: RTBContext? = nil,
          appContentProductionQuality: RTBProductionQuality? = nil,
          appContentMediaRating: RTBMediaRating? = nil
      )
      • publisherId - (необязательный) Уникальный идентификатор "издателя".
      • appContentType - (необязательный) Описание контента, который предоставляет ваше приложение (game, video, text, и т.п.). См. List: Content Contexts в AdCOM 1.0.
      • appContentProductionQuality - (необязательный) Качественная характеристика вашего приложения как продукта. См. List: Production Qualities в AdCOM 1.0.
      • appContentMediaRating - (необязательный) Медиа рейтинг согласно IQG. См. List: Media Ratings в AdCOM 1.0.
  • initConfig - (необязательный) InitConfig объект, который может использоваться вместо remoteConfigUrl параметра (см ниже), для инициализации SDK с URL параметрами вниутри вашего кода: Если вы используете оба InitConfig и remoteConfigUrl параметра, имейте ввиду, что InitConfig будет всегда иметь больший приоритет. Это значит, что все значения из вашего InitConfig объекта перезапишут значения, из такого-же объекта полученного с сервера от remoteConfigUrl ендпоинта.

  • remoteConfigUrl - (необязательный) Endpoint URL для получения InitConfig объекта хранимого на сервере. Применяется, когда вы храните и управляете настройками вашего приложения на сервере (RemoteConfig). Пример API ответа в JSON формате:

    JSON
    {
      "core": {
        "bannerUrl": "https://my.server.com/banner_creative",
        "productUrl": "https://my.server.com/product_creative"
      }
    }
  • debugMode - флаг, включающий запись в debug сообщения в log приложения. По умолчанию false.

  • httpHeaders - словарь при помощи которого формируются специфичные заголовки для HTTP запросов. По умолчанию [:].

  • TechAdvertising.shared.uid - (необязательный) - см наши рекоммендации (когда выставлять и когда очищать это значение) в секции User ID (UID).

GEO локация

SDK использует текущую GEO локацию устройства, для улучшения механизмов таргетирования баннерной рекламы. Это значит, что вам (как разработчику), необходимо добавить следующие Privacy свойства в вашем Info.plist файле:

  • NSLocationWhenInUseUsageDescription="Здесь, вы пишите уведомление для пользователя, где объясняете причину почему ваше приложение использует GEO локацию"
  • NSLocationUsageDescription="Здесь, вы пишите уведомление для пользователя, где объясняете причину почему ваше приложение использует GEO локацию"
  • NSLocationAlwaysUsageDescription="Здесь, вы пишите уведомление для пользователя, где объясняете причину почему ваше приложение использует GEO локацию"
  • NSLocationAlwaysAndWhenInUseUsageDescription="Здесь, вы пишите уведомление для пользователя, где объясняете причину почему ваше приложение использует GEO локацию"
  • NSLocationTemporaryUsageDescriptionDictionary="Здесь, вы пишите уведомление для пользователя, где объясняете причину почему ваше приложение использует GEO локацию"

Внимание

В случае, если вы НЕ добавите эти опции внутри вашего Info.plist файла, то SDK не сможет определить GEO локацию (в качестве GEO локации, всегда будет передаваться значение nil в запросах на рекламу). Это значит, что ваше приложение не сможет в полном объеме использовать плюсы таргетирования рекламы по GEO локации.

User ID (UID)

Ваше мобильное приложение может быть:

  • Anonymous (публичное - не требующее для доступа к функционалу авторизации пользователя). Например: любой пользователь, установивший приложение может воспользоваться всем функционалом, без необходимости регистрировать и аккаунт и без необходимости проходить авторизацию для доступа ко всему функционалу вашего приложения.
  • AuthN/AuthZ (пользователь должен иметь аккаунт и пройти авторизацию для доступа к функционалу). Например: При старте приложения, пользователь видит 'Sign-in' форму в которой вводит свой логин / пароль. Пока не пройдет авторизацию, пользователь не может зайти на другие экраны.
  • Комбинированное приложение (часть экранов/функционала доступна пользователю без авторизации, когда как другая часть только после прохождения таковой). Например: Любой не авторизованный пользователь может просматривать каталог продукции, переходить между карточками товаров. Но в случае, если он хочет оформить заказ, то приложение просит пройти авторизацию (Sign-in / Sign-up формы) - и только после этого пользователь сможет заказать товар.

ВАЖНО

Advertising SDK предоставляет TechAdvertising.shared.uid свойство, которое должно заполняться значением уникального идентификатора пользователя, прошедшего авторизацию.

Установите значение этого поля при каждой успешной попытке авторизации пользователя в вашем приложении.

Вы можете ничего не устанавливать в данное поле (полностью его игнорировать), только в одном сценарии: если ваше приложение является Anonymous (публичным) и не требует вообще никакой авторизации пользователей для работы.

Ниже приведен примеры кода в какие моменты и какое значение нужно устанавливать внутри TechAdvertising.shared.uid свойства:

Swift
myAuthService.signIn(username, password) { authSession, error in
    defer {
        TechAdvertising.shared.uid = authSession.success ? authSession.user.id : nil
    }

    if let error = error {
        print("ERROR: Unable to sign-in due error: \(error.localizedDescription)")
        return
    }

    // Здесь вы выполняете бизнес логику, специфичную для вашего приложения, когда пользователь
    // успешно прошел авторизацию.
    // Например: Переход на 'Главный' экран, или навигация в 'Корзину' для оформления заказа и т.п.
}
Swift
public class TechAdvertising {
    public var uid: String?
}
  • uid - (необязательный) Уникальный идентификатор пользователя, прошедшего успешную авторизацию внутри вашего приложения.

Показ баннерной рекламы

SDK предоставляет функционал по отображению, следующих видов рекламного контента в виде баннеров:

HTML Banner

Рекламный креатив, использующий для отображения рекламы в своей основе HTML контент. Для показа данного типа креатива в SDK используются браузерные механизмы рендеринга HTML (WebKit > WKWebView). Такая реализация подразумевает, что внутрь CreativeView иерархии добавляется HTML страница, которая и представляет собой рекламный контент. Например, в качестве баннера вы можете отобразить форму-опросник для пользователей, которая будет иметь элементы управления, визуальные эффекты и дополнительную логику, выполняемую посредством JavaScript.

Image Banner

Рекламный креатив, использующий для отображения рекламы ссылку на картинку. Является легковестной версией баннера для отображения рекламного контента в виде простой картинки, что влечет большую производительность при показе рекламы и меньшие задержки на рендеринг контента.

Media Banner (video, audio)

Для отображения медиа (видео, аудио) рекламного контента в вашем приложении. Данный типа креатива базируется на VAST спецификации.

Выполните следующие шаги для загрузки и отображения рекламного контента баннера:

  1. Добавьте CreativeView в ваш UI layout, представляющий экран приложения, отдельную view, форму и т.п.:
Markdown
- Добавьте `CreativeView` внутри вашего storyboard(xib), описывающего ваш экран приложения (view).

- Соедините `creativeView` с соответствующим `@IBOutlet` полем вашего view котроллера

- Добавьте `creative` поле внутри вашего view контроллера, например:

  class MyViewController: UIViewController {
      @IBOutlet weak var creativeView: CreativeView!

      private var creative: Creative!
  }
Swift
class MyViewController: UIViewController {
    private var creative: Creative!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Создадим и добавим creative view к нашему layout.
        //
        // Вы также можете импользовать CreativeView(frame: CGRect) конструктор, если хотите явно указать
        // размер и позицию вашего баннера на экране.
        // let creativeView = CreativeView(frame: CGRect(x: 0, y: 0, width: 640, height: 480))
        let creativeView = CreativeView()
        superview.addSubview(creativeView)
        creativeView.translatesAutoresizingMaskIntoConstraints = false

        // Здесь, мы назначим constraints для creativeView внутри вашего layout.
        . . .

        // Опционально, вы можете отключить адаптивный UI баннера, используя след. свойства.
        creativeView.isScrollEnabled = true // По умолчанию 'false'
        creativeView.scaleToFit = false     // По умолчанию 'true'
    }
}
  1. Зададим параметры запроса для CreativeView, используя CreativeQuery:
Swift
class MyViewController: UIViewController {

    @IBOutlet weak var creativeView: CreativeView!

    private var creative: Creative!

    override func viewDidLoad() {
        super.viewDidLoad()

        . . .

        // В случае использования 'CUSTOM' протокола, используйте следующий пример запроса
        creativeView.query = CreativeQuery(
            // ВНИМАНИЕ: Placement ID обязателен при инициализации 'CUSTOM' протокола
            placementId: "YOUR_PLACEMENT_ID",
            sizes: [SizeEntity(width: 260, height: 106)],
            floorPrice: 2.0,
            currency: "RUB",
            customParams: [
                "skuId": "LG00001",
                "skuName": "Leggo bricks (speed boat)",
                "category": "Kids",
                "subCategory": "Lego",
                "gdprConsent": "CPsmEWIPsmEWIABAMBFRACBsABEAAAAgEIYgACJAAYiAAA.QRXwAgAAgivA",
                "ccpa": "1YNN",
                "coppa": "1"
            ]
        )
        
        // В случае 'OpenRTB', используйте этот пример
        creativeView.query = CreativeQuery(
            // ВНИМАНИЕ: `placementId` не нужен при использовании 'OpenRTB' протокола.
            sizes: [SizeEntity(width: 260, height: 106)],
            
            // ВНИМАНИЕ: `markupType` рекомедован в случае 'OpenRTB' протокола.
            // Установите одно из значений `.BANNER`, `.VIDEO`, `.AUDIO` or `.NATIVE` в вашем запросе.
            markupType: .BANNER,
            
            floorPrice: 2.0,
            currency: "RUB",
            customParams: [
                "skuId": "LG00001",
                "skuName": "Leggo bricks (speed boat)",
                "category": "Kids",
                "subCategory": "Lego",
                "gdprConsent": "CPsmEWIPsmEWIABAMBFRACBsABEAAAAgEIYgACJAAYiAAA.QRXwAgAAgivA",
                "ccpa": "1YNN",
                "coppa": "1"
            ]
        )
    }
}
  1. Создадим Creative контроллер для управления и загрузки баннера.
Swift
class MyViewController: UIViewController {

    @IBOutlet weak var creativeView: CreativeView!

    private var creative: Creative!

    override func viewDidLoad() {
        super.viewDidLoad()

        . . .

        // Инициализация Creative
        self.creative = .init(creativeViews: [creativeView])
        self.creative.delegate = self
    }
}
  1. Вызовите метод load() у созданного экземпляра Creative
Swift
class MyViewController: UIViewController {

    @IBOutlet weak var creativeView: CreativeView!

    private var creative: Creative!

    override func viewDidLoad() {
        super.viewDidLoad()

        . . .

        // Произведем загрузку баннера
        self.creative.load()
    }
}
  1. Для обратной связи (о ходе загрузки и работы баннера), используйте CreativeDelegate протокол.
Swift
class MyViewController: UIViewController {

    @IBOutlet weak var creativeView: CreativeView!

    private var creative: Creative!

    override func viewDidLoad() {
        super.viewDidLoad()

        . . .

        // Укажем, что view  контроллер будет принимать callback вызовы от Creative контроллера
        self.creative.delegate = self
    }
}

extension MyViewController: CreativeDelegate {

    public func onLoadDataSuccess(creativeView: CreativeView) {
        let placementId = creativeView.query?.placementId
        print("Creative.onLoadDataSuccess[\(String(describing: placementId))]")
    }

    public func onLoadDataFail(creativeView: CreativeView, error: Error) {
        let placementId = creativeView.query?.placementId
        print("Creative.onLoadDataFail[\(String(describing: placementId))]: \(error.localizedDescription)")
    }

    public func onLoadContentSuccess(creativeView: CreativeView) {
        let placementId = creativeView.query?.placementId
        print("Creative.onLoadContentSuccess[\(String(describing: placementId))]")
    }

    public func onLoadContentFail(creativeView: CreativeView, error: Error) {
        let placementId = creativeView.query?.placementId
        print("Creative.onLoadContentFail[\(String(describing: placementId))]: \(error.localizedDescription)")
    }

    public func onNoAdContent(creativeView: CreativeView) {
        let placementId = creativeView.query?.placementId
        print("Creative.onNoAdContent[\(String(describing: placementId))]")
    }

    public func onClose(creativeView: CreativeView) {
        let placementId = creativeView.query?.placementId
        print("Creative.onClose[\(String(describing: placementId))]")
    }
}

Показ динамических списков

Если вы планируете использовать динамические списки баннеров внутри вашего приложения, на базе UICollectionViewController, UICollectionViewCell и dequeueReusableCell, мы настоятельно рекомендуем использовать следующий подготовленный пример кода в качестве шаблона: SingleCollectionCreativeViewController.swift

Это позволит вам:

  • Упразднить преждевременную загрузку баннеров, до которых пользователь еще не промотал.
  • Добиться плавности прокрутки таких списков.
  • Минимизировать риски утечки памяти.

Показ товарных креативов

Товарный креатив - специальный тип рекламного креатива для RetailMedia платформ, использующий в своей основе SKU идентификатор товара в RetailMedia платформе. SDK на своей стороне в данном случае не производит рендеринг рекламного контента и выполнение функционала трекинга и переходов на посадочную страницу. В данном типе креатива это зона отвественности разработчика. Получив ответ от SDK со списком креативов и их SKU, разработчик формирует отображение рекламного контент на основе уже существующих картинок товаров в платформе по этим SKU, в соответствии с внутренними шаблонам и стилями, обеспечивая вызов необходимых трекинг событий.

Swift
class MyViewController: UIViewController {

    private var productCreative: ProductCreative!

    override func viewDidLoad() {
        super.viewDidLoad()
        . . .
        // Let's setup product creative
        self.productCreative = ProductCreative(query: ProductCreativeQuery(
            placementId: "YOUR_PLACEMENT_ID",
            customParams: [
                "skuId": "LG00001",
                "skuName": "Leggo bricks (speed boat)",
                "category": "Kids",
                "subCategory": "Lego",
                "gdprConsent": "CPsmEWIPsmEWIABAMBFRACBsABEAAAAgEIYgACJAAYiAAA.QRXwAgAAgivA",
                "ccpa": "1YNN",
                "coppa": "1"
            ]
        ))
        self.productCreative.delegate = self
    }

    @IBAction func onRequestButtonClick(_ sender: Any) {
        self.productCreative.load()
    }
}

extension MyViewController: ProductCreativeDelegate {

    public func onNoAdContent(query: ProductCreativeQuery) {
        let placementId = query.placementId
        print("Product.onNoAdContent[\(String(describing: placementId))]")
    }

    func onLoadDataSuccess() {
        print("Product.onLoadDataSuccess")
    }

    func onLoadDataFail(error: Error) {
        print("Product.onLoadDataFail: \(error.localizedDescription)")
    }

    func onLoadContentSuccess(entity: ProductCreativeEntity) {
        print("Product.onLoadContentSuccess: \(String(describing: entity))")
    }

    func onLoadContentFail(query: ProductCreativeQuery, error: Error) {
        print("Product.onLoadContentFail[\(query.placementId)]: \(error.localizedDescription)")
    }
}

Вспомогательные классы

InitConfig

Объект для инициализации SDK. Содержит в себе url-ы endpoint-ов, для получения различных видов рекламных креативов.

Swift
public struct InitConfig {
    public init(core: InitConfigCoreEntity? = nil)
}
  • core - (необязательный) Core параметры для инициализации SDK. URl-ы для получения основных типов рекламных креативов (см InitConfigCoreEntity)

InitConfigCoreEntity

URl-config for common ad creatives

Swift
public struct InitConfigCoreEntity {
    public init(
        bannerUrl: String? = nil,
        productUrl: String? = nil
    )
}
  • bannerUrl - (необязательный) URL для получения баннерного креатива.
  • productUrl - (необязательный) URL для получения товарного креатива

CreativeView

View контейнер, используемый для отображения баннерной рекламы внутри (HTML Banner, Image Banner, Media Banner). Вся внутренняя UI иерархия создается автоматически, базируясь на типе рекламного креатива, полученного в ответе от сервера.

Swift
public class CreativeView: UIView {
    public var query: CreativeQuery?
    public var scaleToFit: Bool = true
    public var isScrollEnabled: Bool = false

    public override init(frame: CGRect)
    public required init?(coder: NSCoder)
}
  • isScrollEnabled - включает или отключает возможность вертикального и горизонтального. По умолчанию false. скролинга HTML контента внутри фрэйма CreativeView. Например: если вы используете интерактивную форму в виде HTML контента, но вразмер баннера внутри вашего мобильного приложения имеет меньший размер для отображения всего HTML. В этом случае, вы можете включить данную опцию, для предоставления пользователю возможности прокручивать весь контент. внутри CreativeView фрэйма.

    NOTICE

    isScrollEnabled свойство имеет эффект только для HTML баннера.

  • scaleToFit - данная опция подстраивает размер полученного баннера к aspect ratio фрэйма, который установлен у CreativeView. По умолчанию true.

  • query - (необязательный) - Критерий запроса на получение баннерной рекламы. Усановите этот критерий до вызова функции загрузки. Если вы оставите значение как nil то Creative контроллер будет игнорировать эту view в процессе загрузки. Подробнее см. CreativeQuery

Контроллер для управления баннерными креативами.

Swift
public class Creative {

    public weak var delegate: CreativeDelegate?

    public convenience init(creativeView: CreativeView)

    public init(creativeViews: [CreativeView])

    public func load(path: String = "")
}
  • init(creativeView: CreativeView) - конструктор контроллера, управляющего одним UI компонентом: CreativeView.
  • init(creativeViews: [CreativeView]) - (multiple impressions) конструктор контроллера, управляющего коллекцией UI компонентов: CreativeView.
    • creativeView - CreativeView UI контейнер, используется для отображения рекламного контента, полученного от сервера.
    • creativeViews - коллекция CreativeView UI компонентов.
  • delegate - (необязательный) CreativeDelegate callback обработчик событий процесса загрузки и жизненного цикла работы баннера(ов).
  • load() - метод для запуска загрузки (и дальнейшего показа) баннера(ов), которыми проинициализирован контроллер.
    • path - путь, который будет добавлен к endpoint URL, откуда запрашиваются баннеры. По умолчанию "".

FullscreenCreativeViewController

Контроллер, предназначенный для отображения баннерной рекламы в модальном fullscreen режиме.

Swift
class SingleFullscreenCreativeViewController: UIViewController {

    private var fullscreenVC: FullscreenCreativeViewController!
    
    override func viewDidLoad() {
        let vc = FullscreenCreativeViewController()
        vc.delegate = self
        self.fullscreenVC = vc
    }
    
    @IBAction func onButtonClick(_ sender: Any) {
        self.fullscreenVC.query = CreativeQuery(
            placementId: "YOUR_PLACEMENT_ID",
            sizes: [SizeEntity(width: 260, height: 106)],
            customParams: [
                "skuId": "LG00001",
                "skuName": "Leggo bricks (speed boat)",
                "category": "Kids",
                "subCategory": "Lego",
                "gdprConsent": "CPsmEWIPsmEWIABAMBFRACBsABEAAAAgEIYgACJAAYiAAA.QRXwAgAAgivA",
                "ccpa": "1YNN",
                "coppa": "1"
            ]
        )
        self.present(fullscreenVC, animated: true)
    }
}

// MARK: - CreativeDelegate

extension SingleFullscreenCreativeViewController: CreativeDelegate {

    public func onLoadDataSuccess(creativeView: CreativeView) {
        let placementId = creativeView.query?.placementId
        print("onLoadDataSuccess[\(placementId ?? "")]")
    }

    public func onLoadDataFail(creativeView: CreativeView, error: Error) {
        let placementId = creativeView.query?.placementId
        print("onLoadDataFail[\(placementId ?? "")]: \(error.localizedDescription)")
    }

    public func onLoadContentSuccess(creativeView: CreativeView) {
        let placementId = creativeView.query?.placementId
        print("onLoadContentSuccess[\(placementId ?? "")]")
    }

    public func onLoadContentFail(creativeView: CreativeView, error: Error) {
        let placementId = creativeView.query?.placementId
        print("onLoadContentFail[\(placementId ?? "")]: \(error.localizedDescription)")

        fullscreenVC.dismiss(animated: true)
    }

    public func onNoAdContent(creativeView: CreativeView) {
        let placementId = creativeView.query?.placementId
        print("onNoAdContent[\(placementId ?? "")]")

        fullscreenVC.dismiss(animated: true)
    }

    public func onClose(creativeView: CreativeView) {
        let placementId = creativeView.query?.placementId
        print("onClose[\(placementId ?? "")]")

        fullscreenVC.dismiss(animated: true)
    }
}
Swift
public class FullscreenCreativeViewController: UIViewController {

    public var query: CreativeQuery?

    public var path = ""

    public weak var delegate: CreativeDelegate?
    
    public init()
    
    public required init?(coder: NSCoder)
  • init(), init?(coder: NSCoder) - стандартные конструкторы, наследуемые из UIViewController.
  • query - (необязательный) - Критерий запроса на получение баннерной рекламы. Усановите этот критерий до вызова функции загрузки. Если вы оставите значение как nil то Creative контроллер будет игнорировать эту view в процессе загрузки. Подробнее см. CreativeQuery
  • delegate - (необязательный) CreativeDelegate callback обработчик событий процесса загрузки и жизненного цикла работы баннера(ов).
  • path - путь, который будет добавлен к endpoint URL, откуда запрашиваются баннеры. По умолчанию "".

CreativeDelegate

Обработка событий показа рекламного баннера происходит через обработчик протокола CreativeDelegate.

Swift
@objc public protocol CreativeDelegate: AnyObject {
    @objc optional func onLoadDataSuccess(creativeView: CreativeView)
    @objc optional func onLoadDataFail(creativeView: CreativeView, error: Error)

    @objc optional func onLoadContentSuccess(creativeView: CreativeView)
    @objc optional func onLoadContentFail(creativeView: CreativeView, error: Error)

    @objc optional func onNoAdContent(creativeView: CreativeView)

    @objc optional func onClose(creativeView: CreativeView)
}
  • onLoadDataSuccess - (необязательный) запрос к рекламному серверу прошел успешно, начали загружать контент креатива;
  • onLoadDataFail - (необязательный) ошибка при запросе к рекламному серверу;
  • onLoadContentSuccess - (необязательный) креатив успешно загружен;
  • onLoadContentFail - (необязательный) ошибка при загрузке креатива;
  • onNoAdContent - (необязательный) сервер вернул 204 HTTP код на ваш запрос;
  • onClose - (необязательный) пользователь закрыл view просмотра рекламы.

CreativeQuery

Критерий для запроса баннерного креатива.

swift
public struct CreativeQuery {
    public var placementId: String
    public var sizes: [SizeEntity]
    public var markupType: MarkupType?
    public var floorPrice: Double?
    public var currency: String?
    public var customParams: [String: String]

    public init(
        placementId: String = "",
        sizes: [SizeEntity],
        markupType: MarkupType? = nil
        floorPrice: Double? = nil,
        currency: String? = nil,
        customParams: [String: String] = [:]
    )
}
  • placementId - идентификатор рекламного места. Установите это поле в вашем запросе, если используется 'CUSTOM' протокол SDK. Пример: 123456. Пропустите (не устанавливайте), в случае 'OpenRTB' протокола.
  • sizes - список допустимых размеров для баннера. По умолчанию []. Пример: [SizeEntity(width: 260, height: 106)].
  • markupType - (необязательный) Тип рекламного креатива (.BANNER, .VIDEO, .AUDIO, .NATIVE). Рекомендованно, если вы используете 'OpenRTB' протокол. Здесь вы определяете какой тип креатива вы ожидаете получить от сервера.
  • floorPrice - (необязательный) минимальная цена показа.
  • currency - (необязательный) валюта.
  • customParams - дополнительные параметры, которые можно передать в запросе на загрузку рекламного контента. По умолчанию [:].

Size

Объект, описывающий размер места размещения. При инициализации принимает два целых числа соответствующих ширине и высоте места размещения в пикселях.

Swift
SizeEntity(width: 300, height: 250)
Swift
public struct SizeEntity {
    public let width: Int
    public let height: Int
}
  • width - Ширина в пикселях. Пример: 300
  • height - Высота в пикселях. Пример: 250

ProductCreative

Controller to load (to manage) product creatives.

Swift
public class ProductCreative {

    public weak var delegate: ProductCreativeDelegate?

    public convenience init(query: ProductCreativeQuery)

    public init(queries: [ProductCreativeQuery])

    public func load(path: String = "")
}
  • init(query: ProductCreativeQuery) - конструктор контроллера, управляющего одним продуктовым креативом. См. ProductCreativeQuery.
  • init(queries: [ProductCreativeQuery]) - (multiple impressions) конструктор контроллера, управляющего коллекцией продуктовых креативов. См. ProductCreativeQuery.
  • delegate - (необязательный) ProductCreativeDelegate callback обработчик событий процесса загрузки и работы продукт(ов).
  • load() - метод для запуска загрузки (и дальнейшего показа) продукта(ов), запросами которых проинициализирован контроллер.
    • path - путь, который будет добавлен к endpoint URL, откуда запрашиваются продуктовые креативы. По умолчанию "".

ProductCreativeQuery

Критерий для запроса продуктового креатива.

Swift
public struct ProductCreativeQuery {
    public var placementId: String
    public var customParams: [String: String]

    public init(placementId: String, customParams: [String: String] = [:]) {
        self.placementId = placementId
        self.customParams = customParams
    }
}
  • placementId - идентификатор рекламного места.
  • customParams - дополнительные параметры, которые можно передать в запросе на получение рекламного контента. По умолчанию [:].

ProductCreativeDelegate (#product_creative_delegate)

Swift
public protocol ProductCreativeDelegate: AnyObject {
    func onLoadDataSuccess()
    func onLoadDataFail(error: Error)
    func onLoadContentSuccess(entity: ProductCreativeEntity)
    func onLoadContentFail(query: ProductCreativeQuery, error: Error)
    func onNoAdContent(query: ProductCreativeQuery)
}
  • onLoadDataSuccess - запрос к рекламному серверу прошел успешно, начали загружать контент креатива;
  • onLoadDataFail - ошибка при запросе к рекламному серверу;
  • onLoadContentSuccess - креатив успешно загружен; См. ProductCreativeEntity;
  • onLoadContentFail - ошибка при загрузке креатива; См. ProductCreativeQuery;
  • onNoAdContent - сервер вернул 204 HTTP код на ваш запрос;

ProductCreativeEntity

Swift
public struct ProductCreativeEntity {
    public let requestId: String
    public let placementId: String
    public var sku: String
    public var disclaimer: String?
    public var externalId: String
    public var tracking: ProductCreativeTrackingEntity?
    public var advertiser: String?
}
  • requestId - id запроса
  • placementId - идентификатор рекламного места.
  • sku - уникальный идентификатор товара
  • disclaimer - (необязательный) письменный отказ от ответственности либо об ограничении ответственности при публикации рекламного контента
  • externalId - уникальный внешний идентификатор рекламного объявления
  • tracking - (необязательный) объект, содержащий URLs для трекинга событий ProductCreativeTrackingEntity
  • advertiser - (необязательный) рекламодатель, который предоставляет креатив

ProductCreativeTrackingEntity

Объект, включающий в себя списки tracking urls, которые необходимо вызвать в вашем коде, для соответствующих событий.

Swift
public struct ProductCreativeTrackingEntity {
    public var impression: [String] = []
    public var click: [String] = []
    public var view: [String] = []
}
  • click - список URLs для трекинга событий клика. По умолчанию [].
  • impression - список URLs для трекинга событий показа. По умолчанию [].
  • view - список URLs для трекинга событий показа в области видимости. По умолчанию [].