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 │
└─────────────────────────────────────────────────────┘
PrebidMobile.BannerViewPrebid Serverga OpenRTB bid so'rovini yuboradi- Server bid javobini HTML/JS kreativ (adm) bilan qaytaradi
WKWebViewqabul 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 holati | IDFA | Natija |
|---|---|---|
.authorized | Haqiqiy UUID | Shaxsiylashtirilgan reklamalar |
.denied | 00000000-... | Kontekstli reklamalar |
.restricted | 00000000-... | Kontekstli reklamalar |
.notDetermined | 00000000-... | 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}/statusni tekshiradi. Agar bu endpoint sozlanmagan bo'lsa (404) — bu jiddiy emas, bid so'rovlar/openrtb2/auctionga 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