cloudx-react-native 2.0.0-beta.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +420 -1046
- package/android/src/main/AndroidManifest.xml +0 -4
- package/android/src/main/java/com/cloudxreactnative/CloudXAdEvents.kt +39 -0
- package/android/src/main/java/com/cloudxreactnative/CloudXAdInfo.kt +32 -0
- package/android/src/main/java/com/cloudxreactnative/CloudXModuleImpl.kt +694 -0
- package/android/src/{newarch/com/cloudxreactnative/CloudXReactNativePackage.kt → main/java/com/cloudxreactnative/CloudXPackage.kt} +14 -13
- package/android/src/newarch/com/cloudxreactnative/{CloudXReactNativeModule.kt → CloudXModule.kt} +31 -34
- package/android/src/oldarch/com/cloudxreactnative/{CloudXReactNativeModule.kt → CloudXModule.kt} +27 -32
- package/cloudx-react-native.podspec +1 -1
- package/ios/CloudX.h +47 -0
- package/ios/CloudX.mm +1406 -0
- package/lib/commonjs/AppTrackingTransparency.js +13 -13
- package/lib/commonjs/AppTrackingTransparency.js.map +1 -1
- package/lib/commonjs/CloudX.js +16 -12
- package/lib/commonjs/CloudX.js.map +1 -1
- package/lib/commonjs/CloudXAdPosition.js +23 -0
- package/lib/commonjs/CloudXAdPosition.js.map +1 -0
- package/lib/commonjs/{BannerAd.js → CloudXBannerAd.js} +42 -37
- package/lib/commonjs/CloudXBannerAd.js.map +1 -0
- package/lib/commonjs/CloudXErrorCode.js +116 -0
- package/lib/commonjs/CloudXErrorCode.js.map +1 -0
- package/lib/commonjs/{InterstitialAd.js → CloudXInterstitialAd.js} +10 -10
- package/lib/commonjs/CloudXInterstitialAd.js.map +1 -0
- package/lib/commonjs/{MRecAd.js → CloudXMRECAd.js} +42 -37
- package/lib/commonjs/CloudXMRECAd.js.map +1 -0
- package/lib/commonjs/{RewardedAd.js → CloudXRewardedAd.js} +10 -10
- package/lib/commonjs/CloudXRewardedAd.js.map +1 -0
- package/lib/commonjs/EventEmitter.js +3 -3
- package/lib/commonjs/EventEmitter.js.map +1 -1
- package/lib/commonjs/hooks.js +25 -26
- package/lib/commonjs/hooks.js.map +1 -1
- package/lib/commonjs/index.js +27 -41
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/{NativeCloudXModule.js → NativeCloudX.js} +2 -2
- package/lib/commonjs/specs/NativeCloudX.js.map +1 -0
- package/lib/commonjs/types/AdProps.js +6 -0
- package/lib/commonjs/types/AdProps.js.map +1 -0
- package/lib/commonjs/types/InterstitialAd.js +6 -0
- package/lib/commonjs/types/InterstitialAd.js.map +1 -0
- package/lib/commonjs/types/MRECAd.js +6 -0
- package/lib/commonjs/types/MRECAd.js.map +1 -0
- package/lib/commonjs/types/ViewAd.js +6 -0
- package/lib/commonjs/types/ViewAd.js.map +1 -0
- package/lib/module/AppTrackingTransparency.js +12 -12
- package/lib/module/AppTrackingTransparency.js.map +1 -1
- package/lib/module/CloudX.js +16 -12
- package/lib/module/CloudX.js.map +1 -1
- package/lib/module/CloudXAdPosition.js +17 -0
- package/lib/module/CloudXAdPosition.js.map +1 -0
- package/lib/module/{BannerAd.js → CloudXBannerAd.js} +41 -36
- package/lib/module/CloudXBannerAd.js.map +1 -0
- package/lib/module/CloudXErrorCode.js +110 -0
- package/lib/module/CloudXErrorCode.js.map +1 -0
- package/lib/module/{InterstitialAd.js → CloudXInterstitialAd.js} +9 -9
- package/lib/module/CloudXInterstitialAd.js.map +1 -0
- package/lib/module/{MRecAd.js → CloudXMRECAd.js} +41 -36
- package/lib/module/CloudXMRECAd.js.map +1 -0
- package/lib/module/{RewardedAd.js → CloudXRewardedAd.js} +9 -9
- package/lib/module/CloudXRewardedAd.js.map +1 -0
- package/lib/module/EventEmitter.js +2 -2
- package/lib/module/EventEmitter.js.map +1 -1
- package/lib/module/hooks.js +14 -15
- package/lib/module/hooks.js.map +1 -1
- package/lib/module/index.js +9 -10
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/{NativeCloudXModule.js → NativeCloudX.js} +2 -2
- package/lib/module/specs/NativeCloudX.js.map +1 -0
- package/lib/module/types/AdProps.js +2 -0
- package/lib/module/types/AdProps.js.map +1 -0
- package/lib/module/types/InterstitialAd.js +2 -0
- package/lib/module/types/InterstitialAd.js.map +1 -0
- package/lib/module/types/MRECAd.js +2 -0
- package/lib/module/types/MRECAd.js.map +1 -0
- package/lib/module/types/ViewAd.js +2 -0
- package/lib/module/types/ViewAd.js.map +1 -0
- package/lib/typescript/src/AppTrackingTransparency.d.ts +4 -4
- package/lib/typescript/src/AppTrackingTransparency.d.ts.map +1 -1
- package/lib/typescript/src/CloudX.d.ts.map +1 -1
- package/lib/typescript/src/CloudXAdPosition.d.ts +16 -0
- package/lib/typescript/src/CloudXAdPosition.d.ts.map +1 -0
- package/lib/typescript/src/CloudXBannerAd.d.ts +4 -0
- package/lib/typescript/src/CloudXBannerAd.d.ts.map +1 -0
- package/lib/typescript/src/{ErrorCode.d.ts → CloudXErrorCode.d.ts} +2 -2
- package/lib/typescript/src/CloudXErrorCode.d.ts.map +1 -0
- package/lib/typescript/src/CloudXInterstitialAd.d.ts +4 -0
- package/lib/typescript/src/CloudXInterstitialAd.d.ts.map +1 -0
- package/lib/typescript/src/CloudXMRECAd.d.ts +4 -0
- package/lib/typescript/src/CloudXMRECAd.d.ts.map +1 -0
- package/lib/typescript/src/CloudXRewardedAd.d.ts +4 -0
- package/lib/typescript/src/CloudXRewardedAd.d.ts.map +1 -0
- package/lib/typescript/src/EventEmitter.d.ts +4 -2
- package/lib/typescript/src/EventEmitter.d.ts.map +1 -1
- package/lib/typescript/src/hooks.d.ts +7 -8
- package/lib/typescript/src/hooks.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +12 -13
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/{NativeCloudXModule.d.ts → NativeCloudX.d.ts} +47 -64
- package/lib/typescript/src/specs/NativeCloudX.d.ts.map +1 -0
- package/lib/typescript/src/types/AdEvent.d.ts +3 -3
- package/lib/typescript/src/types/AdEvent.d.ts.map +1 -1
- package/lib/typescript/src/types/AdInfo.d.ts +7 -7
- package/lib/typescript/src/types/AdInfo.d.ts.map +1 -1
- package/lib/typescript/src/types/AdProps.d.ts +21 -0
- package/lib/typescript/src/types/AdProps.d.ts.map +1 -0
- package/lib/typescript/src/types/BannerAd.d.ts +8 -34
- package/lib/typescript/src/types/BannerAd.d.ts.map +1 -1
- package/lib/typescript/src/types/CloudX.d.ts +7 -4
- package/lib/typescript/src/types/CloudX.d.ts.map +1 -1
- package/lib/typescript/src/types/Configuration.d.ts +7 -3
- package/lib/typescript/src/types/Configuration.d.ts.map +1 -1
- package/lib/typescript/src/types/FullscreenAd.d.ts +10 -9
- package/lib/typescript/src/types/FullscreenAd.d.ts.map +1 -1
- package/lib/typescript/src/types/InterstitialAd.d.ts +8 -0
- package/lib/typescript/src/types/InterstitialAd.d.ts.map +1 -0
- package/lib/typescript/src/types/MRECAd.d.ts +13 -0
- package/lib/typescript/src/types/MRECAd.d.ts.map +1 -0
- package/lib/typescript/src/types/RewardedAd.d.ts +5 -4
- package/lib/typescript/src/types/RewardedAd.d.ts.map +1 -1
- package/lib/typescript/src/types/ViewAd.d.ts +29 -0
- package/lib/typescript/src/types/ViewAd.d.ts.map +1 -0
- package/lib/typescript/src/types/index.d.ts +11 -7
- package/lib/typescript/src/types/index.d.ts.map +1 -1
- package/package.json +8 -10
- package/src/AppTrackingTransparency.ts +10 -10
- package/src/CloudX.ts +21 -16
- package/src/CloudXAdPosition.ts +16 -0
- package/src/{BannerAd.ts → CloudXBannerAd.ts} +69 -47
- package/src/{ErrorCode.ts → CloudXErrorCode.ts} +1 -1
- package/src/{InterstitialAd.ts → CloudXInterstitialAd.ts} +17 -17
- package/src/{MRecAd.ts → CloudXMRECAd.ts} +69 -47
- package/src/{RewardedAd.ts → CloudXRewardedAd.ts} +18 -18
- package/src/EventEmitter.ts +4 -4
- package/src/hooks.ts +20 -22
- package/src/index.ts +27 -24
- package/src/specs/{NativeCloudXModule.ts → NativeCloudX.ts} +61 -82
- package/src/types/AdEvent.ts +3 -3
- package/src/types/AdInfo.ts +7 -7
- package/src/types/AdProps.ts +27 -0
- package/src/types/BannerAd.ts +8 -54
- package/src/types/CloudX.ts +10 -5
- package/src/types/Configuration.ts +8 -3
- package/src/types/FullscreenAd.ts +10 -9
- package/src/types/InterstitialAd.ts +8 -0
- package/src/types/MRECAd.ts +13 -0
- package/src/types/RewardedAd.ts +5 -4
- package/src/types/ViewAd.ts +38 -0
- package/src/types/index.ts +11 -7
- package/android/src/main/java/com/cloudxreactnative/CloudXAdViewEvent.kt +0 -15
- package/android/src/main/java/com/cloudxreactnative/CloudXBannerViewManagerImpl.kt +0 -472
- package/android/src/main/java/com/cloudxreactnative/CloudXReactNativeModuleImpl.kt +0 -861
- package/android/src/newarch/com/cloudxreactnative/CloudXBannerViewManager.kt +0 -90
- package/android/src/oldarch/com/cloudxreactnative/CloudXBannerViewManager.kt +0 -76
- package/android/src/oldarch/com/cloudxreactnative/CloudXReactNativePackage.kt +0 -16
- package/ios/RNCloudXBannerView.h +0 -51
- package/ios/RNCloudXBannerView.mm +0 -633
- package/ios/RNCloudXBannerViewManager.h +0 -11
- package/ios/RNCloudXBannerViewManager.mm +0 -60
- package/ios/RNCloudXModule.h +0 -30
- package/ios/RNCloudXModule.mm +0 -1088
- package/lib/commonjs/AdView.js +0 -151
- package/lib/commonjs/AdView.js.map +0 -1
- package/lib/commonjs/BannerAd.js.map +0 -1
- package/lib/commonjs/ErrorCode.js +0 -116
- package/lib/commonjs/ErrorCode.js.map +0 -1
- package/lib/commonjs/InterstitialAd.js.map +0 -1
- package/lib/commonjs/MRecAd.js.map +0 -1
- package/lib/commonjs/RewardedAd.js.map +0 -1
- package/lib/commonjs/specs/CloudXAdViewNativeComponent.js +0 -26
- package/lib/commonjs/specs/CloudXAdViewNativeComponent.js.map +0 -1
- package/lib/commonjs/specs/NativeCloudXModule.js.map +0 -1
- package/lib/module/AdView.js +0 -144
- package/lib/module/AdView.js.map +0 -1
- package/lib/module/BannerAd.js.map +0 -1
- package/lib/module/ErrorCode.js +0 -110
- package/lib/module/ErrorCode.js.map +0 -1
- package/lib/module/InterstitialAd.js.map +0 -1
- package/lib/module/MRecAd.js.map +0 -1
- package/lib/module/RewardedAd.js.map +0 -1
- package/lib/module/specs/CloudXAdViewNativeComponent.js +0 -20
- package/lib/module/specs/CloudXAdViewNativeComponent.js.map +0 -1
- package/lib/module/specs/NativeCloudXModule.js.map +0 -1
- package/lib/typescript/src/AdView.d.ts +0 -69
- package/lib/typescript/src/AdView.d.ts.map +0 -1
- package/lib/typescript/src/BannerAd.d.ts +0 -4
- package/lib/typescript/src/BannerAd.d.ts.map +0 -1
- package/lib/typescript/src/ErrorCode.d.ts.map +0 -1
- package/lib/typescript/src/InterstitialAd.d.ts +0 -4
- package/lib/typescript/src/InterstitialAd.d.ts.map +0 -1
- package/lib/typescript/src/MRecAd.d.ts +0 -4
- package/lib/typescript/src/MRecAd.d.ts.map +0 -1
- package/lib/typescript/src/RewardedAd.d.ts +0 -4
- package/lib/typescript/src/RewardedAd.d.ts.map +0 -1
- package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts +0 -61
- package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts.map +0 -1
- package/lib/typescript/src/specs/NativeCloudXModule.d.ts.map +0 -1
- package/src/AdView.tsx +0 -213
- package/src/specs/CloudXAdViewNativeComponent.ts +0 -82
package/ios/RNCloudXModule.mm
DELETED
|
@@ -1,1088 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// RNCloudXModule.mm
|
|
3
|
-
// cloudx-react-native v2.0.0
|
|
4
|
-
//
|
|
5
|
-
// Updated for CloudX iOS SDK 2.1.0-beta:
|
|
6
|
-
// - Unified module name: CloudXModule
|
|
7
|
-
// - Separate revenue delegate
|
|
8
|
-
// - Updated failure callback signatures (adUnitId + CLXError)
|
|
9
|
-
// - Removed: setLoggingEnabled, setEnvironment, legacy privacy, setUserID
|
|
10
|
-
// - Added: isInitialized, MREC support, placement/customData on show
|
|
11
|
-
// - Constants-based event names for codegen
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
#import "RNCloudXModule.h"
|
|
15
|
-
#import <React/RCTLog.h>
|
|
16
|
-
#import <React/RCTUtils.h>
|
|
17
|
-
|
|
18
|
-
// Event name constants (must match NativeCloudXModule.ts getConstants())
|
|
19
|
-
static NSString *const kOnBannerAdLoadedEvent = @"OnBannerAdLoadedEvent";
|
|
20
|
-
static NSString *const kOnBannerAdLoadFailedEvent = @"OnBannerAdLoadFailedEvent";
|
|
21
|
-
static NSString *const kOnBannerAdClickedEvent = @"OnBannerAdClickedEvent";
|
|
22
|
-
static NSString *const kOnBannerAdExpandedEvent = @"OnBannerAdExpandedEvent";
|
|
23
|
-
static NSString *const kOnBannerAdCollapsedEvent = @"OnBannerAdCollapsedEvent";
|
|
24
|
-
static NSString *const kOnBannerAdRevenuePaid = @"OnBannerAdRevenuePaid";
|
|
25
|
-
|
|
26
|
-
static NSString *const kOnMRecAdLoadedEvent = @"OnMRecAdLoadedEvent";
|
|
27
|
-
static NSString *const kOnMRecAdLoadFailedEvent = @"OnMRecAdLoadFailedEvent";
|
|
28
|
-
static NSString *const kOnMRecAdClickedEvent = @"OnMRecAdClickedEvent";
|
|
29
|
-
static NSString *const kOnMRecAdExpandedEvent = @"OnMRecAdExpandedEvent";
|
|
30
|
-
static NSString *const kOnMRecAdCollapsedEvent = @"OnMRecAdCollapsedEvent";
|
|
31
|
-
static NSString *const kOnMRecAdRevenuePaid = @"OnMRecAdRevenuePaid";
|
|
32
|
-
|
|
33
|
-
static NSString *const kOnInterstitialLoadedEvent = @"OnInterstitialLoadedEvent";
|
|
34
|
-
static NSString *const kOnInterstitialLoadFailedEvent = @"OnInterstitialLoadFailedEvent";
|
|
35
|
-
static NSString *const kOnInterstitialClickedEvent = @"OnInterstitialClickedEvent";
|
|
36
|
-
static NSString *const kOnInterstitialDisplayedEvent = @"OnInterstitialDisplayedEvent";
|
|
37
|
-
static NSString *const kOnInterstitialDisplayFailedEvent = @"OnInterstitialDisplayFailedEvent";
|
|
38
|
-
static NSString *const kOnInterstitialHiddenEvent = @"OnInterstitialHiddenEvent";
|
|
39
|
-
static NSString *const kOnInterstitialAdRevenuePaid = @"OnInterstitialAdRevenuePaid";
|
|
40
|
-
|
|
41
|
-
static NSString *const kOnRewardedAdLoadedEvent = @"OnRewardedAdLoadedEvent";
|
|
42
|
-
static NSString *const kOnRewardedAdLoadFailedEvent = @"OnRewardedAdLoadFailedEvent";
|
|
43
|
-
static NSString *const kOnRewardedAdClickedEvent = @"OnRewardedAdClickedEvent";
|
|
44
|
-
static NSString *const kOnRewardedAdDisplayedEvent = @"OnRewardedAdDisplayedEvent";
|
|
45
|
-
static NSString *const kOnRewardedAdDisplayFailedEvent = @"OnRewardedAdDisplayFailedEvent";
|
|
46
|
-
static NSString *const kOnRewardedAdHiddenEvent = @"OnRewardedAdHiddenEvent";
|
|
47
|
-
static NSString *const kOnRewardedAdReceivedRewardEvent = @"OnRewardedAdReceivedRewardEvent";
|
|
48
|
-
static NSString *const kOnRewardedAdRevenuePaid = @"OnRewardedAdRevenuePaid";
|
|
49
|
-
|
|
50
|
-
@implementation RNCloudXModule {
|
|
51
|
-
BOOL _hasListeners;
|
|
52
|
-
NSMutableSet<NSString *> *_windowPositionedAds;
|
|
53
|
-
NSMutableDictionary<NSString *, NSString *> *_adViewPositions;
|
|
54
|
-
NSMutableDictionary<NSString *, NSValue *> *_adViewOffsets;
|
|
55
|
-
NSMutableSet<NSString *> *_adUnitIdsToShowAfterCreate;
|
|
56
|
-
NSMutableDictionary<NSString *, UIView *> *_safeAreaBackgrounds;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
RCT_EXPORT_MODULE(CloudXModule);
|
|
60
|
-
|
|
61
|
-
- (instancetype)init {
|
|
62
|
-
if (self = [super init]) {
|
|
63
|
-
self.interstitials = [NSMutableDictionary new];
|
|
64
|
-
self.rewardeds = [NSMutableDictionary new];
|
|
65
|
-
self.banners = [NSMutableDictionary new];
|
|
66
|
-
self.mrecs = [NSMutableDictionary new];
|
|
67
|
-
self.initState = RNCloudXInitStateIdle;
|
|
68
|
-
_windowPositionedAds = [NSMutableSet new];
|
|
69
|
-
_adViewPositions = [NSMutableDictionary new];
|
|
70
|
-
_adViewOffsets = [NSMutableDictionary new];
|
|
71
|
-
_adUnitIdsToShowAfterCreate = [NSMutableSet new];
|
|
72
|
-
_safeAreaBackgrounds = [NSMutableDictionary new];
|
|
73
|
-
}
|
|
74
|
-
return self;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
- (void)invalidate {
|
|
78
|
-
[super invalidate];
|
|
79
|
-
for (CLXBannerAdView *banner in self.banners.allValues) {
|
|
80
|
-
banner.delegate = nil;
|
|
81
|
-
banner.revenueDelegate = nil;
|
|
82
|
-
[banner removeFromSuperview];
|
|
83
|
-
[banner stopAutoRefresh];
|
|
84
|
-
[banner destroy];
|
|
85
|
-
}
|
|
86
|
-
for (CLXBannerAdView *mrec in self.mrecs.allValues) {
|
|
87
|
-
mrec.delegate = nil;
|
|
88
|
-
mrec.revenueDelegate = nil;
|
|
89
|
-
[mrec removeFromSuperview];
|
|
90
|
-
[mrec stopAutoRefresh];
|
|
91
|
-
[mrec destroy];
|
|
92
|
-
}
|
|
93
|
-
for (CLXInterstitial *interstitial in self.interstitials.allValues) {
|
|
94
|
-
interstitial.delegate = nil;
|
|
95
|
-
interstitial.revenueDelegate = nil;
|
|
96
|
-
[interstitial destroy];
|
|
97
|
-
}
|
|
98
|
-
for (CLXRewarded *rewarded in self.rewardeds.allValues) {
|
|
99
|
-
rewarded.delegate = nil;
|
|
100
|
-
rewarded.revenueDelegate = nil;
|
|
101
|
-
[rewarded destroy];
|
|
102
|
-
}
|
|
103
|
-
[self.banners removeAllObjects];
|
|
104
|
-
[self.mrecs removeAllObjects];
|
|
105
|
-
[self.interstitials removeAllObjects];
|
|
106
|
-
[self.rewardeds removeAllObjects];
|
|
107
|
-
[_windowPositionedAds removeAllObjects];
|
|
108
|
-
[_adViewPositions removeAllObjects];
|
|
109
|
-
[_adViewOffsets removeAllObjects];
|
|
110
|
-
[_adUnitIdsToShowAfterCreate removeAllObjects];
|
|
111
|
-
for (UIView *bg in _safeAreaBackgrounds.allValues) {
|
|
112
|
-
[bg removeFromSuperview];
|
|
113
|
-
}
|
|
114
|
-
[_safeAreaBackgrounds removeAllObjects];
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
+ (BOOL)requiresMainQueueSetup {
|
|
118
|
-
return YES;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// All exported methods run on the main queue automatically,
|
|
122
|
-
// ensuring thread-safe access to ad instance dictionaries and UIKit.
|
|
123
|
-
- (dispatch_queue_t)methodQueue {
|
|
124
|
-
return dispatch_get_main_queue();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
- (void)startObserving {
|
|
128
|
-
_hasListeners = YES;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
- (void)stopObserving {
|
|
132
|
-
_hasListeners = NO;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
- (void)sendEventWithName:(NSString *)eventName body:(id)body {
|
|
136
|
-
if (!_hasListeners) return;
|
|
137
|
-
[super sendEventWithName:eventName body:body];
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
- (NSArray<NSString *> *)supportedEvents {
|
|
141
|
-
return @[
|
|
142
|
-
kOnBannerAdLoadedEvent, kOnBannerAdLoadFailedEvent, kOnBannerAdClickedEvent,
|
|
143
|
-
kOnBannerAdExpandedEvent, kOnBannerAdCollapsedEvent, kOnBannerAdRevenuePaid,
|
|
144
|
-
kOnMRecAdLoadedEvent, kOnMRecAdLoadFailedEvent, kOnMRecAdClickedEvent,
|
|
145
|
-
kOnMRecAdExpandedEvent, kOnMRecAdCollapsedEvent, kOnMRecAdRevenuePaid,
|
|
146
|
-
kOnInterstitialLoadedEvent, kOnInterstitialLoadFailedEvent, kOnInterstitialClickedEvent,
|
|
147
|
-
kOnInterstitialDisplayedEvent, kOnInterstitialDisplayFailedEvent, kOnInterstitialHiddenEvent,
|
|
148
|
-
kOnInterstitialAdRevenuePaid,
|
|
149
|
-
kOnRewardedAdLoadedEvent, kOnRewardedAdLoadFailedEvent, kOnRewardedAdClickedEvent,
|
|
150
|
-
kOnRewardedAdDisplayedEvent, kOnRewardedAdDisplayFailedEvent, kOnRewardedAdHiddenEvent,
|
|
151
|
-
kOnRewardedAdReceivedRewardEvent, kOnRewardedAdRevenuePaid,
|
|
152
|
-
];
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
- (NSDictionary *)getConstants {
|
|
156
|
-
return @{
|
|
157
|
-
@"ON_BANNER_AD_LOADED_EVENT": kOnBannerAdLoadedEvent,
|
|
158
|
-
@"ON_BANNER_AD_LOAD_FAILED_EVENT": kOnBannerAdLoadFailedEvent,
|
|
159
|
-
@"ON_BANNER_AD_CLICKED_EVENT": kOnBannerAdClickedEvent,
|
|
160
|
-
@"ON_BANNER_AD_EXPANDED_EVENT": kOnBannerAdExpandedEvent,
|
|
161
|
-
@"ON_BANNER_AD_COLLAPSED_EVENT": kOnBannerAdCollapsedEvent,
|
|
162
|
-
@"ON_BANNER_AD_REVENUE_PAID": kOnBannerAdRevenuePaid,
|
|
163
|
-
|
|
164
|
-
@"ON_MREC_AD_LOADED_EVENT": kOnMRecAdLoadedEvent,
|
|
165
|
-
@"ON_MREC_AD_LOAD_FAILED_EVENT": kOnMRecAdLoadFailedEvent,
|
|
166
|
-
@"ON_MREC_AD_CLICKED_EVENT": kOnMRecAdClickedEvent,
|
|
167
|
-
@"ON_MREC_AD_EXPANDED_EVENT": kOnMRecAdExpandedEvent,
|
|
168
|
-
@"ON_MREC_AD_COLLAPSED_EVENT": kOnMRecAdCollapsedEvent,
|
|
169
|
-
@"ON_MREC_AD_REVENUE_PAID": kOnMRecAdRevenuePaid,
|
|
170
|
-
|
|
171
|
-
@"ON_INTERSTITIAL_LOADED_EVENT": kOnInterstitialLoadedEvent,
|
|
172
|
-
@"ON_INTERSTITIAL_LOAD_FAILED_EVENT": kOnInterstitialLoadFailedEvent,
|
|
173
|
-
@"ON_INTERSTITIAL_CLICKED_EVENT": kOnInterstitialClickedEvent,
|
|
174
|
-
@"ON_INTERSTITIAL_DISPLAYED_EVENT": kOnInterstitialDisplayedEvent,
|
|
175
|
-
@"ON_INTERSTITIAL_DISPLAY_FAILED_EVENT": kOnInterstitialDisplayFailedEvent,
|
|
176
|
-
@"ON_INTERSTITIAL_HIDDEN_EVENT": kOnInterstitialHiddenEvent,
|
|
177
|
-
@"ON_INTERSTITIAL_AD_REVENUE_PAID": kOnInterstitialAdRevenuePaid,
|
|
178
|
-
|
|
179
|
-
@"ON_REWARDED_AD_LOADED_EVENT": kOnRewardedAdLoadedEvent,
|
|
180
|
-
@"ON_REWARDED_AD_LOAD_FAILED_EVENT": kOnRewardedAdLoadFailedEvent,
|
|
181
|
-
@"ON_REWARDED_AD_CLICKED_EVENT": kOnRewardedAdClickedEvent,
|
|
182
|
-
@"ON_REWARDED_AD_DISPLAYED_EVENT": kOnRewardedAdDisplayedEvent,
|
|
183
|
-
@"ON_REWARDED_AD_DISPLAY_FAILED_EVENT": kOnRewardedAdDisplayFailedEvent,
|
|
184
|
-
@"ON_REWARDED_AD_HIDDEN_EVENT": kOnRewardedAdHiddenEvent,
|
|
185
|
-
@"ON_REWARDED_AD_RECEIVED_REWARD_EVENT": kOnRewardedAdReceivedRewardEvent,
|
|
186
|
-
@"ON_REWARDED_AD_REVENUE_PAID": kOnRewardedAdRevenuePaid,
|
|
187
|
-
|
|
188
|
-
// Position constants
|
|
189
|
-
@"TOP_LEFT_POSITION": @"top_left",
|
|
190
|
-
@"TOP_CENTER_POSITION": @"top_center",
|
|
191
|
-
@"TOP_RIGHT_POSITION": @"top_right",
|
|
192
|
-
@"CENTER_LEFT_POSITION": @"center_left",
|
|
193
|
-
@"CENTERED_POSITION": @"centered",
|
|
194
|
-
@"CENTER_RIGHT_POSITION": @"center_right",
|
|
195
|
-
@"BOTTOM_LEFT_POSITION": @"bottom_left",
|
|
196
|
-
@"BOTTOM_CENTER_POSITION": @"bottom_center",
|
|
197
|
-
@"BOTTOM_RIGHT_POSITION": @"bottom_right",
|
|
198
|
-
|
|
199
|
-
// Error code constants
|
|
200
|
-
@"ERROR_CODE_INTERNAL_ERROR": @(0),
|
|
201
|
-
@"ERROR_CODE_NETWORK_ERROR": @(100),
|
|
202
|
-
@"ERROR_CODE_NETWORK_TIMEOUT": @(101),
|
|
203
|
-
@"ERROR_CODE_NO_FILL": @(302),
|
|
204
|
-
@"ERROR_CODE_AD_NOT_READY": @(400),
|
|
205
|
-
@"ERROR_CODE_AD_ALREADY_SHOWING": @(401),
|
|
206
|
-
@"ERROR_CODE_INVALID_AD_UNIT": @(300),
|
|
207
|
-
@"ERROR_CODE_NOT_INITIALIZED": @(200),
|
|
208
|
-
@"ERROR_CODE_NO_CONNECTION": @(106),
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
- (NSDictionary *)constantsToExport {
|
|
213
|
-
return [self getConstants];
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
#pragma mark - Initialization
|
|
217
|
-
|
|
218
|
-
RCT_EXPORT_METHOD(initialize:(NSString *)pluginVersion
|
|
219
|
-
appKey:(NSString *)appKey
|
|
220
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
221
|
-
reject:(RCTPromiseRejectBlock)reject) {
|
|
222
|
-
if (self.initState == RNCloudXInitStateInitialized) {
|
|
223
|
-
resolve(@{@"success": @YES, @"message": @"SDK already initialized"});
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (self.initState == RNCloudXInitStateInitializing) {
|
|
228
|
-
reject(@"INIT_IN_PROGRESS", @"SDK initialization already in progress", nil);
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
if (!appKey) {
|
|
233
|
-
reject(@"INVALID_PARAMS", @"appKey is required", nil);
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
self.initState = RNCloudXInitStateInitializing;
|
|
238
|
-
|
|
239
|
-
CLXInitializationConfiguration *config = [CLXInitializationConfiguration configurationWithAppKey:appKey builderBlock:^(CLXInitializationConfigurationBuilder *builder) {
|
|
240
|
-
builder.pluginVersion = pluginVersion;
|
|
241
|
-
}];
|
|
242
|
-
|
|
243
|
-
[[CloudXCore shared] initializeWithConfiguration:config completion:^(CLXSdkConfiguration * _Nullable sdkConfig, CLXError * _Nullable error) {
|
|
244
|
-
// Completion fires on an arbitrary queue; bounce to main to safely update initState
|
|
245
|
-
dispatch_async(dispatch_get_main_queue(), ^{
|
|
246
|
-
if (error) {
|
|
247
|
-
self.initState = RNCloudXInitStateIdle;
|
|
248
|
-
reject(@"INIT_FAILED", error.localizedDescription ?: @"SDK initialization failed", nil);
|
|
249
|
-
} else {
|
|
250
|
-
self.initState = RNCloudXInitStateInitialized;
|
|
251
|
-
resolve(@{
|
|
252
|
-
@"success": @YES,
|
|
253
|
-
@"message": @"SDK initialized successfully"
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
}];
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
RCT_EXPORT_METHOD(isInitialized:(RCTPromiseResolveBlock)resolve
|
|
261
|
-
reject:(RCTPromiseRejectBlock)reject) {
|
|
262
|
-
resolve(@([[CloudXCore shared] isInitialized]));
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
RCT_EXPORT_METHOD(isTablet:(RCTPromiseResolveBlock)resolve
|
|
266
|
-
reject:(RCTPromiseRejectBlock)reject) {
|
|
267
|
-
resolve(@(UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad));
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
RCT_EXPORT_METHOD(getVersion:(RCTPromiseResolveBlock)resolve
|
|
271
|
-
reject:(RCTPromiseRejectBlock)reject) {
|
|
272
|
-
resolve([[CloudXCore shared] sdkVersion] ?: @"Unknown");
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
#pragma mark - Configuration
|
|
276
|
-
|
|
277
|
-
RCT_EXPORT_METHOD(setMinLogLevel:(NSString *)level) {
|
|
278
|
-
CLXLogLevel logLevel = CLXLogLevelInfo;
|
|
279
|
-
if ([level isEqualToString:@"verbose"]) logLevel = CLXLogLevelVerbose;
|
|
280
|
-
else if ([level isEqualToString:@"debug"]) logLevel = CLXLogLevelDebug;
|
|
281
|
-
else if ([level isEqualToString:@"info"]) logLevel = CLXLogLevelInfo;
|
|
282
|
-
else if ([level isEqualToString:@"warn"]) logLevel = CLXLogLevelWarn;
|
|
283
|
-
else if ([level isEqualToString:@"error"]) logLevel = CLXLogLevelError;
|
|
284
|
-
else if ([level isEqualToString:@"none"]) logLevel = CLXLogLevelNone;
|
|
285
|
-
[CloudXCore setMinLogLevel:logLevel];
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
RCT_EXPORT_METHOD(setVisualDebuggingEnabled:(BOOL)enabled) {
|
|
289
|
-
[CloudXCore setVisualDebuggingEnabled:enabled];
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
#pragma mark - User Targeting
|
|
293
|
-
|
|
294
|
-
RCT_EXPORT_METHOD(setHashedUserID:(NSString *)hashedUserID) {
|
|
295
|
-
[[CloudXCore shared] setHashedUserID:hashedUserID];
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
RCT_EXPORT_METHOD(setUserKeyValue:(NSString *)key value:(NSString *)value) {
|
|
299
|
-
[[CloudXCore shared] setUserKeyValue:key value:value];
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
RCT_EXPORT_METHOD(setAppKeyValue:(NSString *)key value:(NSString *)value) {
|
|
303
|
-
[[CloudXCore shared] setAppKeyValue:key value:value];
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
RCT_EXPORT_METHOD(clearAllKeyValues) {
|
|
307
|
-
[[CloudXCore shared] clearAllKeyValues];
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
#pragma mark - Banner (Programmatic)
|
|
311
|
-
|
|
312
|
-
RCT_EXPORT_METHOD(createBanner:(NSString *)adUnitId position:(NSString *)position) {
|
|
313
|
-
UIViewController *vc = RCTPresentedViewController();
|
|
314
|
-
if (!vc) {
|
|
315
|
-
[self sendEventWithName:kOnBannerAdLoadFailedEvent body:@{
|
|
316
|
-
@"adUnitId": adUnitId ?: @"",
|
|
317
|
-
@"code": @(-1),
|
|
318
|
-
@"message": @"No view controller available"
|
|
319
|
-
}];
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
CLXBannerAdView *oldBanner = self.banners[adUnitId];
|
|
324
|
-
if (oldBanner) {
|
|
325
|
-
oldBanner.delegate = nil;
|
|
326
|
-
oldBanner.revenueDelegate = nil;
|
|
327
|
-
[oldBanner removeFromSuperview];
|
|
328
|
-
[oldBanner stopAutoRefresh];
|
|
329
|
-
[oldBanner destroy];
|
|
330
|
-
[self.banners removeObjectForKey:adUnitId];
|
|
331
|
-
[_windowPositionedAds removeObject:adUnitId];
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
CLXBannerAdView *banner = [[CloudXCore shared] createBannerWithAdUnitId:adUnitId viewController:vc];
|
|
335
|
-
banner.delegate = self;
|
|
336
|
-
banner.revenueDelegate = self;
|
|
337
|
-
banner.hidden = YES;
|
|
338
|
-
self.banners[adUnitId] = banner;
|
|
339
|
-
|
|
340
|
-
_adViewPositions[adUnitId] = position;
|
|
341
|
-
_adViewOffsets[adUnitId] = [NSValue valueWithCGPoint:CGPointZero];
|
|
342
|
-
|
|
343
|
-
[self attachAdView:banner toWindowWithPosition:position isMREC:NO xOffset:0 yOffset:0];
|
|
344
|
-
[_windowPositionedAds addObject:adUnitId];
|
|
345
|
-
|
|
346
|
-
[banner load];
|
|
347
|
-
|
|
348
|
-
if ([_adUnitIdsToShowAfterCreate containsObject:adUnitId]) {
|
|
349
|
-
banner.hidden = NO;
|
|
350
|
-
[_adUnitIdsToShowAfterCreate removeObject:adUnitId];
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
RCT_EXPORT_METHOD(createBannerWithOffsets:(NSString *)adUnitId
|
|
355
|
-
position:(NSString *)position
|
|
356
|
-
xOffset:(double)xOffset
|
|
357
|
-
yOffset:(double)yOffset) {
|
|
358
|
-
UIViewController *vc = RCTPresentedViewController();
|
|
359
|
-
if (!vc) {
|
|
360
|
-
[self sendEventWithName:kOnBannerAdLoadFailedEvent body:@{
|
|
361
|
-
@"adUnitId": adUnitId ?: @"",
|
|
362
|
-
@"code": @(-1),
|
|
363
|
-
@"message": @"No view controller available"
|
|
364
|
-
}];
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
CLXBannerAdView *oldBanner = self.banners[adUnitId];
|
|
369
|
-
if (oldBanner) {
|
|
370
|
-
oldBanner.delegate = nil;
|
|
371
|
-
oldBanner.revenueDelegate = nil;
|
|
372
|
-
[oldBanner removeFromSuperview];
|
|
373
|
-
[oldBanner stopAutoRefresh];
|
|
374
|
-
[oldBanner destroy];
|
|
375
|
-
[self.banners removeObjectForKey:adUnitId];
|
|
376
|
-
[_windowPositionedAds removeObject:adUnitId];
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
CLXBannerAdView *banner = [[CloudXCore shared] createBannerWithAdUnitId:adUnitId viewController:vc];
|
|
380
|
-
banner.delegate = self;
|
|
381
|
-
banner.revenueDelegate = self;
|
|
382
|
-
banner.hidden = YES;
|
|
383
|
-
self.banners[adUnitId] = banner;
|
|
384
|
-
|
|
385
|
-
_adViewPositions[adUnitId] = position;
|
|
386
|
-
_adViewOffsets[adUnitId] = [NSValue valueWithCGPoint:CGPointMake(xOffset, yOffset)];
|
|
387
|
-
|
|
388
|
-
[self attachAdView:banner toWindowWithPosition:position isMREC:NO xOffset:(CGFloat)xOffset yOffset:(CGFloat)yOffset];
|
|
389
|
-
[_windowPositionedAds addObject:adUnitId];
|
|
390
|
-
|
|
391
|
-
[banner load];
|
|
392
|
-
|
|
393
|
-
if ([_adUnitIdsToShowAfterCreate containsObject:adUnitId]) {
|
|
394
|
-
banner.hidden = NO;
|
|
395
|
-
[_adUnitIdsToShowAfterCreate removeObject:adUnitId];
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
RCT_EXPORT_METHOD(showBanner:(NSString *)adUnitId) {
|
|
400
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
401
|
-
if (banner) {
|
|
402
|
-
banner.hidden = NO;
|
|
403
|
-
} else {
|
|
404
|
-
[_adUnitIdsToShowAfterCreate addObject:adUnitId];
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
RCT_EXPORT_METHOD(hideBanner:(NSString *)adUnitId) {
|
|
409
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
410
|
-
if (banner) banner.hidden = YES;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
RCT_EXPORT_METHOD(destroyBanner:(NSString *)adUnitId) {
|
|
414
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
415
|
-
if (banner) {
|
|
416
|
-
[banner removeFromSuperview];
|
|
417
|
-
[banner stopAutoRefresh];
|
|
418
|
-
[banner destroy];
|
|
419
|
-
[self.banners removeObjectForKey:adUnitId];
|
|
420
|
-
[_windowPositionedAds removeObject:adUnitId];
|
|
421
|
-
[_adViewPositions removeObjectForKey:adUnitId];
|
|
422
|
-
[_adViewOffsets removeObjectForKey:adUnitId];
|
|
423
|
-
[_adUnitIdsToShowAfterCreate removeObject:adUnitId];
|
|
424
|
-
UIView *bg = _safeAreaBackgrounds[adUnitId];
|
|
425
|
-
if (bg) { [bg removeFromSuperview]; [_safeAreaBackgrounds removeObjectForKey:adUnitId]; }
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
RCT_EXPORT_METHOD(setBannerPlacement:(NSString *)adUnitId placement:(NSString *)placement) {
|
|
430
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
431
|
-
if (banner) banner.placement = placement;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
RCT_EXPORT_METHOD(setBannerCustomData:(NSString *)adUnitId customData:(NSString *)customData) {
|
|
435
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
436
|
-
if (banner) banner.customData = customData;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
RCT_EXPORT_METHOD(startBannerAutoRefresh:(NSString *)adUnitId) {
|
|
440
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
441
|
-
if (banner) [banner startAutoRefresh];
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
RCT_EXPORT_METHOD(stopBannerAutoRefresh:(NSString *)adUnitId) {
|
|
445
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
446
|
-
if (banner) [banner stopAutoRefresh];
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
#pragma mark - MREC (Programmatic)
|
|
450
|
-
|
|
451
|
-
RCT_EXPORT_METHOD(createMRec:(NSString *)adUnitId position:(NSString *)position) {
|
|
452
|
-
UIViewController *vc = RCTPresentedViewController();
|
|
453
|
-
if (!vc) {
|
|
454
|
-
[self sendEventWithName:kOnMRecAdLoadFailedEvent body:@{
|
|
455
|
-
@"adUnitId": adUnitId ?: @"",
|
|
456
|
-
@"code": @(-1),
|
|
457
|
-
@"message": @"No view controller available"
|
|
458
|
-
}];
|
|
459
|
-
return;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
CLXBannerAdView *oldMrec = self.mrecs[adUnitId];
|
|
463
|
-
if (oldMrec) {
|
|
464
|
-
oldMrec.delegate = nil;
|
|
465
|
-
oldMrec.revenueDelegate = nil;
|
|
466
|
-
[oldMrec removeFromSuperview];
|
|
467
|
-
[oldMrec stopAutoRefresh];
|
|
468
|
-
[oldMrec destroy];
|
|
469
|
-
[self.mrecs removeObjectForKey:adUnitId];
|
|
470
|
-
[_windowPositionedAds removeObject:adUnitId];
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
CLXBannerAdView *mrec = [[CloudXCore shared] createMRECWithAdUnitId:adUnitId viewController:vc];
|
|
474
|
-
mrec.delegate = self;
|
|
475
|
-
mrec.revenueDelegate = self;
|
|
476
|
-
mrec.hidden = YES;
|
|
477
|
-
self.mrecs[adUnitId] = mrec;
|
|
478
|
-
|
|
479
|
-
_adViewPositions[adUnitId] = position;
|
|
480
|
-
_adViewOffsets[adUnitId] = [NSValue valueWithCGPoint:CGPointZero];
|
|
481
|
-
|
|
482
|
-
[self attachAdView:mrec toWindowWithPosition:position isMREC:YES xOffset:0 yOffset:0];
|
|
483
|
-
[_windowPositionedAds addObject:adUnitId];
|
|
484
|
-
|
|
485
|
-
[mrec load];
|
|
486
|
-
|
|
487
|
-
if ([_adUnitIdsToShowAfterCreate containsObject:adUnitId]) {
|
|
488
|
-
mrec.hidden = NO;
|
|
489
|
-
[_adUnitIdsToShowAfterCreate removeObject:adUnitId];
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
RCT_EXPORT_METHOD(createMRecWithOffsets:(NSString *)adUnitId
|
|
494
|
-
position:(NSString *)position
|
|
495
|
-
xOffset:(double)xOffset
|
|
496
|
-
yOffset:(double)yOffset) {
|
|
497
|
-
UIViewController *vc = RCTPresentedViewController();
|
|
498
|
-
if (!vc) {
|
|
499
|
-
[self sendEventWithName:kOnMRecAdLoadFailedEvent body:@{
|
|
500
|
-
@"adUnitId": adUnitId ?: @"",
|
|
501
|
-
@"code": @(-1),
|
|
502
|
-
@"message": @"No view controller available"
|
|
503
|
-
}];
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
CLXBannerAdView *oldMrec = self.mrecs[adUnitId];
|
|
508
|
-
if (oldMrec) {
|
|
509
|
-
oldMrec.delegate = nil;
|
|
510
|
-
oldMrec.revenueDelegate = nil;
|
|
511
|
-
[oldMrec removeFromSuperview];
|
|
512
|
-
[oldMrec stopAutoRefresh];
|
|
513
|
-
[oldMrec destroy];
|
|
514
|
-
[self.mrecs removeObjectForKey:adUnitId];
|
|
515
|
-
[_windowPositionedAds removeObject:adUnitId];
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
CLXBannerAdView *mrec = [[CloudXCore shared] createMRECWithAdUnitId:adUnitId viewController:vc];
|
|
519
|
-
mrec.delegate = self;
|
|
520
|
-
mrec.revenueDelegate = self;
|
|
521
|
-
mrec.hidden = YES;
|
|
522
|
-
self.mrecs[adUnitId] = mrec;
|
|
523
|
-
|
|
524
|
-
_adViewPositions[adUnitId] = position;
|
|
525
|
-
_adViewOffsets[adUnitId] = [NSValue valueWithCGPoint:CGPointMake(xOffset, yOffset)];
|
|
526
|
-
|
|
527
|
-
[self attachAdView:mrec toWindowWithPosition:position isMREC:YES xOffset:(CGFloat)xOffset yOffset:(CGFloat)yOffset];
|
|
528
|
-
[_windowPositionedAds addObject:adUnitId];
|
|
529
|
-
|
|
530
|
-
[mrec load];
|
|
531
|
-
|
|
532
|
-
if ([_adUnitIdsToShowAfterCreate containsObject:adUnitId]) {
|
|
533
|
-
mrec.hidden = NO;
|
|
534
|
-
[_adUnitIdsToShowAfterCreate removeObject:adUnitId];
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
RCT_EXPORT_METHOD(showMRec:(NSString *)adUnitId) {
|
|
539
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
540
|
-
if (mrec) {
|
|
541
|
-
mrec.hidden = NO;
|
|
542
|
-
} else {
|
|
543
|
-
[_adUnitIdsToShowAfterCreate addObject:adUnitId];
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
RCT_EXPORT_METHOD(hideMRec:(NSString *)adUnitId) {
|
|
548
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
549
|
-
if (mrec) mrec.hidden = YES;
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
RCT_EXPORT_METHOD(destroyMRec:(NSString *)adUnitId) {
|
|
553
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
554
|
-
if (mrec) {
|
|
555
|
-
[mrec removeFromSuperview];
|
|
556
|
-
[mrec stopAutoRefresh];
|
|
557
|
-
[mrec destroy];
|
|
558
|
-
[self.mrecs removeObjectForKey:adUnitId];
|
|
559
|
-
[_windowPositionedAds removeObject:adUnitId];
|
|
560
|
-
[_adViewPositions removeObjectForKey:adUnitId];
|
|
561
|
-
[_adViewOffsets removeObjectForKey:adUnitId];
|
|
562
|
-
[_adUnitIdsToShowAfterCreate removeObject:adUnitId];
|
|
563
|
-
UIView *bg = _safeAreaBackgrounds[adUnitId];
|
|
564
|
-
if (bg) { [bg removeFromSuperview]; [_safeAreaBackgrounds removeObjectForKey:adUnitId]; }
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
RCT_EXPORT_METHOD(setMRecPlacement:(NSString *)adUnitId placement:(NSString *)placement) {
|
|
569
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
570
|
-
if (mrec) mrec.placement = placement;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
RCT_EXPORT_METHOD(setMRecCustomData:(NSString *)adUnitId customData:(NSString *)customData) {
|
|
574
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
575
|
-
if (mrec) mrec.customData = customData;
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
RCT_EXPORT_METHOD(startMRecAutoRefresh:(NSString *)adUnitId) {
|
|
579
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
580
|
-
if (mrec) [mrec startAutoRefresh];
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
RCT_EXPORT_METHOD(stopMRecAutoRefresh:(NSString *)adUnitId) {
|
|
584
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
585
|
-
if (mrec) [mrec stopAutoRefresh];
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
#pragma mark - Dynamic Repositioning
|
|
589
|
-
|
|
590
|
-
RCT_EXPORT_METHOD(updateBannerPosition:(NSString *)adUnitId position:(NSString *)position) {
|
|
591
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
592
|
-
if (!banner) return;
|
|
593
|
-
|
|
594
|
-
_adViewPositions[adUnitId] = position;
|
|
595
|
-
CGPoint offset = [_adViewOffsets[adUnitId] CGPointValue];
|
|
596
|
-
|
|
597
|
-
[banner removeFromSuperview];
|
|
598
|
-
[self attachAdView:banner toWindowWithPosition:position isMREC:NO xOffset:offset.x yOffset:offset.y];
|
|
599
|
-
[self repositionSafeAreaBackgroundForAdUnitId:adUnitId];
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
RCT_EXPORT_METHOD(updateMRecPosition:(NSString *)adUnitId position:(NSString *)position) {
|
|
603
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
604
|
-
if (!mrec) return;
|
|
605
|
-
|
|
606
|
-
_adViewPositions[adUnitId] = position;
|
|
607
|
-
CGPoint offset = [_adViewOffsets[adUnitId] CGPointValue];
|
|
608
|
-
|
|
609
|
-
[mrec removeFromSuperview];
|
|
610
|
-
[self attachAdView:mrec toWindowWithPosition:position isMREC:YES xOffset:offset.x yOffset:offset.y];
|
|
611
|
-
[self repositionSafeAreaBackgroundForAdUnitId:adUnitId];
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
RCT_EXPORT_METHOD(updateBannerOffsets:(NSString *)adUnitId xOffset:(double)xOffset yOffset:(double)yOffset) {
|
|
615
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
616
|
-
if (!banner) return;
|
|
617
|
-
|
|
618
|
-
_adViewOffsets[adUnitId] = [NSValue valueWithCGPoint:CGPointMake(xOffset, yOffset)];
|
|
619
|
-
NSString *position = _adViewPositions[adUnitId] ?: @"BOTTOM_CENTER";
|
|
620
|
-
|
|
621
|
-
[banner removeFromSuperview];
|
|
622
|
-
[self attachAdView:banner toWindowWithPosition:position isMREC:NO xOffset:(CGFloat)xOffset yOffset:(CGFloat)yOffset];
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
RCT_EXPORT_METHOD(updateMRecOffsets:(NSString *)adUnitId xOffset:(double)xOffset yOffset:(double)yOffset) {
|
|
626
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
627
|
-
if (!mrec) return;
|
|
628
|
-
|
|
629
|
-
_adViewOffsets[adUnitId] = [NSValue valueWithCGPoint:CGPointMake(xOffset, yOffset)];
|
|
630
|
-
NSString *position = _adViewPositions[adUnitId] ?: @"BOTTOM_CENTER";
|
|
631
|
-
|
|
632
|
-
[mrec removeFromSuperview];
|
|
633
|
-
[self attachAdView:mrec toWindowWithPosition:position isMREC:YES xOffset:(CGFloat)xOffset yOffset:(CGFloat)yOffset];
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
#pragma mark - Background Color
|
|
637
|
-
|
|
638
|
-
RCT_EXPORT_METHOD(setBannerBackgroundColor:(NSString *)adUnitId hexColorString:(NSString *)hexColorString) {
|
|
639
|
-
CLXBannerAdView *banner = self.banners[adUnitId];
|
|
640
|
-
if (!banner) return;
|
|
641
|
-
|
|
642
|
-
UIColor *color = [self colorFromHexString:hexColorString];
|
|
643
|
-
banner.backgroundColor = color;
|
|
644
|
-
[self updateSafeAreaBackgroundForAdUnitId:adUnitId color:color];
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
RCT_EXPORT_METHOD(setMRecBackgroundColor:(NSString *)adUnitId hexColorString:(NSString *)hexColorString) {
|
|
648
|
-
CLXBannerAdView *mrec = self.mrecs[adUnitId];
|
|
649
|
-
if (!mrec) return;
|
|
650
|
-
|
|
651
|
-
UIColor *color = [self colorFromHexString:hexColorString];
|
|
652
|
-
mrec.backgroundColor = color;
|
|
653
|
-
[self updateSafeAreaBackgroundForAdUnitId:adUnitId color:color];
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
#pragma mark - Interstitial
|
|
657
|
-
|
|
658
|
-
RCT_EXPORT_METHOD(loadInterstitial:(NSString *)adUnitId) {
|
|
659
|
-
CLXInterstitial *interstitial = self.interstitials[adUnitId];
|
|
660
|
-
if (!interstitial) {
|
|
661
|
-
interstitial = [[CloudXCore shared] createInterstitialWithAdUnitId:adUnitId];
|
|
662
|
-
interstitial.delegate = self;
|
|
663
|
-
interstitial.revenueDelegate = self;
|
|
664
|
-
self.interstitials[adUnitId] = interstitial;
|
|
665
|
-
}
|
|
666
|
-
[interstitial load];
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
RCT_EXPORT_METHOD(isInterstitialReady:(NSString *)adUnitId
|
|
670
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
671
|
-
reject:(RCTPromiseRejectBlock)reject) {
|
|
672
|
-
CLXInterstitial *interstitial = self.interstitials[adUnitId];
|
|
673
|
-
resolve(@(interstitial ? [interstitial isReady] : NO));
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
RCT_EXPORT_METHOD(showInterstitial:(NSString *)adUnitId
|
|
677
|
-
placement:(NSString *)placement
|
|
678
|
-
customData:(NSString *)customData) {
|
|
679
|
-
CLXInterstitial *interstitial = self.interstitials[adUnitId];
|
|
680
|
-
if (!interstitial) {
|
|
681
|
-
[self sendEventWithName:kOnInterstitialDisplayFailedEvent body:@{
|
|
682
|
-
@"adUnitId": adUnitId ?: @"",
|
|
683
|
-
@"code": @(-1),
|
|
684
|
-
@"message": @"Interstitial not loaded"
|
|
685
|
-
}];
|
|
686
|
-
return;
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
UIViewController *vc = RCTPresentedViewController();
|
|
690
|
-
if (!vc) {
|
|
691
|
-
[self sendEventWithName:kOnInterstitialDisplayFailedEvent body:@{
|
|
692
|
-
@"adUnitId": adUnitId ?: @"",
|
|
693
|
-
@"code": @(-1),
|
|
694
|
-
@"message": @"No view controller available"
|
|
695
|
-
}];
|
|
696
|
-
return;
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
// Show unconditionally — the native SDK fires didFailToDisplayAd: if the ad
|
|
700
|
-
// cannot be presented, ensuring JS always receives a display-failed event.
|
|
701
|
-
[interstitial showFromViewController:vc placement:placement customData:customData];
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
RCT_EXPORT_METHOD(destroyInterstitial:(NSString *)adUnitId) {
|
|
705
|
-
CLXInterstitial *interstitial = self.interstitials[adUnitId];
|
|
706
|
-
if (interstitial) {
|
|
707
|
-
[interstitial destroy];
|
|
708
|
-
[self.interstitials removeObjectForKey:adUnitId];
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
#pragma mark - Rewarded
|
|
713
|
-
|
|
714
|
-
RCT_EXPORT_METHOD(loadRewarded:(NSString *)adUnitId) {
|
|
715
|
-
CLXRewarded *rewarded = self.rewardeds[adUnitId];
|
|
716
|
-
if (!rewarded) {
|
|
717
|
-
rewarded = [[CloudXCore shared] createRewardedWithAdUnitId:adUnitId];
|
|
718
|
-
rewarded.delegate = self;
|
|
719
|
-
rewarded.revenueDelegate = self;
|
|
720
|
-
self.rewardeds[adUnitId] = rewarded;
|
|
721
|
-
}
|
|
722
|
-
[rewarded load];
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
RCT_EXPORT_METHOD(isRewardedReady:(NSString *)adUnitId
|
|
726
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
727
|
-
reject:(RCTPromiseRejectBlock)reject) {
|
|
728
|
-
CLXRewarded *rewarded = self.rewardeds[adUnitId];
|
|
729
|
-
resolve(@(rewarded ? [rewarded isReady] : NO));
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
RCT_EXPORT_METHOD(showRewarded:(NSString *)adUnitId
|
|
733
|
-
placement:(NSString *)placement
|
|
734
|
-
customData:(NSString *)customData) {
|
|
735
|
-
CLXRewarded *rewarded = self.rewardeds[adUnitId];
|
|
736
|
-
if (!rewarded) {
|
|
737
|
-
[self sendEventWithName:kOnRewardedAdDisplayFailedEvent body:@{
|
|
738
|
-
@"adUnitId": adUnitId ?: @"",
|
|
739
|
-
@"code": @(-1),
|
|
740
|
-
@"message": @"Rewarded ad not loaded"
|
|
741
|
-
}];
|
|
742
|
-
return;
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
UIViewController *vc = RCTPresentedViewController();
|
|
746
|
-
if (!vc) {
|
|
747
|
-
[self sendEventWithName:kOnRewardedAdDisplayFailedEvent body:@{
|
|
748
|
-
@"adUnitId": adUnitId ?: @"",
|
|
749
|
-
@"code": @(-1),
|
|
750
|
-
@"message": @"No view controller available"
|
|
751
|
-
}];
|
|
752
|
-
return;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
// Show unconditionally — the native SDK fires didFailToDisplayAd: if the ad
|
|
756
|
-
// cannot be presented, ensuring JS always receives a display-failed event.
|
|
757
|
-
[rewarded showFromViewController:vc placement:placement customData:customData];
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
RCT_EXPORT_METHOD(destroyRewarded:(NSString *)adUnitId) {
|
|
761
|
-
CLXRewarded *rewarded = self.rewardeds[adUnitId];
|
|
762
|
-
if (rewarded) {
|
|
763
|
-
[rewarded destroy];
|
|
764
|
-
[self.rewardeds removeObjectForKey:adUnitId];
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
#pragma mark - CLXAdDelegate
|
|
769
|
-
|
|
770
|
-
- (void)didLoadAd:(CLXAd *)ad {
|
|
771
|
-
NSString *adUnitId = ad.adUnitId;
|
|
772
|
-
if (!adUnitId) return;
|
|
773
|
-
|
|
774
|
-
NSDictionary *data = [self adInfoFromCLXAd:ad];
|
|
775
|
-
|
|
776
|
-
if (self.banners[adUnitId]) {
|
|
777
|
-
[self sendEventWithName:kOnBannerAdLoadedEvent body:data];
|
|
778
|
-
} else if (self.mrecs[adUnitId]) {
|
|
779
|
-
[self sendEventWithName:kOnMRecAdLoadedEvent body:data];
|
|
780
|
-
} else if (self.interstitials[adUnitId]) {
|
|
781
|
-
[self sendEventWithName:kOnInterstitialLoadedEvent body:data];
|
|
782
|
-
} else if (self.rewardeds[adUnitId]) {
|
|
783
|
-
[self sendEventWithName:kOnRewardedAdLoadedEvent body:data];
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
- (void)didFailToLoadAd:(NSString *)adUnitId error:(CLXError *)error {
|
|
788
|
-
NSDictionary *data = @{
|
|
789
|
-
@"adUnitId": adUnitId ?: @"",
|
|
790
|
-
@"code": @(error.code),
|
|
791
|
-
@"message": error.localizedDescription ?: @"Unknown error",
|
|
792
|
-
};
|
|
793
|
-
|
|
794
|
-
if (self.banners[adUnitId]) {
|
|
795
|
-
[self sendEventWithName:kOnBannerAdLoadFailedEvent body:data];
|
|
796
|
-
} else if (self.mrecs[adUnitId]) {
|
|
797
|
-
[self sendEventWithName:kOnMRecAdLoadFailedEvent body:data];
|
|
798
|
-
} else if (self.interstitials[adUnitId]) {
|
|
799
|
-
[self sendEventWithName:kOnInterstitialLoadFailedEvent body:data];
|
|
800
|
-
} else if (self.rewardeds[adUnitId]) {
|
|
801
|
-
[self sendEventWithName:kOnRewardedAdLoadFailedEvent body:data];
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
- (void)didClickAd:(CLXAd *)ad {
|
|
806
|
-
NSString *adUnitId = ad.adUnitId;
|
|
807
|
-
if (!adUnitId) return;
|
|
808
|
-
NSDictionary *data = [self adInfoFromCLXAd:ad];
|
|
809
|
-
|
|
810
|
-
if (self.banners[adUnitId]) {
|
|
811
|
-
[self sendEventWithName:kOnBannerAdClickedEvent body:data];
|
|
812
|
-
} else if (self.mrecs[adUnitId]) {
|
|
813
|
-
[self sendEventWithName:kOnMRecAdClickedEvent body:data];
|
|
814
|
-
} else if (self.interstitials[adUnitId]) {
|
|
815
|
-
[self sendEventWithName:kOnInterstitialClickedEvent body:data];
|
|
816
|
-
} else if (self.rewardeds[adUnitId]) {
|
|
817
|
-
[self sendEventWithName:kOnRewardedAdClickedEvent body:data];
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
|
|
821
|
-
#pragma mark - CLXFullscreenAdDelegate
|
|
822
|
-
|
|
823
|
-
- (void)didDisplayAd:(CLXAd *)ad {
|
|
824
|
-
NSString *adUnitId = ad.adUnitId;
|
|
825
|
-
if (!adUnitId) return;
|
|
826
|
-
NSDictionary *data = [self adInfoFromCLXAd:ad];
|
|
827
|
-
|
|
828
|
-
if (self.interstitials[adUnitId]) {
|
|
829
|
-
[self sendEventWithName:kOnInterstitialDisplayedEvent body:data];
|
|
830
|
-
} else if (self.rewardeds[adUnitId]) {
|
|
831
|
-
[self sendEventWithName:kOnRewardedAdDisplayedEvent body:data];
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
- (void)didFailToDisplayAd:(CLXAd *)ad error:(CLXError *)error {
|
|
836
|
-
NSString *adUnitId = ad.adUnitId;
|
|
837
|
-
if (!adUnitId) return;
|
|
838
|
-
|
|
839
|
-
NSMutableDictionary *data = [[self adInfoFromCLXAd:ad] mutableCopy];
|
|
840
|
-
data[@"code"] = @(error.code);
|
|
841
|
-
data[@"message"] = error.localizedDescription ?: @"Display failed";
|
|
842
|
-
|
|
843
|
-
if (self.interstitials[adUnitId]) {
|
|
844
|
-
[self sendEventWithName:kOnInterstitialDisplayFailedEvent body:data];
|
|
845
|
-
} else if (self.rewardeds[adUnitId]) {
|
|
846
|
-
[self sendEventWithName:kOnRewardedAdDisplayFailedEvent body:data];
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
- (void)didHideAd:(CLXAd *)ad {
|
|
851
|
-
NSString *adUnitId = ad.adUnitId;
|
|
852
|
-
if (!adUnitId) return;
|
|
853
|
-
NSDictionary *data = [self adInfoFromCLXAd:ad];
|
|
854
|
-
|
|
855
|
-
if (self.interstitials[adUnitId]) {
|
|
856
|
-
[self sendEventWithName:kOnInterstitialHiddenEvent body:data];
|
|
857
|
-
} else if (self.rewardeds[adUnitId]) {
|
|
858
|
-
[self sendEventWithName:kOnRewardedAdHiddenEvent body:data];
|
|
859
|
-
}
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
#pragma mark - CLXRewardedDelegate
|
|
863
|
-
|
|
864
|
-
- (void)didRewardUserForAd:(CLXAd *)ad withReward:(CLXReward *)reward {
|
|
865
|
-
NSString *adUnitId = ad.adUnitId;
|
|
866
|
-
if (!adUnitId) return;
|
|
867
|
-
|
|
868
|
-
NSMutableDictionary *data = [[self adInfoFromCLXAd:ad] mutableCopy];
|
|
869
|
-
data[@"rewardLabel"] = reward.label ?: @"";
|
|
870
|
-
data[@"rewardAmount"] = @(reward.amount);
|
|
871
|
-
|
|
872
|
-
[self sendEventWithName:kOnRewardedAdReceivedRewardEvent body:data];
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
#pragma mark - CLXBannerDelegate
|
|
876
|
-
|
|
877
|
-
- (void)didExpandAd:(CLXAd *)ad {
|
|
878
|
-
NSString *adUnitId = ad.adUnitId;
|
|
879
|
-
if (!adUnitId) return;
|
|
880
|
-
NSDictionary *data = [self adInfoFromCLXAd:ad];
|
|
881
|
-
|
|
882
|
-
if (self.banners[adUnitId]) {
|
|
883
|
-
[self sendEventWithName:kOnBannerAdExpandedEvent body:data];
|
|
884
|
-
} else if (self.mrecs[adUnitId]) {
|
|
885
|
-
[self sendEventWithName:kOnMRecAdExpandedEvent body:data];
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
- (void)didCollapseAd:(CLXAd *)ad {
|
|
890
|
-
NSString *adUnitId = ad.adUnitId;
|
|
891
|
-
if (!adUnitId) return;
|
|
892
|
-
NSDictionary *data = [self adInfoFromCLXAd:ad];
|
|
893
|
-
|
|
894
|
-
if (self.banners[adUnitId]) {
|
|
895
|
-
[self sendEventWithName:kOnBannerAdCollapsedEvent body:data];
|
|
896
|
-
} else if (self.mrecs[adUnitId]) {
|
|
897
|
-
[self sendEventWithName:kOnMRecAdCollapsedEvent body:data];
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
#pragma mark - CLXAdRevenueDelegate
|
|
902
|
-
|
|
903
|
-
- (void)didPayRevenueForAd:(CLXAd *)ad {
|
|
904
|
-
NSString *adUnitId = ad.adUnitId;
|
|
905
|
-
if (!adUnitId) return;
|
|
906
|
-
NSDictionary *data = [self adInfoFromCLXAd:ad];
|
|
907
|
-
|
|
908
|
-
if (self.banners[adUnitId]) {
|
|
909
|
-
[self sendEventWithName:kOnBannerAdRevenuePaid body:data];
|
|
910
|
-
} else if (self.mrecs[adUnitId]) {
|
|
911
|
-
[self sendEventWithName:kOnMRecAdRevenuePaid body:data];
|
|
912
|
-
} else if (self.interstitials[adUnitId]) {
|
|
913
|
-
[self sendEventWithName:kOnInterstitialAdRevenuePaid body:data];
|
|
914
|
-
} else if (self.rewardeds[adUnitId]) {
|
|
915
|
-
[self sendEventWithName:kOnRewardedAdRevenuePaid body:data];
|
|
916
|
-
}
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
#pragma mark - Programmatic Positioning
|
|
920
|
-
|
|
921
|
-
- (UIWindow *)clx_keyWindow {
|
|
922
|
-
UIWindow *foundWindow = nil;
|
|
923
|
-
for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) {
|
|
924
|
-
if (scene.activationState != UISceneActivationStateForegroundActive) continue;
|
|
925
|
-
if (![scene isKindOfClass:[UIWindowScene class]]) continue;
|
|
926
|
-
for (UIWindow *window in ((UIWindowScene *)scene).windows) {
|
|
927
|
-
if (window.isKeyWindow) {
|
|
928
|
-
foundWindow = window;
|
|
929
|
-
break;
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
if (foundWindow) break;
|
|
933
|
-
}
|
|
934
|
-
return foundWindow ?: UIApplication.sharedApplication.delegate.window;
|
|
935
|
-
}
|
|
936
|
-
|
|
937
|
-
- (void)attachAdView:(CLXBannerAdView *)adView
|
|
938
|
-
toWindowWithPosition:(NSString *)position
|
|
939
|
-
isMREC:(BOOL)isMREC
|
|
940
|
-
xOffset:(CGFloat)xOffset
|
|
941
|
-
yOffset:(CGFloat)yOffset {
|
|
942
|
-
UIWindow *window = [self clx_keyWindow];
|
|
943
|
-
if (!window) return;
|
|
944
|
-
|
|
945
|
-
[adView removeFromSuperview];
|
|
946
|
-
adView.translatesAutoresizingMaskIntoConstraints = NO;
|
|
947
|
-
[window addSubview:adView];
|
|
948
|
-
|
|
949
|
-
CGFloat adWidth = isMREC ? 300.0 : 320.0;
|
|
950
|
-
CGFloat adHeight = isMREC ? 250.0 : 50.0;
|
|
951
|
-
|
|
952
|
-
[NSLayoutConstraint activateConstraints:@[
|
|
953
|
-
[adView.widthAnchor constraintEqualToConstant:adWidth],
|
|
954
|
-
[adView.heightAnchor constraintEqualToConstant:adHeight],
|
|
955
|
-
]];
|
|
956
|
-
|
|
957
|
-
NSString *pos = position.uppercaseString;
|
|
958
|
-
UILayoutGuide *safe = window.safeAreaLayoutGuide;
|
|
959
|
-
|
|
960
|
-
// Positive offsets always mean "inward from the edge":
|
|
961
|
-
// negate x for right-anchored, negate y for bottom-anchored.
|
|
962
|
-
CGFloat adjustedX = [pos containsString:@"RIGHT"] ? -xOffset : xOffset;
|
|
963
|
-
CGFloat adjustedY = [pos containsString:@"BOTTOM"] ? -yOffset : yOffset;
|
|
964
|
-
|
|
965
|
-
if ([pos isEqualToString:@"TOP_LEFT"]) {
|
|
966
|
-
[adView.topAnchor constraintEqualToAnchor:safe.topAnchor constant:adjustedY].active = YES;
|
|
967
|
-
[adView.leadingAnchor constraintEqualToAnchor:safe.leadingAnchor constant:adjustedX].active = YES;
|
|
968
|
-
} else if ([pos isEqualToString:@"TOP_CENTER"]) {
|
|
969
|
-
[adView.topAnchor constraintEqualToAnchor:safe.topAnchor constant:adjustedY].active = YES;
|
|
970
|
-
[adView.centerXAnchor constraintEqualToAnchor:window.centerXAnchor].active = YES;
|
|
971
|
-
} else if ([pos isEqualToString:@"TOP_RIGHT"]) {
|
|
972
|
-
[adView.topAnchor constraintEqualToAnchor:safe.topAnchor constant:adjustedY].active = YES;
|
|
973
|
-
[adView.trailingAnchor constraintEqualToAnchor:safe.trailingAnchor constant:adjustedX].active = YES;
|
|
974
|
-
} else if ([pos isEqualToString:@"CENTER_LEFT"]) {
|
|
975
|
-
[adView.centerYAnchor constraintEqualToAnchor:window.centerYAnchor].active = YES;
|
|
976
|
-
[adView.leadingAnchor constraintEqualToAnchor:safe.leadingAnchor constant:adjustedX].active = YES;
|
|
977
|
-
} else if ([pos isEqualToString:@"CENTERED"]) {
|
|
978
|
-
[adView.centerYAnchor constraintEqualToAnchor:window.centerYAnchor].active = YES;
|
|
979
|
-
[adView.centerXAnchor constraintEqualToAnchor:window.centerXAnchor].active = YES;
|
|
980
|
-
} else if ([pos isEqualToString:@"CENTER_RIGHT"]) {
|
|
981
|
-
[adView.centerYAnchor constraintEqualToAnchor:window.centerYAnchor].active = YES;
|
|
982
|
-
[adView.trailingAnchor constraintEqualToAnchor:safe.trailingAnchor constant:adjustedX].active = YES;
|
|
983
|
-
} else if ([pos isEqualToString:@"BOTTOM_LEFT"]) {
|
|
984
|
-
[adView.bottomAnchor constraintEqualToAnchor:safe.bottomAnchor constant:adjustedY].active = YES;
|
|
985
|
-
[adView.leadingAnchor constraintEqualToAnchor:safe.leadingAnchor constant:adjustedX].active = YES;
|
|
986
|
-
} else if ([pos isEqualToString:@"BOTTOM_RIGHT"]) {
|
|
987
|
-
[adView.bottomAnchor constraintEqualToAnchor:safe.bottomAnchor constant:adjustedY].active = YES;
|
|
988
|
-
[adView.trailingAnchor constraintEqualToAnchor:safe.trailingAnchor constant:adjustedX].active = YES;
|
|
989
|
-
} else {
|
|
990
|
-
[adView.bottomAnchor constraintEqualToAnchor:safe.bottomAnchor constant:adjustedY].active = YES;
|
|
991
|
-
[adView.centerXAnchor constraintEqualToAnchor:window.centerXAnchor].active = YES;
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
|
|
995
|
-
#pragma mark - Safe Area Background
|
|
996
|
-
|
|
997
|
-
- (UIColor *)colorFromHexString:(NSString *)hexString {
|
|
998
|
-
NSString *hex = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""];
|
|
999
|
-
unsigned int hexValue = 0;
|
|
1000
|
-
[[NSScanner scannerWithString:hex] scanHexInt:&hexValue];
|
|
1001
|
-
|
|
1002
|
-
if (hex.length == 8) {
|
|
1003
|
-
CGFloat r = ((hexValue >> 24) & 0xFF) / 255.0;
|
|
1004
|
-
CGFloat g = ((hexValue >> 16) & 0xFF) / 255.0;
|
|
1005
|
-
CGFloat b = ((hexValue >> 8) & 0xFF) / 255.0;
|
|
1006
|
-
CGFloat a = (hexValue & 0xFF) / 255.0;
|
|
1007
|
-
return [UIColor colorWithRed:r green:g blue:b alpha:a];
|
|
1008
|
-
}
|
|
1009
|
-
CGFloat r = ((hexValue >> 16) & 0xFF) / 255.0;
|
|
1010
|
-
CGFloat g = ((hexValue >> 8) & 0xFF) / 255.0;
|
|
1011
|
-
CGFloat b = (hexValue & 0xFF) / 255.0;
|
|
1012
|
-
return [UIColor colorWithRed:r green:g blue:b alpha:1.0];
|
|
1013
|
-
}
|
|
1014
|
-
|
|
1015
|
-
- (void)updateSafeAreaBackgroundForAdUnitId:(NSString *)adUnitId color:(UIColor *)color {
|
|
1016
|
-
NSString *position = _adViewPositions[adUnitId];
|
|
1017
|
-
if (!position) return;
|
|
1018
|
-
|
|
1019
|
-
UIWindow *window = [self clx_keyWindow];
|
|
1020
|
-
if (!window) return;
|
|
1021
|
-
|
|
1022
|
-
UIView *bg = _safeAreaBackgrounds[adUnitId];
|
|
1023
|
-
if (!bg) {
|
|
1024
|
-
bg = [[UIView alloc] init];
|
|
1025
|
-
bg.translatesAutoresizingMaskIntoConstraints = NO;
|
|
1026
|
-
_safeAreaBackgrounds[adUnitId] = bg;
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
|
-
[bg removeFromSuperview];
|
|
1030
|
-
bg.backgroundColor = color;
|
|
1031
|
-
[window insertSubview:bg atIndex:0];
|
|
1032
|
-
|
|
1033
|
-
NSString *pos = position.uppercaseString;
|
|
1034
|
-
UILayoutGuide *safe = window.safeAreaLayoutGuide;
|
|
1035
|
-
|
|
1036
|
-
if ([pos containsString:@"TOP"]) {
|
|
1037
|
-
[NSLayoutConstraint activateConstraints:@[
|
|
1038
|
-
[bg.topAnchor constraintEqualToAnchor:window.topAnchor],
|
|
1039
|
-
[bg.bottomAnchor constraintEqualToAnchor:safe.topAnchor],
|
|
1040
|
-
[bg.leadingAnchor constraintEqualToAnchor:window.leadingAnchor],
|
|
1041
|
-
[bg.trailingAnchor constraintEqualToAnchor:window.trailingAnchor],
|
|
1042
|
-
]];
|
|
1043
|
-
} else if ([pos containsString:@"BOTTOM"]) {
|
|
1044
|
-
[NSLayoutConstraint activateConstraints:@[
|
|
1045
|
-
[bg.topAnchor constraintEqualToAnchor:safe.bottomAnchor],
|
|
1046
|
-
[bg.bottomAnchor constraintEqualToAnchor:window.bottomAnchor],
|
|
1047
|
-
[bg.leadingAnchor constraintEqualToAnchor:window.leadingAnchor],
|
|
1048
|
-
[bg.trailingAnchor constraintEqualToAnchor:window.trailingAnchor],
|
|
1049
|
-
]];
|
|
1050
|
-
}
|
|
1051
|
-
}
|
|
1052
|
-
|
|
1053
|
-
- (void)repositionSafeAreaBackgroundForAdUnitId:(NSString *)adUnitId {
|
|
1054
|
-
UIView *bg = _safeAreaBackgrounds[adUnitId];
|
|
1055
|
-
if (!bg) return;
|
|
1056
|
-
[self updateSafeAreaBackgroundForAdUnitId:adUnitId color:bg.backgroundColor];
|
|
1057
|
-
}
|
|
1058
|
-
|
|
1059
|
-
#pragma mark - Helpers
|
|
1060
|
-
|
|
1061
|
-
- (NSDictionary *)adInfoFromCLXAd:(CLXAd *)ad {
|
|
1062
|
-
return @{
|
|
1063
|
-
@"adUnitId": ad.adUnitId ?: @"",
|
|
1064
|
-
@"adFormat": [self adFormatString:ad.adFormat],
|
|
1065
|
-
@"networkName": ad.networkName ?: @"",
|
|
1066
|
-
@"networkPlacement": ad.networkPlacement ?: @"",
|
|
1067
|
-
@"placement": ad.placement ?: @"",
|
|
1068
|
-
@"revenue": ad.revenue ?: @(0),
|
|
1069
|
-
};
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
- (NSString *)adFormatString:(CLXAdFormat)format {
|
|
1073
|
-
switch (format) {
|
|
1074
|
-
case CLXAdFormatBanner: return @"BANNER";
|
|
1075
|
-
case CLXAdFormatMREC: return @"MREC";
|
|
1076
|
-
case CLXAdFormatInterstitial: return @"INTERSTITIAL";
|
|
1077
|
-
case CLXAdFormatRewarded: return @"REWARDED";
|
|
1078
|
-
default: return @"UNKNOWN";
|
|
1079
|
-
}
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
#ifdef RCT_NEW_ARCH_ENABLED
|
|
1083
|
-
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
|
|
1084
|
-
return std::make_shared<facebook::react::NativeCloudXModuleSpecJSI>(params);
|
|
1085
|
-
}
|
|
1086
|
-
#endif
|
|
1087
|
-
|
|
1088
|
-
@end
|