Appearance
Opera Ads iOS SDK - Release Notes
Version 2.15.0 (2026-10-10)
New Features
- 🔗 Content URL: Added
OpAdxAdLoadRequest, carrying an optionalcontentUrlthat is sent with the ad request as OpenRTBapp.content.urlso advertisers can map their ads to the content around them. Supported on every ad format for regular and client-bidding loads, ongetBidToken()for server bidding, and through the TopOn adapter via thekOpAdxToponContentUrllocal extra. See Content URL. - 🖼️ Native Creatives in Other Placements: Banner, interstitial and app open placements can now also be filled by native creatives, widening the pool of demand available to them. No code change is required — enable Allow native ads mixed on the placement to turn it on.
Behavior Changes
- ⚠️ Stricter Bid Validation: A bid without a recognised creative type (
mtype) is now discarded instead of being guessed at. This removes a class of broken renders, and may show up as a small fill-rate drop against misconfigured demand. - ⚠️ No Native Demand for Rewarded: Rewarded and rewarded interstitial placements no longer request native creatives, which never rendered correctly there.
- ⚠️ Cached Ad Reuse: A cached ad is now only reused for the same auction type it was loaded with, so a regular load can no longer pick up an ad loaded for bidding, or the reverse.
Improvements
- ⚡ Connection Warm-Up: Media hosts referenced by the ad markup are resolved and connected ahead of playback, cutting the delay before a video creative starts.
- 📶 Network-Aware Creatives: Creatives can read the current connection type, so heavy assets can be adapted on a metered or slow network.
- 📊 Reporting: Added bidder id to ad track events, the clearing price to
AdBidEvent, win/loss events for client bidding, and separate image/video reporting for native media views. - 🔌 AdMob Adapter: Native video state is now reported to AdMob, so the mediated ad correctly advertises whether it holds a video.
Bug Fixes
- 🐛 Render Diagnostics: Banners and native ads whose views are hidden, zero-sized or transparent at impression time are now reported, making integration mistakes visible instead of silently burning impressions.
- 🛡️ Stability: Various fixes around ad markup validation and the MRAID bridge.
Native creatives outside native placements
This is off unless Allow native ads mixed is enabled on the placement, and it also requires ad template v2.8.0 or later. Where either is missing, the placement keeps serving banner and video creatives exactly as before.
Version 2.14.0 (2026-09-02)
Version 2.13.x was skipped; 2.14.0 follows 2.12.1 directly.
New Features
- 🆕
onAdOpenedCallback: Added toAdInteractionListener, fired when the fullscreen ad container is presented - 🆔 Bid ID: Added
AdBid.getBidId, also exposed on banner ad info - 🔌 AdMob Adapter: Added rewarded interstitial support
Behavior Changes
- ⚠️
onAdDisplayedTiming: Now reported once, together with the impression, instead of on everyviewDidAppear. This removes the duplicate mediation impression previously reported on each return from a landing page. - ⚠️ Host Audio Session: The SDK no longer configures the shared
AVAudioSession. If your app relied on this, configure it yourself. - ⚠️ Backgrounded Show: Showing a fullscreen ad while the app is in the background is now refused instead of booking an impression. Brief interruptions — Control Centre, permission prompts, the app switcher — no longer count as backgrounded.
- 🔄 Ad Identifiers: The advertising id and ATT status are re-read when the app returns to the foreground, so an ATT prompt shown after SDK initialization now takes effect.
Improvements
- ✅ Open Measurement: Passed OM SDK mobile app compliance renewal, including the native ad test suite
- 📱 Bid Request: Corrected device type, screen density, ATT/LMT signals and video fields for better DSP compatibility
Bug Fixes
- 🛡️ Stability: Fixed a crash on incomplete ad and bid token requests, and a race when destroying a fullscreen ad
- 📊 Impression Reporting: Fixed cases where an impression could go unreported
- 🐛 Various other bug fixes
Version 2.12.1 (2026-08-13)
Maintenance release. No API changes — a drop-in replacement for 2.12.0.
Bug Fixes
- 🔒 Analytics Crash: Fixed a data race on the pending-event list that could corrupt memory and crash on the analytics upload thread. The list is now confined to a single thread, verified with Thread Sanitizer.
- 📐 TopOn Banner Size: Banner sizes outside the supported set now fall back to 320×50 instead of being passed through unvalidated. Supported sizes are 320×50, 300×250, 300×50, 320×100, 320×480, 468×60 and 728×90.
Improvements
- ⚡ Main Thread: Device and location information is now served from non-blocking caches, and the network retry and HTTP paths no longer park a thread waiting on a semaphore. This lowers ANR risk during SDK initialization and on slow or unreachable networks.
- 📉 Logging Overhead: Analytics log messages are no longer built in release builds.
Version 2.12.0 (2026-08-03)
New Features
- 🎬 Native Video Ads: Native ads now support video creatives, rendered through
OpAdxMediaView - 🔔 Video Playback Events: Added
setVideoPlaybackEventListeneron native ads for start/pause/resume/end/mute callbacks
Behavior Changes
- ⚠️ Banner Auto-Refresh: Auto-refresh is now enabled by default and follows the refresh interval configured for the placement. If you manage refresh yourself, call
setAutoRefreshEnabled(false).
Improvements
- 📦 Smaller Framework: Reduced xcframework size
- 🔌 TopOn Adapter: Verified against TopOn SDK v6.5.48 (minimum supported remains 6.5.34)
Bug Fixes
- 🛡️ Stability: Improved SDK initialization stability and network error handling
- 🐛 Various other bug fixes
Version 2.11.2 (2026-06-29)
New Features
- 🔌 TradPlus Adapter: Added TradPlus mediation adapter
- 🔌 LevelPlay Adapter: Added ironSource LevelPlay mediation adapter
Improvements
- ⚡ Ad Rendering: Optimized ad rendering latency during scrolling
Version 2.11.1 (2026-05-22)
New Features
- 📦 Swift Package Manager: Added SPM support via
Package.swift
Bug Fixes
- 🔒 Thread Safety: Fixed thread safety issues for file-level mutable variables
Version 2.9.1 (2026-04-08)
Improvements
- ⚡ App Startup Performance: Reduced ANR risk with further main thread optimizations
- 🔌 TopOn Adapter: Updated TopOn adapter, compatible with TopOn SDK v6.5.34 and above
- Performance optimizations and bug fixes
Version 2.9.0 (2026-04-02)
New Features
- 🔗 Added missing bid request fields for broader DSP compatibility
- 🔒 Exposed native ad privacy field for compliance support
- 🎯 Implemented dual-condition impression reporting
- 📡 Refactored SKAdNetwork attribution as Source App with
startImpression/endImpressionlifecycle - 🛒 Added SKOverlay support with configurable display strategies (auto/onImpression/onClick)
Improvements
- ⚡ Preloaded lazy instances for better performance
- 🔧 Adjusted impression ID handling
- 📢 Notified template of click events for better tracking
- 🕐 Fixed bid request timestamp unit issues
Configuration
- ⚠️ Required: Add
a2p9lx4jpn.skadnetworktoInfo.plistSKAdNetworkItemsfor attribution support
Version 2.8.3 (2026-03-24)
New Features
- 🎯 Enhanced debug logging system with emoji indicators and categorized tags
- 📊 Improved ad analytics and reporting mechanisms
- 🔧 Added comprehensive logging for SDK initialization with configuration details
Improvements
- ⚡ Optimized ad loading performance
- 🛡️ Enhanced error handling and recovery mechanisms
- 📝 Improved error messages for better debugging
Bug Fixes
- Fixed issue with banner ad auto-refresh in certain scenarios
- Resolved memory leak in native ad view rendering
- Fixed SKAdNetwork attribution tracking edge cases
Documentation
- Added detailed debug logging guide for both Swift and OC demos
- Updated integration documentation with latest best practices
- Added comprehensive troubleshooting sections
Version 2.8.1 (2026-03-05)
New Features
- 📈 Optimized ad reporting mechanism for better revenue tracking
- 🎨 Enhanced MRAID support for rich media ads
Improvements
- ⚡ Performance optimizations for ad rendering
- 🔄 Improved ad refresh logic for banner ads
- 📊 Enhanced analytics data collection
Bug Fixes
- Fixed crash when loading ads on iOS 13.x devices
- Resolved issue with native ad click tracking
- Fixed memory retention in interstitial ad lifecycle
Version 2.8.0 (2026-02-12)
New Features
- 🎯 Improved price reporting in the AdMob, AppLovin MAX and TopOn custom-network adapters
- 🚀 Enhanced Client Bidding (C2S) APIs with improved error handling
- 📱 App Open Ad format support added to the mediation adapters
Improvements
- ⚡ Optimized SDK initialization to reduce app launch time
- 🛡️ Improved thread safety in ad loading operations
- 🌐 Enhanced network error handling and retry logic
- 📊 Better analytics integration for impression tracking
Bug Fixes
- Fixed ANR (App Not Responding) issues on older devices during initialization
- Resolved race condition in parallel ad loading scenarios
- Fixed video ad playback issues on iPad devices
Mediation Updates
- AdMob Adapter 2.5.0.0: Adapter improvements and bug fixes
- AppLovin Adapter 2.5.0.0: Enhanced stability and performance
- TopOn Adapter 2.7.0.0: Updated for TopOn SDK 6.5.12+ compatibility
Version 2.7.0 (2026-02-02)
New Features
- 🎬 App Open Ad format support
- 🎁 Rewarded Interstitial Ads now publicly available
- 📝 Enhanced logging for mediation adapters
Improvements
- ⚡ Optimized SDK initialization for faster app launch (30% faster)
- 🔧 Improved adapter initialization flow
- 📊 Better error reporting in debug mode
Bug Fixes
- Fixed issue with rewarded ad callbacks not firing in edge cases
- Resolved banner ad sizing issues on certain iPad models
- Fixed crash when showing interstitial ads in rapid succession
Mediation Updates
- AdMob Adapter: Added App Open Ad support
- TopOn Adapter: Added App Open Ad (Splash) support
- AppLovin Adapter: Enhanced native ad rendering
Version 2.6.0 (2026-01-22)
New Features
- 🔌 TradPlus mediation support added
- 📦 Flexible dependency version management
Improvements
- ⚡ Optimized library dependency versions for better compatibility
- 🔄 Enhanced backward compatibility with older dependency versions
- 📊 Improved mediation waterfall performance
Bug Fixes
- Fixed pod installation conflicts with certain dependency versions
- Resolved issue with native ad media view sizing
- Fixed video ad mute state persistence
Version 2.5.0 (2026-01-13)
New Features
- 🚀 App Open Ads format publicly available
- 🎥 WebM video format support added
- 📱 Enhanced video ad controls
Improvements
- ⚡ Improved video ad loading speed
- 🔊 Better audio session management for video ads
- 📊 Enhanced video ad analytics
Bug Fixes
- Fixed video ad aspect ratio issues on certain devices
- Resolved audio playback conflicts with background music
- Fixed rewarded ad completion tracking
Version 2.4.1 (2026-01-12)
Breaking Changes
- ⚠️ SDK initialization now supports background thread (previously required main thread)
New Features
- 🧵 Thread-safe SDK initialization
- 📊 Server-Side Verification (SSV) callback support for rewarded ads
Improvements
- ⚡ Faster SDK initialization on background thread
- 🔒 Enhanced security for reward verification
- 📝 Improved SSV callback documentation
Migration Guide
swift
// Old (v2.4.0 and earlier) - Required main thread
DispatchQueue.main.async {
OpAdxSDK.initialize(withConfig: config)
}
// New (v2.4.1+) - Can initialize on any thread
DispatchQueue.global().async {
OpAdxSDK.initialize(withConfig: config) {
print("SDK initialized on background thread")
}
}Version 2.4.0 (2026-01-11)
New Features
- 🔗 TopOn SDK 6.5.12+ compatibility
- ✅ Server-Side Verification (SSV) for rewarded ads
- 🎯 Enhanced reward validation
Improvements
- 📊 Better reward tracking and analytics
- 🔒 Enhanced security for incentivized ads
- 📝 Improved SSV documentation with examples
Bug Fixes
- Fixed reward callback timing issues
- Resolved SSV callback URL encoding problems
- Fixed custom data truncation in SSV callbacks
SSV Configuration
swift
// Configure SSV options
let ssvOptions = RewardSsvOptions.Builder()
.userId("user_12345") // Max 100 bytes after URL encoding
.customData("level=5&score=1000") // Max 1KB after URL encoding
.build()
rewardedAd.setRewardSsvOptions(ssvOptions)Version 2.3.0 (2026-01-08)
New Features
- 🎯 Full Client Bidding (C2S) support for auctions you run in your app
- 📡 New Client Bidding APIs
- 🔧 Native ad enhancement for additional clickable views
Improvements
- ⚡ Optimized bidding performance
- 📊 Better bid price tracking
- 🎨 Enhanced native ad customization
Bug Fixes
- Fixed bid price rounding issues
- Resolved race conditions in parallel bidding
- Fixed native ad interaction tracking
C2S Bidding APIs
swift
// Get bid token
OpAdxSDK.getBidToken(request) { callback in
callback.onSuccess { token in
print("Bid token: \(token)")
}
}
// Load with client bidding
let ad = OpAdxInterstitialAd(placementId: "xxx", auctionType: .clientBidding)
ad.load(listener: listener)
// Compare bids and notify
ad.getBid()?.notifyWin(secondPrice: 1.20, bidderName: "Network A")Version 2.2.2 (2026-01-04)
New Features
- 🔊 Audio control API for video ads
- 🔄 OkHttp 3.x compatibility alongside OkHttp 4.x
Improvements
- 🔇 Better audio session management
- 📦 Flexible HTTP client version support
- 🎥 Enhanced video ad controls
Bug Fixes
- Fixed audio not muting in certain scenarios
- Resolved HTTP client version conflicts
- Fixed video ad resume after app backgrounding
Audio Control API
swift
// Mute all video ads
OpAdxSDK.setMuted(true)
// Unmute all video ads
OpAdxSDK.setMuted(false)
// Note: Must be called before loading adsVersion 2.2.0 (2025-12-11)
New Features
- 📏 Upgraded Open Measurement SDK to version 1.6.1
- 🔒 Enhanced security features
Improvements
- 📊 Better viewability tracking
- 🛡️ Improved fraud detection
- 🔐 Enhanced data encryption
Bug Fixes
- Fixed OMSDK session management issues
- Resolved viewability tracking edge cases
- Fixed impression verification delays
Version 2.1.0 (2025-12-03)
New Features
- 🌐 Full Server Bidding (S2S) support — run the auction on your own server with Opera Ads as a bidder
- 📡 Bid token APIs
- 🔗 TopOn adapter: serve Opera Ads through the TopOn waterfall as a custom network (unrelated to S2S bidding)
Improvements
- ⚡ Optimized server communication
- 📊 Enhanced bid response handling
- 🔄 Better error recovery in bidding flow
Bug Fixes
- Fixed bid response parsing issues
- Resolved timeout handling in S2S bidding
- Fixed placement ID validation
S2S Bidding APIs
swift
// Get bid token
let request = BidTokenRequest.Builder(adMediation: .topon)
.placementId("xxx")
.adFormat(.interstitial)
.build()
OpAdxSDK.getBidToken(request) { callback in
callback.onSuccess { token in
// Send to your server
}
}
// Load with bid response
let ad = OpAdxInterstitialAd(placementId: "xxx", auctionType: .serverBidding)
ad.load(bidResponse: "response_from_server", listener: listener)Version 2.0.1 (2025-11-16)
Bug Fixes
- Fixed iOS deployment target compatibility issue
- Resolved CocoaPods version conflict
- Fixed SwiftUI integration warnings
Version 2.0.0 (2025-11-05)
Major Release - Complete Rewrite
Breaking Changes
- ⚠️ New SDK architecture - migration required
- ⚠️ Updated initialization API
- ⚠️ Changed ad loading methods
- ⚠️ New listener/delegate patterns
New Features
- 🎯 Brand new SDK architecture for better performance
- 🔌 Mediation support for AdMob and AppLovin MAX
- 🎨 Redesigned native ad API
- 📊 Enhanced analytics and reporting
- 🔒 Improved privacy compliance (GDPR, CCPA, COPPA)
Supported Ad Formats
- Banner Ads (320x50, 300x250, 728x90)
- Interstitial Ads
- Rewarded Video Ads
- Native Ads
Migration Guide from v1.x
Initialization:
swift
// Old (v1.x)
OperaAdsSDK.initialize(appId: "xxx")
// New (v2.0+)
let config = OpAdxSdkInitConfig.create(
applicationId: "pub{}/ep{}/app{}",
iOSAppId: "123456"
)
OpAdxSDK.initialize(withConfig: config)Banner Ads:
swift
// Old (v1.x)
let banner = OperaBannerView(frame: frame)
banner.load(placementId: "xxx")
// New (v2.0+)
let banner = OpAdxBannerAdView()
banner.setPlacementId("sxxx")
banner.setAdSize(.BANNER_MREC)
banner.loadAd(listener: listener)Interstitial Ads:
swift
// Old (v1.x)
OperaInterstitial.load(placementId: "xxx") { ad in
ad.show()
}
// New (v2.0+)
let ad = OpAdxInterstitialAd(placementId: "sxxx", auctionType: .regular)
ad.load(placementId: "sxxx", listener: loadListener)
// Later...
ad.show(on: self, listener: interactionListener)Deprecation Notice
Deprecated APIs
v2.0.0 - Removed v1.x APIs:
OperaAdsSDK→ UseOpAdxSDKOperaBannerView→ UseOpAdxBannerAdViewOperaInterstitial→ UseOpAdxInterstitialAdOperaRewardedVideo→ UseOpAdxRewardedAdOperaNativeAd→ UseOpAdxNativeAd
Minimum Requirements
| SDK Version | iOS Version | Xcode | Swift |
|---|---|---|---|
| 2.15.0 | 13.0+ | 16.0+ | 5.0+ |
| 2.14.0 | 13.0+ | 16.0+ | 5.0+ |
| 2.12.1 | 13.0+ | 16.0+ | 5.0+ |
| 2.12.0 | 13.0+ | 16.0+ | 5.0+ |
| 2.11.2 | 13.0+ | 16.0+ | 5.0+ |
| 2.11.1 | 13.0+ | 14.0+ | 5.0+ |
| 2.9.1 | 13.0+ | 14.0+ | 5.0+ |
| 2.9.0 | 13.0+ | 14.0+ | 5.0+ |
| 2.8.3 | 13.0+ | 14.0+ | 5.0+ |
| 2.8.0 | 13.0+ | 14.0+ | 5.0+ |
| 2.7.0 | 13.0+ | 14.0+ | 5.0+ |
| 2.6.0 | 13.0+ | 14.0+ | 5.0+ |
| 2.5.0 | 13.0+ | 14.0+ | 5.0+ |
| 2.4.0 | 13.0+ | 14.0+ | 5.0+ |
| 2.3.0 | 13.0+ | 14.0+ | 5.0+ |
| 2.2.0 | 13.0+ | 13.0+ | 5.0+ |
| 2.1.0 | 13.0+ | 13.0+ | 5.0+ |
| 2.0.0 | 13.0+ | 13.0+ | 5.0+ |
Upgrade Guide
From v2.14.x to v2.15.0
No breaking changes — the existing initializers and loadAd methods are unchanged, and the new OpAdxAdLoadRequest overloads sit next to them. Review the Behavior Changes above, in particular the stricter bid validation. Update your Podfile:
ruby
pod 'OpAdxSdk', '~> 2.15.0'If you use a mediation adapter, update it to 2.15.0.0 as well.
Then run:
bash
pod install --repo-updateFrom v2.12.x to v2.14.0
No breaking changes, but review the Behavior Changes above — in particular the onAdDisplayed timing change. Update your Podfile:
ruby
pod 'OpAdxSdk', '~> 2.14.0'If you use a mediation adapter, update it to 2.14.0.0 as well.
Then run:
bash
pod install --repo-updateFrom v2.11.x to v2.12.1
No breaking changes. Update your Podfile:
ruby
pod 'OpAdxSdk', '~> 2.12.1'If you use a mediation adapter, update it to 2.12.1.0 as well. Note that ~> 2.12.0.0 resolves to < 2.12.1, so an adapter pinned that way will not pick up 2.12.1.0 on its own.
Then run:
bash
pod install --repo-updateFrom v2.9.1 to v2.11.1
No breaking changes. Update your Podfile:
ruby
pod 'OpAdxSdk', '~> 2.11.1'Then run:
bash
pod install --repo-updateFrom v2.9.0 to v2.9.1
No breaking changes. Update your Podfile:
ruby
pod 'OpAdxSdk', '~> 2.9.1'Then run:
bash
pod update OpAdxSdkFrom v2.8.x to v2.9.x
No breaking changes. Update your Podfile:
ruby
pod 'OpAdxSdk', '~> 2.9.0'Then run:
bash
pod update OpAdxSdkFrom v2.7.x to v2.8.x
No breaking changes. Update your Podfile:
ruby
pod 'OpAdxSdk', '~> 2.8.3'Then run:
bash
pod update OpAdxSdkFrom v2.6.x to v2.7.x
Update initialization to use callbacks (recommended but not required):
swift
// Old (still works)
OpAdxSdkCore.shared.initialize(initConfig: config)
// New (recommended)
OpAdxSDK.initialize(
withConfig: config,
onSuccess: {
print("SDK initialized")
},
onError: { error in
print("Init failed: \(error)")
}
)From v2.3.x to v2.4.x
Update SSV configuration if using rewarded ads:
swift
// New SSV API in v2.4.0+
let ssvOptions = RewardSsvOptions.Builder()
.userId("user_12345")
.customData("level=5")
.build()
rewardedAd.setRewardSsvOptions(ssvOptions)From v1.x to v2.x
Complete migration required. See v2.0.0 migration guide above.
Known Issues
Version 2.11.1
- No known issues
Version 2.9.1
- No known issues
Version 2.9.0
- No known issues
Version 2.8.3
- Banner ads may occasionally show blank on iOS 13.0-13.2 devices (fixed in 2.9.0)
- Native ad media view may flicker during rotation on iPadOS (investigating)
Version 2.8.0
- App Open ads may delay app launch by 200-300ms on first cold start (optimization in progress)
Workarounds
- For iOS 13.0-13.2 banner issues: Use
setAdSize(.BANNER)instead of.BANNER_MREC - For App Open delay: Preload App Open ads after SDK initialization completes
Getting Support
Documentation
Resources
- Publisher Portal: https://publisher.opera.com
- Technical Support: Contact Opera Ads Support
- Bug Reports: GitHub Issues
- Demo Apps:
/OpAdxSdkDemo_Swift/and/OpAdxSdkDemo_OC/
Last Updated: 2026-10-22
