OMNIBOX iOS SDK Swift

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

Arxitektura

┌─────────────────────────────────────────────────────┐
│  ContentView (SwiftUI)                              │
│    └─ IABoxBanner (UIViewRepresentable)             │
│         └─ IABoxBannerContainerView (UIView)        │
│              ├─ BannerView (Prebid) — bid request   │
│              └─ WKWebView — rendering HTML creative │
└─────────────────────────────────────────────────────┘
  1. PrebidMobile.BannerView Prebid Serverga OpenRTB bid so'rovini yuboradi
  2. Server bid javobini HTML/JS kreativ (adm) bilan qaytaradi
  3. WKWebView qabul qilingan adm ni render qiladi
Nima uchun WKWebView o'rnatilgan PrebidMobile renderer o'rniga?
OMNIBOX server HTML/JS kreativni o'z SDKsi (adboxsdk.new.js) bilan qaytaradi, bunda hodisalarni JavaScript darajasida kuzatish amalga oshiriladi, OpenRTB protokol darajasida emas. O'rnatilgan PrebidMobile renderer hodisa kuzatuvchilarini OpenRTB formatida (burl, eventtrackers) kutadi, shuning uchun u bunday kreativni render qila olmaydi. WKWebView HTML ni o'z holicha render qiladi.

Talablar

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

O'rnatish

1. Prebid Mobile SDK qo'shish

PrebidMobile Prebid.org dan uchinchi tomon ochiq kodli paket, 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 qo'shmang — ular standalone rejimida kerak emas va Google Mobile Ads SDK ni tortib keladi.

2. Parametrlarni sozlash

IABoxBannerView.swift da hisob parametrlarini o'rnating:

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, App Tracking Transparency orqali foydalanuvchi ruxsatini olishingiz kerak.

Ruxsatsiz server haqiqiy identifikator o'rniga 00000000-0000-0000-0000-000000000000 oladi.

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

Qadam 1. Info.plist ga tavsif qo'shish

Loyiha Build Settings da (yoki to'g'ridan-to'g'ri Info.plist da) NSUserTrackingUsageDescription kalitini qo'shing:

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

Yoki Xcode Build Settings orqali:

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

Qadam 2. Kodda ruxsat so'rash

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

Variant A — scenePhase (SwiftUI uchun tavsiya etiladi)

Scene .active holatiga o'tganda so'rash. 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 lifecyclesiz):

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

ATT holati xulq-atvori

ATT holatiIDFANatija
.authorizedHaqiqiy UUIDShaxsiylashtirilgan reklamalar
.denied00000000-...Kontekstli reklamalar
.restricted00000000-...Kontekstli reklamalar
.notDetermined00000000-...Ruxsat so'rash kerak
Simulyatorda testlash: ATT dialogini qayta ko'rsatish uchun ilovani simulyatordan o'chirib, qayta ishga tushiring.

4. Build & Run

Loyihani build va run qilish: 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 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 jiddiy emas, bid so'rovlar /openrtb2/auction ga yuboriladi.

2. Bid so'rovi

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 javobi 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 Wrapper

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. Klikni qayta ishlash

Reklama kliklari WKNavigationDelegate va WKUIDelegate orqali qayta ishlanadi. <a href> 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 kreativ qaytaradi. Hodisa kuzatuvi (impression, click, viewability) WebView tomonida adboxsdk.new.js ichida 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

'PrebidMobile' moduli topilmadi

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

SDK status tekshiruvi muvaffaqiyatsiz

Serverda /status endpoint sozlanmagan — bu qabul qilinadi. Bid so'rovlar /openrtb2/auction orqali ishlaydi.

Kreativ modeli hodisa kuzatuvchisi bilan ta'minlanishi kerak

O'rnatilgan PrebidMobile renderer dan log — e'tiborsiz qoldirilishi mumkin. Kreativ o'rnatilgan rendererni aylanib o'tib, WKWebView orqali render qilinadi.

Google Mobile Ads SDK ilova ID siz ishga tushirildi

Qo'shimcha paketlar qo'shilgan (PrebidMobileAdMobAdapters va h.k.). Ularni olib tashlang, faqat PrebidMobile ni saqlang.

deviceId = 00000000-0000-0000-0000-000000000000

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

Banner ko'rsatilmayapti

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