cloudx_flutter 3.10.0
cloudx_flutter: ^3.10.0 copied to clipboard
Complete Flutter SDK wrapper for CloudX Core with targeting APIs and full ad lifecycle callbacks
Changelog #
All notable changes to the CloudX Flutter SDK will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Versioning #
cloudx_flutter on pub follows the major.minor.patch of the iOS CloudXCore it pins, the same convention as cloudx-react-native. The Android io.cloudx:sdk line has diverged from iOS and is listed per release:
cloudx_flutter |
iOS (CloudXCore) |
Android (io.cloudx:sdk) |
|---|---|---|
| 3.10.0 | 3.10.0 | 4.9.0 |
| 3.9.0 | 3.9.0 | 4.7.0 |
| 3.8.0 | 3.8.0 | 4.7.0 |
| 2.2.3 | 2.2.3 | 2.2.3 |
Releases before 2.2.3 used 0.16.x–0.18.x for the Dart package only; those numbers were not the native SDK version. 2.2.3 matched both natives while they still shared one number.
Native pins come from the public docs repo (en/ios/integration.mdx, en/android/integration.mdx, and the per-adapter overview.mdx pages), applied by scripts/sync-native-pins.sh. Ad-network adapters are versioned <network-sdk-version>.<adapter-revision> and move independently of the core SDKs.
[Unreleased] #
3.10.0 - 2026-10-08 #
Added #
- Mediation Debugger:
CloudX.showMediationDebugger()opens the native integration screen: every installed adapter with its status, the privacy signals, your ad units and test-ad controls. It returnsfalseuntil initialization completes, so call it afterCloudX.initializesucceeds. CloudXAd.creativeIdcarries the creative identifier the network reported, when it reports one.- BIGO Ads on iOS:
CloudXBigoAdapter6.1.0.0 is published, so BIGO demand is available on both platforms. Copy BIGO'sSKAdNetworkItemsintoInfo.plist, and test on a device: the pod makes the Flutter tool drop arm64 from Simulator builds.
Changed #
- Native SDKs: pins Android
io.cloudx:sdk4.9.0 (from 4.7.0) and iOSCloudXCore3.10.0 (from 3.9.0). Apps inherit every native change in between: Android changelog, iOS changelog. - Ads now honour the advertiser's expiry. On both platforms a fullscreen ad expires with its bid, and showing an expired one fails with error 616. Check readiness before showing, and load a new ad when it fails.
- Inherited on Android: the revenue callback reports realized revenue when the source provides it, MMP connectors skip CloudX wins from bidders that report their own revenue, two Vungle error codes moved, a load during a closing fullscreen ad now completes, and hosts need Kotlin 2.1 or newer.
- Banners on Android: a banner or MREC that fails after it loaded now reports
onAdLoadFailed, and while auto-refresh is stopped the SDK no longer reloads on its own. Callload()for a new ad. - Android startup: WebView and network warm-up now run after the app first reaches the foreground instead of at process start, which lowers ANR risk. Background processes such as FCM and WorkManager skip it.
- Inherited on iOS: a second
initializewaits for the first, test-mode revenue callbacks fire with revenue 0, the revenue callback reports realized revenue, video clicks open the in-app App Store, and clicks fire only on a real tap. - Fullscreen ads on Android: CloudX-rendered interstitial and rewarded ads open in the app's own task, so apps whose launcher Activity sets
android:taskAffinity="", the Flutter template default, no longer get a stuck ad and blocked loads after returning from Home. - iOS privacy manifest: CloudXCore's privacy manifest now declares file-timestamp API use and crash-data collection.
- Digital Turbine on iOS: the docs pin
CloudXDigitalTurbineAdapter8.4.10.0 needs iOS 15.0+ and Xcode 26.1+. The plugin itself still supports iOS 13.0.
Fixed #
- Native ads on dark themes (Android): CloudX native ads in banner and MREC slots now take their text colors from your Activity theme, so titles and body text stay readable.
- HTML ad layout (Android): CloudX-rendered HTML ads with absolutely positioned content are no longer shifted or clipped, and a creative smaller than its slot aligns to the top-left instead of the center.
3.9.0 - 2026-09-11 #
Breaking Changes #
Every item here needs a source change. 3.9.0 is the first release since 2.2.3, and it is deliberately a breaking one.
- Rewarded methods lost the
Adsuffix.loadRewardedAd->loadRewarded,isRewardedAdReady->isRewardedReady,showRewardedAd->showRewarded,destroyRewardedAd->destroyRewarded,setRewardedAdListener->setRewardedListener. Event names are unchanged. - MREC methods are spelled
Mrec.createMREC->createMrec, and the same forloadMrec,showMrec,hideMrec,destroyMrec,startMrecAutoRefresh,stopMrecAutoRefresh,setMrecPlacement,setMrecCustomDataandsetMrecListener. CloudX.initializereturnsCloudXInitializationResult, not a nullableCloudXConfiguration. Replace a null check withif (result.success); the failure carrieserrorCode,errorCodeNameandmessage.CloudXConfigurationis deleted.updateBannerPositionandupdateMrecPositionare gone. Position is fixed at creation. To move an ad view, calldestroyBanner/destroyMrecand create it again at the new position; that starts a new auction.onAdExpandedandonAdCollapsedare gone fromCloudXAdViewListener. Delete those callbacks; the rest are unchanged.CloudX.setVisualDebuggingEnabledis gone. Delete the call. It drove an iOS-only debug overlay and never did anything on Android.CloudXAdViewis no longer exported. The inline widget is unfinished: it takes no placement, custom data or extra parameters, and thesetBanner...setters do not reach it. UsecreateBanner/createMrec, and tell us if you need inline ads.
Fixed #
- A failed
CloudX.initializecan be retried. The result of a failed attempt used to be cached for the life of the process, so a network failure at launch was unrecoverable without a restart. Callinginitializeagain now starts a fresh attempt; a success is still once-only. - A fullscreen show that never reached the SDK now reports a failure. Showing an interstitial or rewarded ad that was never loaded, or with nothing to present from, used to log and return silently, so an app waiting on a callback waited forever.
onAdDisplayFailednow fires.
Added #
- Extra parameters:
setBannerExtraParameter,setMrecExtraParameter,setInterstitialExtraParameterandsetRewardedExtraParameterattach a key and value to that ad unit's auctions. Set them before the load; a value stays until you set the same key again or passnullto clear it. - Load error codes:
loadNotAllowedWhileShowing(303),loadFailed(304) and the concurrency rejection, numbered 305 on Android and 306 on iOS, so the two behaviour changes below can be handled in code. Check both concurrency codes. CloudXError.codeNamecarries the SDK's own name for the code, so a log readsNO_FILL[302]instead of302.CloudXInitializationResult.errorCodeNamedoes the same for an initialization failure.CloudXErrorCode.adNotFound(403) when a show finds no ad for that ad unit, anddisplayHostUnavailable(404) when there is nothing to present from. Both come from the plugin, not the native SDK.
Removed #
- Everything removed in this release is listed under Breaking Changes above, with its migration step.
Changed #
- Native SDKs: pins CloudXCore 3.9.0 on iOS. Android stays on io.cloudx:sdk 4.7.0.
- iOS: a load issued while a fullscreen ad is showing now queues instead of failing. It runs on its own once that ad is dismissed.
LOAD_NOT_ALLOWED_WHILE_SHOWINGis no longer reported on iOS; Android still rejects it. - iOS: at most two of your loads run at once per ad unit. A third fails straight away with a new too-many-concurrent-loads error. Raising the cap is a dashboard setting.
- iOS: fullscreen ads present from the topmost view controller, and a show over system UI such as an alert or a share sheet is refused with the reason in the failure message.
- iOS: revenue callbacks are suppressed in test mode, so sentinel test prices no longer reach your revenue listener.
- iOS: native ad template views size to the creative. A landscape or square creative now returns a taller view whose height follows the width you give it, so read the height rather than assuming 320x250.
3.8.0 - 2026-09-09 #
Added #
- Trusted Arbiter:
CloudX.arbiter(CloudXArbiterConfiguration)compares a loaded CloudX ad with third-party bids and returns the selected platform as aCloudXArbiterResult. Build bids withCloudXArbiterBid.cloudX,.levelPlay,.pubMatic,.adMob,.gamand.custom. - Publisher-reported revenue:
CloudX.reportRevenueData(CloudXRevenueData)forwards impression revenue from another mediation platform (for example AdMob paid events) into CloudX. Required for AdMob and Ad Manager arbiter bids, which CloudX prices from that history. CloudXAd.adValuesexposes the SDK metadata attached to a loaded ad; pass theCloudXAdfromonAdLoadedtoCloudXArbiterBid.cloudXunchanged.
Changed #
CloudXAdFormatis a class, not an enum. An ad format the plugin does not name now arrives with the value the SDK reported, instead of reading asbanner. The constants andadFormat.valueare unchanged; code that treated the type as an enum needs updating.- Native SDKs: pins CloudXCore 3.8.0 (iOS) and io.cloudx:sdk 4.7.0 (Android). Host apps on Android need
compileSdk36 and Kotlin 2.1, inherited from the native SDK. - Adapters version independently: adapters are no longer on the core version. Declare each adapter at its own
<network-sdk-version>.<adapter-revision>from the integration guide; the demo app carries the full set, including Digital Turbine, Pangle, Moloco and Google. - Versioning: the plugin now tracks the iOS
CloudXCoreversion (see Versioning above). Android is pinned separately.
Fixed #
- An ad event whose payload was missing a field or carried an unexpected type used to be dropped before reaching your listener.
CloudXAdnow reports the missing field as absent and delivers the callback.
Removed #
CloudXRendereris no longer published and is no longer referenced. Remove the pod from yourPodfile.
Platform support #
- iOS: CloudXCore 3.8.0
- Android: io.cloudx:sdk 4.7.0
- AdMob Estimated demand (
io.cloudx:adapter-admob) is Android-only; iOS serves Google demand throughCloudXGoogleWaterfallAdapter.
2.2.3 - 2026-03-19 #
Added #
- Manual privacy APIs:
CloudX.setHasUserConsentandCloudX.setDoNotSell(nullablebool?to clear override and defer to CMP signals) - Demo app: Unity Ads mediation via
CloudXUnityAdsAdapter(iOS) andio.cloudx:adapter-unityads(Android) at 2.2.3, alongside existing adapters
Changed #
- Package version aligned with native:
cloudx_flutter2.2.3 pins CloudXCore 2.2.3 and io.cloudx:sdk 2.2.3
Platform support #
- iOS: CloudXCore 2.2.3
- Android: io.cloudx:sdk 2.2.3
Historical: pub package 0.x (native pins varied) #
These versions used 0.x.y for the Dart package only. Native SDK versions are noted per entry.
0.18.0 - 2026-03-18 #
- Added
setHasUserConsent/setDoNotSell - Native 2.2.2 (iOS CloudXCore, Android sdk)
0.17.0 - 2026-03-14 #
- Lowered Dart floor to
>=2.17.1, Flutter to>=3.0.0; removed unusedffi - Native: iOS 2.2.1-beta, Android sdk 2.0.0
0.16.0 - 2026-03-05 #
- First stable pub release; full ad format APIs, listeners, targeting, etc.
- Native: iOS ~> 2.2.0-beta, Android sdk 2.0.0
Ad unit ID migration — 2026-02-21 #
Replaces placement names with Ad Unit IDs from the CloudX dashboard.
Added (at migration) #
- iOS support for all formats; rewarded APIs;
CloudXAdView; targeting APIs;isInitialized; position updates; placement/customData on fullscreen ads;networkPlacement;CloudXErrorCode
Breaking changes (at migration) #
placementName→adUnitIdon create/load APIsCloudXAd.placementName→adUnitId;bidderName→networkName- Removed
isPlatformSupported()
Native SDKs integrate with CMP by default. Optional manual overrides ship in 2.2.3 (see above).