OMNIBOX iOS SDK

Prebid Mobile SDK 3.3.1 va SwiftUI yordamida iOS ilovalarga banner reklamani integratsiya qilish.

Arxitektura

┌─────────────────────────────────────────────────────┐
│  ContentView (SwiftUI)                              │
│    └─ IABoxBanner (UIViewRepresentable)             │
│         └─ IABoxBannerContainerView (UIView)        │
│              ├─ BannerView (Prebid) — bid request   │
│              └─ WKWebView — rendering HTML creative │
└─────────────────────────────────────────────────────┘
  1. PrebidMobile.BannerView sends an OpenRTB bid request to Prebid Server
  2. Server returns bid response with HTML/JS creative (adm)
  3. WKWebView renders the received adm
Why WKWebView instead of PrebidMobile built-in renderer?
The OMNIBOX server returns HTML/JS creative with its own SDK (adboxsdk.new.js) containing event tracking in JavaScript, not at the OpenRTB protocol level. The built-in PrebidMobile renderer expects event trackers in OpenRTB format (burl, eventtrackers), so it cannot render such creative. WKWebView renders HTML as-is.

Talablar

  • iOS 14.0+
  • Xcode 15.0+
  • Swift 5.9+

O'rnatish

1. Prebid Mobile SDK ni qo'shish

PrebidMobile — Prebid.org dan uchinchi tomon open-source paketi, GitHub da joylashgan.

Xcode da: File → Add Package Dependencies, URL ni kiriting:

https://github.com/prebid/prebid-mobile-ios

Faqat tanlang:

  • PrebidMobile
PrebidMobileAdMobAdapters, PrebidMobileGAMEventHandlers, PrebidMobileMAXAdapters ni qo'shmang — ular standalone rejimida kerak emas va Google Mobile Ads SDK ni tortadi.

2. Parametrlarni sozlash

IABoxBannerView.swift faylida akkaunt parametrlaringizni ko'rsating:

let bannerConfigID = "test_banner"              // Config ID placement
let accountID = "com.iabox.ios-sdk-test-1"      // Account ID
let serverURL = "https://ia.box/ads/prebid"     // Prebid Server URL

3. App Tracking Transparency (IDFA)

Haqiqiy deviceId (IDFA) ni reklama serveriga uzatish uchun foydalanuvchidan App Tracking Transparency orqali ruxsat olish kerak.

Ruxsatsiz server haqiqiy identifikator o niga 00000000-0000-0000-0000-000000000000 oladi.

ATT va SDK ishga tushirish mustaqil jarayonlar. SDK ni istalgan vaqtda ishga tushirish mumkin.

1-qadam. Info.plist ga tavsif qo'shing

In Build Settings of the project (or directly in Info.plist) add key NSUserTrackingUsageDescription:

<key>NSUserTrackingUsageDescription</key>
<string>This identifier is used to deliver personalized ads.</string>

Or via Xcode Build Settings:

INFOPLIST_KEY_NSUserTrackingUsageDescription = "This identifier is used to deliver personalized ads."

2-qadam. Kodda ruxsat so'rang

ATT so'rovi UI paydo bo'lgandan keyin chaqirilishi kerak — aks holda tizim dialogi ko'rsatilmaydi.

Variant A — scenePhase (SwiftUI uchun tavsiya etiladi)

Sahna .active ga o'tganda so ov. Ilova oynasi allaqachon ko'rsatilganligini kafolatlaydi:

import AppTrackingTransparency
import AdSupport

@main
struct MyApp: App {
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { phase in
            if phase == .active {
                if ATTrackingManager.trackingAuthorizationStatus == .notDetermined {
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                        ATTrackingManager.requestTrackingAuthorization { _ in }
                    }
                }
            }
        }
    }
}
Muhim: applicationDidBecomeActive SwiftUI scene-based ilovalarda chaqirilmaydi. scenePhase dan foydalaning.
Variant B — UIKit AppDelegate

UIKit ilovalari uchun (scene lifecycle siz):

class AppDelegate: UIResponder, UIApplicationDelegate {
    func applicationDidBecomeActive(_ application: UIApplication) {
        if ATTrackingManager.trackingAuthorizationStatus == .notDetermined {
            ATTrackingManager.requestTrackingAuthorization { _ in }
        }
    }
}

ATT statusiga qarab xulq-atvor

ATT statusIDFATavsif
.authorizedReal UUIDShaxsiylashtirilgan reklama
.denied00000000-...Kontekstual reklama
.restricted00000000-...Kontekstual reklama
.notDetermined00000000-...Ruxsat so'rash kerak
Simulyatorda sinash: ATT dialogini qayta ko'rsatish uchun ilovani simulyatordan o'chirib, qayta ishga tushiring.

4. Yig'ish va ishga tushirish

Loyihani yig'ing va ishga tushiring: Cmd+R

Loyiha tuzilishi

