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 │
└─────────────────────────────────────────────────────┘
PrebidMobile.BannerViewsends an OpenRTB bid request to Prebid Server- Server returns bid response with HTML/JS creative (adm)
WKWebViewrenders 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 status | IDFA | Tavsif |
|---|---|---|
.authorized | Real UUID | Shaxsiylashtirilgan reklama |
.denied | 00000000-... | Kontekstual reklama |
.restricted | 00000000-... | Kontekstual reklama |
.notDetermined | 00000000-... | 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