diff --git a/CHANGELOG.md b/CHANGELOG.md index eab1ed28..a6d145b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## Magnite adapter 1.0.0.2 - 2026-09-16 + +Install: `pod 'CloudXMagniteAdapterV2', '~> 1.0.0.2'` + +### Added + +- **Magnite Native ads** — Adds standalone Native auction and waterfall support with MagniteSDK 1.0.0. Banner, MREC, Interstitial, and Rewarded support is unchanged. Requires `CloudXCore >= 3.9.0`. + +### Fixed + +- **Rejected fullscreen shows no longer report a display** — Prevents Interstitial and Rewarded from emitting `didDisplay` after Magnite synchronously rejects the show. + +--- + ## Unity Ads adapter 4.20.1.0 - 2026-09-15 Install: `pod 'CloudXUnityAdsAdapter', '~> 4.20.1.0'` diff --git a/adapter-magnite/CloudXMagniteAdapterV2.podspec b/adapter-magnite/CloudXMagniteAdapterV2.podspec index 925af8cb..aed2eeaa 100644 --- a/adapter-magnite/CloudXMagniteAdapterV2.podspec +++ b/adapter-magnite/CloudXMagniteAdapterV2.podspec @@ -1,8 +1,8 @@ Pod::Spec.new do |s| s.name = 'CloudXMagniteAdapterV2' - s.version = '1.0.0.1' + s.version = '1.0.0.2' s.summary = 'CloudX Magnite Adapter (independent versioning) - Static Framework' - s.description = 'Magnite adapter for CloudX iOS SDK - binary distribution. Supports Banner, MREC, Interstitial, and Rewarded formats via MagniteSDK. Independent-versioned successor to CloudXMagniteAdapter, which remains on the legacy unified version line.' + s.description = 'Magnite adapter for CloudX iOS SDK - binary distribution. Supports Banner, MREC, Interstitial, Rewarded, and Native formats via MagniteSDK. Independent-versioned successor to CloudXMagniteAdapter, which remains on the legacy unified version line.' s.homepage = 'https://github.com/cloudx-io/cloudx-ios' s.license = { :type => 'Business Source License 1.1' } s.author = { 'CloudX' => 'support@cloudx.io' } @@ -18,7 +18,7 @@ Pod::Spec.new do |s| s.vendored_frameworks = 'adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework' # Dependencies - s.dependency 'CloudXCore', '>= 3.5.0' + s.dependency 'CloudXCore', '>= 3.9.0' s.dependency 'MagniteSDK', '= 1.0.0' s.frameworks = ['Foundation', 'UIKit', 'WebKit', 'AVFoundation', 'CoreMedia', 'CoreGraphics', 'CoreTelephony', 'SystemConfiguration', 'StoreKit', 'AdSupport', 'JavaScriptCore', 'QuartzCore', 'CoreFoundation', 'CoreAudio'] diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework.zip b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework.zip index 3be13d3e..921c4e3d 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework.zip and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework.zip differ diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/Info.plist b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/Info.plist index dbf083fc..35e37c4c 100644 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/Info.plist +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/Info.plist @@ -8,32 +8,32 @@ BinaryPath CloudXMagniteAdapter.framework/CloudXMagniteAdapter LibraryIdentifier - ios-arm64_x86_64-simulator + ios-arm64 LibraryPath CloudXMagniteAdapter.framework SupportedArchitectures arm64 - x86_64 SupportedPlatform ios - SupportedPlatformVariant - simulator BinaryPath CloudXMagniteAdapter.framework/CloudXMagniteAdapter LibraryIdentifier - ios-arm64 + ios-arm64_x86_64-simulator LibraryPath CloudXMagniteAdapter.framework SupportedArchitectures arm64 + x86_64 SupportedPlatform ios + SupportedPlatformVariant + simulator CFBundlePackageType diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXMagniteAdapter b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXMagniteAdapter index 1e3540a6..30afa156 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXMagniteAdapter and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXMagniteAdapter differ diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXRendererResources.bundle/Info.plist b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXRendererResources.bundle/Info.plist index a7628075..8975d751 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXRendererResources.bundle/Info.plist and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXRendererResources.bundle/Info.plist differ diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/Info.plist b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/Info.plist index 15e1fc77..746666ae 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/Info.plist and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/Info.plist differ diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/cloudx_vast_video.html b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/cloudx_vast_video.html index ffe95a30..9bbfbe14 100644 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/cloudx_vast_video.html +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/cloudx_vast_video.html @@ -136,12 +136,16 @@ nativePauseRequested = false; playGuarded(video.play()); }, + setMuted: function (muted) { + video.muted = !!muted; + }, /* Introspection for the SDK's device test suite; never creative-reachable (SDK-authored page). */ state: function () { return JSON.stringify({ t: video.currentTime, r: video.playbackRate, p: video.paused, + m: video.muted, lp: lastPlayhead, sk: video.seeking, sl: video.seekable.length diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBanner.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBanner.h deleted file mode 100644 index 32a7067d..00000000 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBanner.h +++ /dev/null @@ -1,74 +0,0 @@ -// -// CLXMagniteBanner.h -// CloudXMagniteAdapter -// - -#import - -#if __has_include() -#import -#else -@import CloudXCore; -#endif - -NS_ASSUME_NONNULL_BEGIN - -/** - * Magnite banner adapter implementing CloudX adapter protocol. - * Manages the lifecycle of Magnite banner/MREC ads including loading, showing, and cleanup. - * Supports standard banner (320x50) and MREC (300x250). - */ -@interface CLXMagniteBanner : CLXAdapterBanner - -/** - * CloudX adapter delegate for receiving ad events. - * Strong to keep the callback chain alive through the ad lifecycle. Cycle is broken in destroy. - */ -/** - * The underlying Magnite banner view - */ -/** - * SDK version of the Magnite SDK - */ -/** - * Magnite placement ID for this ad - */ -@property (nonatomic, copy, readonly) NSString *placementID; - -/** - * CloudX ad unit name for error messages and logging. - */ -@property (nonatomic, copy, readonly, nullable) NSString *adUnitName; - -/** - * Banner type (size) - */ -@property (nonatomic, assign, readonly) CLXBannerType bannerType; - -/** - * Initializes a new Magnite banner adapter - * @param bidPayload Ad markup from bid response (nil for waterfall, non-nil for bidding) - * @param placementID The Magnite placement ID (nullable - validation deferred to load()) - * @param adUnitName The CloudX placement name for error messages (nullable) - * @param type The banner type/size - * @param delegate The CloudX adapter delegate - * @return Initialized banner adapter - */ -- (instancetype)initWithBidPayload:(nullable NSString *)bidPayload - placementID:(nullable NSString *)placementID - adUnitName:(nullable NSString *)adUnitName - type:(CLXBannerType)type; - -/** - * Loads the banner ad - */ -/** - * Shows the banner ad from the given view controller - * @param viewController The view controller to show from - */ -/** - * Destroys the banner ad and cleans up resources - */ -@end - -NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBannerFactory.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBannerFactory.h deleted file mode 100644 index de210064..00000000 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBannerFactory.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// CLXMagniteBannerFactory.h -// CloudXMagniteAdapter -// - -#import - -#if __has_include() -#import -#else -@import CloudXCore; -#endif - -NS_ASSUME_NONNULL_BEGIN - -/** - * Factory for creating Magnite banner adapters. - * Implements the CloudX adapter factory protocol for banner/MREC ads. - */ -@interface CLXMagniteBannerFactory : CLXAdapterBannerFactory - -/** - * Factory method to create a new factory instance - * @return New factory instance - */ -@end - -NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBidTokenSource.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBidTokenSource.h deleted file mode 100644 index ed0ee68d..00000000 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteBidTokenSource.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// CLXMagniteBidTokenSource.h -// CloudXMagniteAdapter -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * @class CLXMagniteBidTokenSource - * @brief Provides Magnite bidding tokens for server-side bid requests - */ -@interface CLXMagniteBidTokenSource : CLXBidTokenSource - -+ (instancetype)sharedInstance; -@end - -NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNative.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNative.h new file mode 100644 index 00000000..ef728cf0 --- /dev/null +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNative.h @@ -0,0 +1,57 @@ +// +// CLXMagniteNative.h +// CloudXMagniteAdapter +// + +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Magnite native adapter implementing the CloudX CLXAdapterNative contract. + * Manages the lifecycle of a Magnite native ad load, including impression/click + * fan-out and view-registration cleanup. + */ +@interface CLXMagniteNative : CLXAdapterNative + +/** + * Magnite placement ID for this ad. + */ +@property (nonatomic, copy, readonly, nullable) NSString *placementID; + +/** + * CloudX ad unit name for error messages and logging. + */ +@property (nonatomic, copy, readonly, nullable) NSString *adUnitName; + +/// Whether the requested native template requires a primary media asset. +@property (nonatomic, assign, readonly) BOOL requiresMainMedia; + +/** + * Initializes a new Magnite native adapter. + * @param bidPayload Ad markup from bid response (nil for waterfall, non-nil for bidding) + * @param placementID The Magnite placement ID (nullable - validation deferred to load) + * @param adUnitName The CloudX placement name for error messages (nullable) + * @param localExtraParameters Publisher-supplied local extras (e.g. native video options) + * @param logger The CloudX adapter logger + * @return Initialized native adapter + */ +- (instancetype)initWithBidPayload:(nullable NSString *)bidPayload + placementID:(nullable NSString *)placementID + adUnitName:(nullable NSString *)adUnitName + localExtraParameters:(nullable NSDictionary *)localExtraParameters + logger:(id)logger; + +- (instancetype)initWithBidPayload:(nullable NSString *)bidPayload + placementID:(nullable NSString *)placementID + adUnitName:(nullable NSString *)adUnitName + localExtraParameters:(nullable NSDictionary *)localExtraParameters + requiresMainMedia:(BOOL)requiresMainMedia + logger:(id)logger; + +@end + +NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeAd.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeAd.h new file mode 100644 index 00000000..95703f92 --- /dev/null +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeAd.h @@ -0,0 +1,84 @@ +// +// CLXMagniteNativeAd.h +// CloudXMagniteAdapter +// + +#import +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Abstraction over the subset of Magnite's `MGNINativeAdDetails` the adapter consumes. + * + * `MGNINativeAdDetails` ships as a concrete SDK class whose `mediaView`, + * `videoAspectRatio`, and `isVideo` accessors are read-only and populated + * internally by the SDK, so they cannot be stubbed on a real instance in a unit + * test. Depending on this protocol (which `MGNINativeAdDetails` satisfies via + * the category below) lets the adapter be exercised with a deterministic test + * double while keeping the dependency inverted on the abstraction rather than + * the concrete SDK type. + */ +@protocol CLXMagniteNativeAdapting + +@property (nonatomic, copy, nullable) NSString *title; +@property (nonatomic, copy, nullable) NSString *description; +@property (nonatomic, copy, nullable) NSString *callToAction; +@property (nonatomic, copy, nullable) NSString *clickToInstall; +@property (nonatomic, copy, nullable) NSNumber *rating; +@property (nonatomic, copy, nullable) NSString *imageUrl; +@property (nonatomic, copy, nullable) NSString *secondaryImageUrl; +@property (nonatomic, copy, nullable) UIImage *imageBitmap; +@property (nonatomic, copy, nullable) UIImage *secondaryImageBitmap; +@property (nonatomic, copy, readonly, nullable) UIImage *policyImage; +@property (nonatomic, copy, readonly, nullable) NSString *eulaUrl; +@property (nonatomic, readonly, nullable) UIView *mediaView; +@property (nonatomic, readonly) CGFloat videoAspectRatio; +@property (nonatomic, readonly) BOOL isVideo; +@property (nonatomic, assign) BOOL videoMuted; + +- (void)registerViewForImpression:(UIView *)view andViewsForClick:(NSArray *)clickableViews; +- (void)unregisterViews; + +@end + +/// `MGNINativeAdDetails` already implements every member of +/// `CLXMagniteNativeAdapting`, so this category only declares the conformance — +/// letting the adapter hold the SDK object behind the protocol without a +/// wrapper. +/// +/// The compiler verifies only that `MGNINativeAdDetails` responds to each +/// selector, not that property attributes or return types match. A future +/// `MagniteSDK` bump that changes one of these signatures compiles silently +/// here and can surface as a runtime crash at the call site. Re-validate this +/// protocol against `MGNINativeAdDetails` on every `MagniteSDK` upgrade (see +/// the `DEBUG`-only runtime check in `CLXMagniteNative.m`). +@interface MGNINativeAdDetails (CLXMagniteNativeAdapting) +@end + +/** + * Concrete `CLXNativeAd` wrapping a Magnite native ad details handle. + * + * Registers the rendered container and clickable views for impression/click + * tracking via `registerViewForImpression:andViewsForClick:` in + * `prepareForInteractionClickableViews:withContainer:`. Holds the SDK object + * behind `CLXMagniteNativeAdapting` so it can be unit-tested with a fake. + */ +@interface CLXMagniteNativeAd : CLXNativeAd + +@property (nonatomic, strong, nullable) id magniteNativeAdDetails; + +- (instancetype)initWithNativeAdDetails:(id)nativeAdDetails + localExtraParameters:(nullable NSDictionary *)localExtraParameters + logger:(id)logger; + +/// Stops Magnite's impression/click tracking. Called when the native ad is +/// replaced or destroyed. +- (void)stopTracking; + +@end + +NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeFactory.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeFactory.h new file mode 100644 index 00000000..a3f29bc4 --- /dev/null +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeFactory.h @@ -0,0 +1,14 @@ +// +// CLXMagniteNativeFactory.h +// CloudXMagniteAdapter +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface CLXMagniteNativeFactory : CLXAdapterNativeFactory +@end + +NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CloudXMagniteAdapter.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CloudXMagniteAdapter.h index dcda0e46..9546faad 100644 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CloudXMagniteAdapter.h +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Headers/CloudXMagniteAdapter.h @@ -31,3 +31,8 @@ __attribute__((visibility("default"))) void CloudXMagniteAdapterRegister(void); // Public headers - Banner #import "CLXMagniteAdView.h" #import "CLXMagniteAdViewFactory.h" + +// Public headers - Native +#import "CLXMagniteNative.h" +#import "CLXMagniteNativeAd.h" +#import "CLXMagniteNativeFactory.h" diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Info.plist b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Info.plist index 635f74f5..1f86891a 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Info.plist and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64/CloudXMagniteAdapter.framework/Info.plist differ diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXMagniteAdapter b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXMagniteAdapter index af59939c..864d79a0 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXMagniteAdapter and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXMagniteAdapter differ diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXRendererResources.bundle/Info.plist b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXRendererResources.bundle/Info.plist index eb482049..afdaca21 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXRendererResources.bundle/Info.plist and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXRendererResources.bundle/Info.plist differ diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/Info.plist b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/Info.plist index b814a45f..511842b1 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/Info.plist and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/Info.plist differ diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/cloudx_vast_video.html b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/cloudx_vast_video.html index ffe95a30..9bbfbe14 100644 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/cloudx_vast_video.html +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/CloudXVASTResources.bundle/cloudx_vast_video.html @@ -136,12 +136,16 @@ nativePauseRequested = false; playGuarded(video.play()); }, + setMuted: function (muted) { + video.muted = !!muted; + }, /* Introspection for the SDK's device test suite; never creative-reachable (SDK-authored page). */ state: function () { return JSON.stringify({ t: video.currentTime, r: video.playbackRate, p: video.paused, + m: video.muted, lp: lastPlayhead, sk: video.seeking, sl: video.seekable.length diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBanner.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBanner.h deleted file mode 100644 index 32a7067d..00000000 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBanner.h +++ /dev/null @@ -1,74 +0,0 @@ -// -// CLXMagniteBanner.h -// CloudXMagniteAdapter -// - -#import - -#if __has_include() -#import -#else -@import CloudXCore; -#endif - -NS_ASSUME_NONNULL_BEGIN - -/** - * Magnite banner adapter implementing CloudX adapter protocol. - * Manages the lifecycle of Magnite banner/MREC ads including loading, showing, and cleanup. - * Supports standard banner (320x50) and MREC (300x250). - */ -@interface CLXMagniteBanner : CLXAdapterBanner - -/** - * CloudX adapter delegate for receiving ad events. - * Strong to keep the callback chain alive through the ad lifecycle. Cycle is broken in destroy. - */ -/** - * The underlying Magnite banner view - */ -/** - * SDK version of the Magnite SDK - */ -/** - * Magnite placement ID for this ad - */ -@property (nonatomic, copy, readonly) NSString *placementID; - -/** - * CloudX ad unit name for error messages and logging. - */ -@property (nonatomic, copy, readonly, nullable) NSString *adUnitName; - -/** - * Banner type (size) - */ -@property (nonatomic, assign, readonly) CLXBannerType bannerType; - -/** - * Initializes a new Magnite banner adapter - * @param bidPayload Ad markup from bid response (nil for waterfall, non-nil for bidding) - * @param placementID The Magnite placement ID (nullable - validation deferred to load()) - * @param adUnitName The CloudX placement name for error messages (nullable) - * @param type The banner type/size - * @param delegate The CloudX adapter delegate - * @return Initialized banner adapter - */ -- (instancetype)initWithBidPayload:(nullable NSString *)bidPayload - placementID:(nullable NSString *)placementID - adUnitName:(nullable NSString *)adUnitName - type:(CLXBannerType)type; - -/** - * Loads the banner ad - */ -/** - * Shows the banner ad from the given view controller - * @param viewController The view controller to show from - */ -/** - * Destroys the banner ad and cleans up resources - */ -@end - -NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBannerFactory.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBannerFactory.h deleted file mode 100644 index de210064..00000000 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBannerFactory.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// CLXMagniteBannerFactory.h -// CloudXMagniteAdapter -// - -#import - -#if __has_include() -#import -#else -@import CloudXCore; -#endif - -NS_ASSUME_NONNULL_BEGIN - -/** - * Factory for creating Magnite banner adapters. - * Implements the CloudX adapter factory protocol for banner/MREC ads. - */ -@interface CLXMagniteBannerFactory : CLXAdapterBannerFactory - -/** - * Factory method to create a new factory instance - * @return New factory instance - */ -@end - -NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBidTokenSource.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBidTokenSource.h deleted file mode 100644 index ed0ee68d..00000000 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteBidTokenSource.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// CLXMagniteBidTokenSource.h -// CloudXMagniteAdapter -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * @class CLXMagniteBidTokenSource - * @brief Provides Magnite bidding tokens for server-side bid requests - */ -@interface CLXMagniteBidTokenSource : CLXBidTokenSource - -+ (instancetype)sharedInstance; -@end - -NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNative.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNative.h new file mode 100644 index 00000000..ef728cf0 --- /dev/null +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNative.h @@ -0,0 +1,57 @@ +// +// CLXMagniteNative.h +// CloudXMagniteAdapter +// + +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Magnite native adapter implementing the CloudX CLXAdapterNative contract. + * Manages the lifecycle of a Magnite native ad load, including impression/click + * fan-out and view-registration cleanup. + */ +@interface CLXMagniteNative : CLXAdapterNative + +/** + * Magnite placement ID for this ad. + */ +@property (nonatomic, copy, readonly, nullable) NSString *placementID; + +/** + * CloudX ad unit name for error messages and logging. + */ +@property (nonatomic, copy, readonly, nullable) NSString *adUnitName; + +/// Whether the requested native template requires a primary media asset. +@property (nonatomic, assign, readonly) BOOL requiresMainMedia; + +/** + * Initializes a new Magnite native adapter. + * @param bidPayload Ad markup from bid response (nil for waterfall, non-nil for bidding) + * @param placementID The Magnite placement ID (nullable - validation deferred to load) + * @param adUnitName The CloudX placement name for error messages (nullable) + * @param localExtraParameters Publisher-supplied local extras (e.g. native video options) + * @param logger The CloudX adapter logger + * @return Initialized native adapter + */ +- (instancetype)initWithBidPayload:(nullable NSString *)bidPayload + placementID:(nullable NSString *)placementID + adUnitName:(nullable NSString *)adUnitName + localExtraParameters:(nullable NSDictionary *)localExtraParameters + logger:(id)logger; + +- (instancetype)initWithBidPayload:(nullable NSString *)bidPayload + placementID:(nullable NSString *)placementID + adUnitName:(nullable NSString *)adUnitName + localExtraParameters:(nullable NSDictionary *)localExtraParameters + requiresMainMedia:(BOOL)requiresMainMedia + logger:(id)logger; + +@end + +NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeAd.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeAd.h new file mode 100644 index 00000000..95703f92 --- /dev/null +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeAd.h @@ -0,0 +1,84 @@ +// +// CLXMagniteNativeAd.h +// CloudXMagniteAdapter +// + +#import +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Abstraction over the subset of Magnite's `MGNINativeAdDetails` the adapter consumes. + * + * `MGNINativeAdDetails` ships as a concrete SDK class whose `mediaView`, + * `videoAspectRatio`, and `isVideo` accessors are read-only and populated + * internally by the SDK, so they cannot be stubbed on a real instance in a unit + * test. Depending on this protocol (which `MGNINativeAdDetails` satisfies via + * the category below) lets the adapter be exercised with a deterministic test + * double while keeping the dependency inverted on the abstraction rather than + * the concrete SDK type. + */ +@protocol CLXMagniteNativeAdapting + +@property (nonatomic, copy, nullable) NSString *title; +@property (nonatomic, copy, nullable) NSString *description; +@property (nonatomic, copy, nullable) NSString *callToAction; +@property (nonatomic, copy, nullable) NSString *clickToInstall; +@property (nonatomic, copy, nullable) NSNumber *rating; +@property (nonatomic, copy, nullable) NSString *imageUrl; +@property (nonatomic, copy, nullable) NSString *secondaryImageUrl; +@property (nonatomic, copy, nullable) UIImage *imageBitmap; +@property (nonatomic, copy, nullable) UIImage *secondaryImageBitmap; +@property (nonatomic, copy, readonly, nullable) UIImage *policyImage; +@property (nonatomic, copy, readonly, nullable) NSString *eulaUrl; +@property (nonatomic, readonly, nullable) UIView *mediaView; +@property (nonatomic, readonly) CGFloat videoAspectRatio; +@property (nonatomic, readonly) BOOL isVideo; +@property (nonatomic, assign) BOOL videoMuted; + +- (void)registerViewForImpression:(UIView *)view andViewsForClick:(NSArray *)clickableViews; +- (void)unregisterViews; + +@end + +/// `MGNINativeAdDetails` already implements every member of +/// `CLXMagniteNativeAdapting`, so this category only declares the conformance — +/// letting the adapter hold the SDK object behind the protocol without a +/// wrapper. +/// +/// The compiler verifies only that `MGNINativeAdDetails` responds to each +/// selector, not that property attributes or return types match. A future +/// `MagniteSDK` bump that changes one of these signatures compiles silently +/// here and can surface as a runtime crash at the call site. Re-validate this +/// protocol against `MGNINativeAdDetails` on every `MagniteSDK` upgrade (see +/// the `DEBUG`-only runtime check in `CLXMagniteNative.m`). +@interface MGNINativeAdDetails (CLXMagniteNativeAdapting) +@end + +/** + * Concrete `CLXNativeAd` wrapping a Magnite native ad details handle. + * + * Registers the rendered container and clickable views for impression/click + * tracking via `registerViewForImpression:andViewsForClick:` in + * `prepareForInteractionClickableViews:withContainer:`. Holds the SDK object + * behind `CLXMagniteNativeAdapting` so it can be unit-tested with a fake. + */ +@interface CLXMagniteNativeAd : CLXNativeAd + +@property (nonatomic, strong, nullable) id magniteNativeAdDetails; + +- (instancetype)initWithNativeAdDetails:(id)nativeAdDetails + localExtraParameters:(nullable NSDictionary *)localExtraParameters + logger:(id)logger; + +/// Stops Magnite's impression/click tracking. Called when the native ad is +/// replaced or destroyed. +- (void)stopTracking; + +@end + +NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeFactory.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeFactory.h new file mode 100644 index 00000000..a3f29bc4 --- /dev/null +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CLXMagniteNativeFactory.h @@ -0,0 +1,14 @@ +// +// CLXMagniteNativeFactory.h +// CloudXMagniteAdapter +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface CLXMagniteNativeFactory : CLXAdapterNativeFactory +@end + +NS_ASSUME_NONNULL_END diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CloudXMagniteAdapter.h b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CloudXMagniteAdapter.h index dcda0e46..9546faad 100644 --- a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CloudXMagniteAdapter.h +++ b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Headers/CloudXMagniteAdapter.h @@ -31,3 +31,8 @@ __attribute__((visibility("default"))) void CloudXMagniteAdapterRegister(void); // Public headers - Banner #import "CLXMagniteAdView.h" #import "CLXMagniteAdViewFactory.h" + +// Public headers - Native +#import "CLXMagniteNative.h" +#import "CLXMagniteNativeAd.h" +#import "CLXMagniteNativeFactory.h" diff --git a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Info.plist b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Info.plist index f8fbd0b7..a32a19d6 100644 Binary files a/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Info.plist and b/adapter-magnite/CloudXMagniteAdapterV2/CloudXMagniteAdapter.xcframework/ios-arm64_x86_64-simulator/CloudXMagniteAdapter.framework/Info.plist differ