1 Обзор API
OMNIBOX предоставляет легкий метод интеграции без SDK для iOS приложений. Все запросы рекламы выполняются через простой HTTP GET запрос, а реклама рендерится с помощью стандартного WKWebView или нативных видеоплееров.
Базовый эндпоинт
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.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2 Дисплейная реклама
Реализация (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) для закрытия рекламы.
// Настройка 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),
совместимый с нативными приложениями.
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" |
Завершение видео |