Документация iOS Интеграция

iOS Integration

Руководство по интеграции рекламы для iOS приложений

1 Обзор API

OMNIBOX предоставляет легкий метод интеграции без SDK для iOS приложений. Все запросы рекламы выполняются через простой HTTP GET запрос, а реклама рендерится с помощью стандартного WKWebView или нативных видеоплееров.

Базовый эндпоинт

HTTPS
https://omnibox.digital/ads/direct

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

Параметр Тип Статус Описание
plc String Required Placement ID. Уникальный идентификатор рекламного места.
w Int Required Ширина слота в пикселях.
h Int Required Высота слота в пикселях.
cb Long Required Cache Buster (timestamp) для предотвращения кэширования.
t String Conditional Тип контента.
• Опустить для WebView/HTML
app для VAST/MP4 (In-Stream)

App Transport Security (ATS)

Убедитесь, что ваш Info.plist разрешает загрузку с произвольных ресурсов (arbitrary loads), если вы показываете рекламу с источников без HTTPS. OMNIBOX по умолчанию поддерживает HTTPS.

Info.plist
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

2 Дисплейная реклама

Формат
HTML/JS based
Интеграция
WKWebView

Реализация (Swift)

Swift
import UIKit
import WebKit

class BannerViewController: UIViewController, WKNavigationDelegate {
    
    var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 1. Конфигурация WebView
        let config = WKWebViewConfiguration()
        config.allowsInlineMediaPlayback = true
        config.mediaTypesRequiringUserActionForPlayback = [] 
        
        let rect = CGRect(x: 20, y: 100, width: 300, height: 250)
        webView = WKWebView(frame: rect, configuration: config)
        webView.navigationDelegate = self
        webView.isOpaque = false
        webView.backgroundColor = .clear
        webView.scrollView.isScrollEnabled = false
        
        self.view.addSubview(webView)
        
        // 2. Создание URL
        let plc = "ios_banner_300x250"
        let cb = Int(Date().timeIntervalSince1970)
        
        if let url = URL(string: "https://omnibox.digital/ads/direct?plc=\(plc)&w=300&h=250&cb=\(cb)") {
            webView.load(URLRequest(url: url))
        }
    }
    
    // 3. Обработка кликов
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, 
                 decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        
        if let url = navigationAction.request.url {
            if !url.absoluteString.contains("omnibox.digital") {
                UIApplication.shared.open(url)
                decisionHandler(.cancel)
                return
            }
        }
        decisionHandler(.allow)
    }
}

3 Interstitial Реклама

Важно: Кнопка закрытия

HTML контент не может закрыть нативный iOS ViewController. Вы должны реализовать нативную кнопку (UIButton) для закрытия рекламы.

Swift
// Настройка WKWebView на весь экран
webView = WKWebView(frame: view.bounds, configuration: config)

// Кнопка закрытия
closeButton = UIButton(type: .system)
closeButton.setTitle("✕", for: .normal)
closeButton.frame = CGRect(x: view.bounds.width - 60, y: 50, width: 40, height: 40)
closeButton.addTarget(self, action: #selector(closeAd), for: .touchUpInside)

4 In-Stream Видео (IMA SDK)

Обязательный параметр t=app

Добавьте &t=app к URL. Это вернет чистый VAST Wrapper (MP4), совместимый с нативными приложениями.

Swift
requestAds() {
    // 1. Создание URL тега (t=app)
    let cb = Int(Date().timeIntervalSince1970)
    let adTagUrl = "https://omnibox.digital/ads/direct?plc=video_preroll&w=1920&h=1080&t=app&cb=\(cb)"
    
    // 2. Создание запроса
    let adDisplayContainer = IMAAdDisplayContainer(adContainer: self.view, viewController: self)
    let request = IMAAdsRequest(adTagUrl: adTagUrl, 
                                adDisplayContainer: adDisplayContainer, 
                                contentPlayhead: nil, 
                                userContext: nil)
    
    adsLoader.requestAds(with: request)
}

5 In-Stream Видео (Кастомные плееры)

Для плееров без поддержки IMA SDK, действуйте как VAST Client: парсите XML и воспроизводите видео вручную.

1 Логика Парсинга

  • Wrapper: Если корневой тег <Wrapper>, извлеките URL из <VASTAdTagURI> и сделайте новый запрос.
  • InLine (Финал): В этом теге ищите <MediaFile> (MP4) для воспроизведения и <TrackingEvents> для аналитики.

Трекинг Событий

Событие XML Тег Когда вызывать
Impression <Impression> Первый кадр
Start event="start" Начало воспроизведения
Complete event="complete" Завершение видео