ios-sdk-test/
├── ios-sdk-test/
│   ├── ios_sdk_testApp.swift         # Entry point (SwiftUI App)
│   ├── ContentView.swift             # UI with banner load buttons
│   ├── IABoxBannerView.swift         # Prebid + WKWebView wrapper
│   └── Assets.xcassets/              # Resources
├── ios-sdk-test.xcodeproj/           # Xcode project
└── README.md

Integratsiya qanday ishlaydi

1. SDK ni ishga tushirish

Prebid.shared.prebidServerAccountId = accountID
Prebid.shared.timeoutMillis = 10000
Prebid.shared.shareGeoLocation = true

try? Prebid.initializeSDK(serverURL: serverURL) { status, error in
    // Handle initialization result
}
initializeSDK {serverURL}/status ni tekshiradi. Agar bu endpoint sozlanmagan bo'lsa (404) — bu muhim emas, bid requests baribir /openrtb2/auction ga yuboriladi.

2. Bid Request

let bannerView = BannerView(
    frame: CGRect(origin: .zero, size: adSize),
    configID: configID,
    adSize: adSize
)
bannerView.delegate = self
bannerView.loadAd()  // → POST {serverURL}/openrtb2/auction

3. WKWebView da kreativni render qilish

Bid response qabul qilinganda, adm (HTML-kreativ) ajratib olinadi va WKWebView ga yuklanadi:

func bannerView(_ bannerView: BannerView, didReceiveAdWithAdSize adSize: CGSize) {
    if let adm = bannerView.lastBidResponse?.winningBid?.adm {
        renderAdm(adm)  // Loads HTML into WKWebView
    }
}

4. SwiftUI o'rami

struct IABoxBanner: UIViewRepresentable {
    @ObservedObject var viewModel: BannerViewModel
    let configID: String
    let adSize: CGSize
    var onStatusUpdate: ((String) -> Void)?

    func makeUIView(context: Context) -> IABoxBannerContainerView { ... }
    func updateUIView(_ uiView: IABoxBannerContainerView, context: Context) { ... }
}

5. Kliklarni qayta ishlash

Reklama kliklari WKNavigationDelegate va WKUIDelegate orqali qayta ishlanadi. havolalari decidePolicyFor da ushlanadi va Safari da ochiladi. JS dan window.open() createWebViewWith da ushlanadi va Safari da ochiladi.

Server javobi formati (adm)

OMNIBOX server HTML/JS kreativni qaytaradi. Hodisalarni kuzatish (impression, click, viewability) adboxsdk.new.js ichida WebView tomonida amalga oshiriladi.

<script src="https://dcdn.adbox.ru/adboxsdk.new.js" async></script>
<script>
    window.AdBox.push({
        "format": "simple",
        "srcType": "url",
        "src": "https://ia.box/ads/markup?bid=...&imp=...",
        "target": "#slot-...",
        "size": {"w": 300, "h": 250},
        "track": {
            "impression": ["https://ia.box/track/impression?..."],
            "click": ["https://ia.box/track/click?..."],
            "view": ["https://ia.box/track/viewable?..."],
            "load": ["https://ia.box/track/loaded?..."],
            "error": ["https://ia.box/track/error?..."]
        }
    })
</script>
<div id="slot-..."></div>

Muammolarni hal qilish

No such module 'PrebidMobile'

Swift Package qo'shilganligini tekshiring: Project → Package Dependencies. Faqat PrebidMobile qo'shilganligiga ishonch hosil qiling, qo'shimcha adapterlarsiz.

SDK status check failed

/status endpoint serverda sozlanmagan — bu qabul qilinadi. Bid requests /openrtb2/auction orqali ishlaydi.

Creative model must be provided with event tracker

PrebidMobile ichki rendereridan log — e'tiborsiz qoldirish mumkin. Kreativ WKWebView orqali render qilinadi, ichki rendererni aylanib o'tib.

The Google Mobile Ads SDK was initialized without an application ID

Qo'shimcha paketlar qo'shilgan (PrebidMobileAdMobAdapters va boshqalar). Ularni olib tashlang, faqat PrebidMobile ni qoldiring.

deviceId = 00000000-0000-0000-0000-000000000000

Foydalanuvchi kuzatishga ruxsat bermagan (ATT). Info.plist da NSUserTrackingUsageDescription ni tekshiring. ATTrackingManager.requestTrackingAuthorization UI paydo bo'lgandan keyin chaqirilishiga ishonch hosil qiling. Simulyatorda: ilovani o'chirib, qayta ishga tushiring.

Banner ko'rsatilmaydi

Xcode Console loglarida loadBanner(), Bid received, Rendering adm xabarlarini tekshiring. configID serverda mavjudligiga ishonch hosil qiling. Server mavjudligini tekshiring: curl https://ia.box/ads/prebid/openrtb2/auction

← Android SDK Flutter SDK →