react-native-applovin-max 8.2.0 → 9.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/android/build.gradle +13 -2
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXAdView.java +33 -26
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXAdViewManagerImpl.java +110 -0
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXAdViewUiComponent.java +15 -13
- package/android/src/main/java/com/applovin/reactnative/{AppLovinMAXModule.java → AppLovinMAXModuleImpl.java} +107 -168
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXNativeAdView.java +84 -56
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXNativeAdViewManagerImpl.java +101 -0
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXPackage.java +44 -11
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXUtils.java +56 -0
- package/android/src/newarch/com/applovin/reactnative/AppLovinMAXAdViewManager.java +151 -0
- package/android/src/newarch/com/applovin/reactnative/AppLovinMAXModule.java +453 -0
- package/android/src/newarch/com/applovin/reactnative/AppLovinMAXNativeAdViewManager.java +130 -0
- package/android/src/oldarch/com/applovin/reactnative/AppLovinMAXAdViewManager.java +128 -0
- package/android/src/oldarch/com/applovin/reactnative/AppLovinMAXModule.java +453 -0
- package/android/src/oldarch/com/applovin/reactnative/AppLovinMAXNativeAdViewManager.java +93 -0
- package/ios/AppLovinMAX.h +8 -3
- package/ios/{AppLovinMAX.m → AppLovinMAX.mm} +66 -53
- package/ios/AppLovinMAXAdView.h +7 -2
- package/ios/AppLovinMAXAdView.mm +747 -0
- package/ios/{AppLovinMAXAdViewManager.m → AppLovinMAXAdViewManager.mm} +3 -2
- package/ios/{AppLovinMAXAdViewUIComponent.m → AppLovinMAXAdViewUIComponent.mm} +2 -1
- package/ios/AppLovinMAXNativeAdView.h +15 -4
- package/ios/AppLovinMAXNativeAdView.mm +745 -0
- package/ios/AppLovinMAXNativeAdViewManager.mm +116 -0
- package/lib/commonjs/AdView.js +61 -85
- package/lib/commonjs/AdView.js.map +1 -1
- package/lib/commonjs/AppLovinMAX.js +11 -10
- package/lib/commonjs/AppLovinMAX.js.map +1 -1
- package/lib/commonjs/AppOpenAd.js +8 -10
- package/lib/commonjs/AppOpenAd.js.map +1 -1
- package/lib/commonjs/BannerAd.js +19 -21
- package/lib/commonjs/BannerAd.js.map +1 -1
- package/lib/commonjs/ErrorCode.js +3 -5
- package/lib/commonjs/ErrorCode.js.map +1 -1
- package/lib/commonjs/EventEmitter.js +3 -5
- package/lib/commonjs/EventEmitter.js.map +1 -1
- package/lib/commonjs/InterstitialAd.js +8 -10
- package/lib/commonjs/InterstitialAd.js.map +1 -1
- package/lib/commonjs/MRecAd.js +14 -16
- package/lib/commonjs/MRecAd.js.map +1 -1
- package/lib/commonjs/Privacy.js +3 -5
- package/lib/commonjs/Privacy.js.map +1 -1
- package/lib/commonjs/RewardedAd.js +8 -10
- package/lib/commonjs/RewardedAd.js.map +1 -1
- package/lib/commonjs/Utils.js +25 -0
- package/lib/commonjs/Utils.js.map +1 -0
- package/lib/commonjs/nativeAd/NativeAdView.js +65 -42
- package/lib/commonjs/nativeAd/NativeAdView.js.map +1 -1
- package/lib/commonjs/nativeAd/NativeAdViewComponents.js +51 -47
- package/lib/commonjs/nativeAd/NativeAdViewComponents.js.map +1 -1
- package/lib/commonjs/nativeAd/NativeAdViewProvider.js +38 -8
- package/lib/commonjs/nativeAd/NativeAdViewProvider.js.map +1 -1
- package/lib/commonjs/nativeAd/img/blank_icon.png +0 -0
- package/lib/commonjs/specs/AppLovinMAXAdViewNativeComponent.js +14 -0
- package/lib/commonjs/specs/AppLovinMAXAdViewNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/AppLovinMAXNativeAdViewNativeComponent.js +14 -0
- package/lib/commonjs/specs/AppLovinMAXNativeAdViewNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/NativeAppLovinMAXModule.js +9 -0
- package/lib/commonjs/specs/NativeAppLovinMAXModule.js.map +1 -0
- package/lib/module/AdView.js +56 -81
- package/lib/module/AdView.js.map +1 -1
- package/lib/module/AppLovinMAX.js +7 -7
- package/lib/module/AppLovinMAX.js.map +1 -1
- package/lib/module/AppOpenAd.js +1 -4
- package/lib/module/AppOpenAd.js.map +1 -1
- package/lib/module/BannerAd.js +1 -4
- package/lib/module/BannerAd.js.map +1 -1
- package/lib/module/ErrorCode.js +1 -4
- package/lib/module/ErrorCode.js.map +1 -1
- package/lib/module/EventEmitter.js +2 -4
- package/lib/module/EventEmitter.js.map +1 -1
- package/lib/module/InterstitialAd.js +2 -5
- package/lib/module/InterstitialAd.js.map +1 -1
- package/lib/module/MRecAd.js +1 -4
- package/lib/module/MRecAd.js.map +1 -1
- package/lib/module/Privacy.js +1 -4
- package/lib/module/Privacy.js.map +1 -1
- package/lib/module/RewardedAd.js +2 -5
- package/lib/module/RewardedAd.js.map +1 -1
- package/lib/module/Utils.js +17 -0
- package/lib/module/Utils.js.map +1 -0
- package/lib/module/nativeAd/NativeAdView.js +63 -40
- package/lib/module/nativeAd/NativeAdView.js.map +1 -1
- package/lib/module/nativeAd/NativeAdViewComponents.js +53 -49
- package/lib/module/nativeAd/NativeAdViewComponents.js.map +1 -1
- package/lib/module/nativeAd/NativeAdViewProvider.js +39 -9
- package/lib/module/nativeAd/NativeAdViewProvider.js.map +1 -1
- package/lib/module/nativeAd/img/blank_icon.png +0 -0
- package/lib/module/specs/AppLovinMAXAdViewNativeComponent.js +7 -0
- package/lib/module/specs/AppLovinMAXAdViewNativeComponent.js.map +1 -0
- package/lib/module/specs/AppLovinMAXNativeAdViewNativeComponent.js +7 -0
- package/lib/module/specs/AppLovinMAXNativeAdViewNativeComponent.js.map +1 -0
- package/lib/module/specs/NativeAppLovinMAXModule.js +3 -0
- package/lib/module/specs/NativeAppLovinMAXModule.js.map +1 -0
- package/lib/typescript/src/AdView.d.ts +11 -11
- package/lib/typescript/src/AdView.d.ts.map +1 -1
- package/lib/typescript/src/AppLovinMAX.d.ts.map +1 -1
- package/lib/typescript/src/AppOpenAd.d.ts.map +1 -1
- package/lib/typescript/src/BannerAd.d.ts.map +1 -1
- package/lib/typescript/src/ErrorCode.d.ts.map +1 -1
- package/lib/typescript/src/EventEmitter.d.ts.map +1 -1
- package/lib/typescript/src/InterstitialAd.d.ts.map +1 -1
- package/lib/typescript/src/MRecAd.d.ts.map +1 -1
- package/lib/typescript/src/Privacy.d.ts.map +1 -1
- package/lib/typescript/src/RewardedAd.d.ts.map +1 -1
- package/lib/typescript/src/Utils.d.ts +16 -0
- package/lib/typescript/src/Utils.d.ts.map +1 -0
- package/lib/typescript/src/nativeAd/NativeAdView.d.ts.map +1 -1
- package/lib/typescript/src/nativeAd/NativeAdViewComponents.d.ts.map +1 -1
- package/lib/typescript/src/nativeAd/NativeAdViewProvider.d.ts +14 -5
- package/lib/typescript/src/nativeAd/NativeAdViewProvider.d.ts.map +1 -1
- package/lib/typescript/src/specs/AppLovinMAXAdViewNativeComponent.d.ts +86 -0
- package/lib/typescript/src/specs/AppLovinMAXAdViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/specs/AppLovinMAXNativeAdViewNativeComponent.d.ts +80 -0
- package/lib/typescript/src/specs/AppLovinMAXNativeAdViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeAppLovinMAXModule.d.ts +132 -0
- package/lib/typescript/src/specs/NativeAppLovinMAXModule.d.ts.map +1 -0
- package/lib/typescript/src/types/AdInfo.d.ts +1 -1
- package/lib/typescript/src/types/AdInfo.d.ts.map +1 -1
- package/lib/typescript/src/types/AdProps.d.ts +2 -2
- package/lib/typescript/src/types/AdProps.d.ts.map +1 -1
- package/lib/typescript/src/types/NativeAd.d.ts +4 -0
- package/lib/typescript/src/types/NativeAd.d.ts.map +1 -1
- package/package.json +9 -1
- package/react-native-applovin-max.podspec +2 -2
- package/src/AdView.tsx +56 -121
- package/src/AppLovinMAX.ts +7 -8
- package/src/AppOpenAd.ts +1 -3
- package/src/BannerAd.ts +1 -3
- package/src/ErrorCode.ts +1 -3
- package/src/EventEmitter.ts +2 -3
- package/src/InterstitialAd.ts +2 -4
- package/src/MRecAd.ts +1 -3
- package/src/Privacy.ts +1 -3
- package/src/RewardedAd.ts +2 -4
- package/src/Utils.ts +26 -0
- package/src/nativeAd/NativeAdView.tsx +65 -65
- package/src/nativeAd/NativeAdViewComponents.tsx +32 -60
- package/src/nativeAd/NativeAdViewProvider.tsx +37 -12
- package/src/nativeAd/img/blank_icon.png +0 -0
- package/src/specs/AppLovinMAXAdViewNativeComponent.ts +96 -0
- package/src/specs/AppLovinMAXNativeAdViewNativeComponent.ts +89 -0
- package/src/specs/NativeAppLovinMAXModule.ts +208 -0
- package/src/types/AdInfo.ts +1 -1
- package/src/types/AdProps.ts +2 -2
- package/src/types/NativeAd.ts +5 -0
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXAdViewManager.java +0 -149
- package/android/src/main/java/com/applovin/reactnative/AppLovinMAXNativeAdViewManager.java +0 -163
- package/ios/AppLovinMAXAdView.m +0 -325
- package/ios/AppLovinMAXNativeAdView.m +0 -432
- package/ios/AppLovinMAXNativeAdViewManager.m +0 -64
|
@@ -1,432 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// AppLovinMAXNativeAdView.m
|
|
3
|
-
// AppLovin MAX React Native Module
|
|
4
|
-
//
|
|
5
|
-
// Copyright © 2022 AppLovin. All rights reserved.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
#import <React/RCTUIManagerUtils.h>
|
|
9
|
-
#import <React/RCTImageView.h>
|
|
10
|
-
#import <AppLovinSDK/AppLovinSDK.h>
|
|
11
|
-
#import "AppLovinMAX.h"
|
|
12
|
-
#import "AppLovinMAXNativeAdView.h"
|
|
13
|
-
|
|
14
|
-
#define TITLE_LABEL_TAG 1
|
|
15
|
-
#define MEDIA_VIEW_CONTAINER_TAG 2
|
|
16
|
-
#define ICON_VIEW_TAG 3
|
|
17
|
-
#define BODY_VIEW_TAG 4
|
|
18
|
-
#define CALL_TO_ACTION_VIEW_TAG 5
|
|
19
|
-
#define ADVERTISER_VIEW_TAG 8
|
|
20
|
-
|
|
21
|
-
@interface MANativeAdLoader()
|
|
22
|
-
- (void)registerClickableViews:(NSArray<UIView *> *)clickableViews
|
|
23
|
-
withContainer:(UIView *)container
|
|
24
|
-
forAd:(MAAd *)ad;
|
|
25
|
-
- (void)handleNativeAdViewRenderedForAd:(MAAd *)ad;
|
|
26
|
-
@end
|
|
27
|
-
|
|
28
|
-
@interface AppLovinMAXNativeAdView()<MANativeAdDelegate, MAAdRevenueDelegate>
|
|
29
|
-
|
|
30
|
-
@property (nonatomic, weak) RCTBridge *bridge;
|
|
31
|
-
@property (nonatomic, strong, nullable) MANativeAdLoader *adLoader;
|
|
32
|
-
@property (nonatomic, strong, nullable) MAAd *nativeAd;
|
|
33
|
-
@property (nonatomic, strong) ALAtomicBoolean *isLoading; // Guard against repeated ad loads
|
|
34
|
-
@property (nonatomic, strong) ALAtomicBoolean *isAdUnitIdSet;
|
|
35
|
-
|
|
36
|
-
// JavaScript properties
|
|
37
|
-
@property (nonatomic, copy) NSString *adUnitId;
|
|
38
|
-
@property (nonatomic, copy, nullable) NSString *placement;
|
|
39
|
-
@property (nonatomic, copy, nullable) NSString *customData;
|
|
40
|
-
@property (nonatomic, copy, nullable) NSDictionary *extraParameters;
|
|
41
|
-
@property (nonatomic, copy, nullable) NSDictionary *localExtraParameters;
|
|
42
|
-
|
|
43
|
-
// Callback to `AppLovinNativeAdView.js`
|
|
44
|
-
@property (nonatomic, copy) RCTDirectEventBlock onAdLoadedEvent;
|
|
45
|
-
@property (nonatomic, copy) RCTDirectEventBlock onAdLoadFailedEvent;
|
|
46
|
-
@property (nonatomic, copy) RCTDirectEventBlock onAdClickedEvent;
|
|
47
|
-
@property (nonatomic, copy) RCTDirectEventBlock onAdRevenuePaidEvent;
|
|
48
|
-
|
|
49
|
-
// TODO: Allow publisher to select which views are clickable and which isn't via prop
|
|
50
|
-
@property (nonatomic, strong) NSMutableArray<UIView *> *clickableViews;
|
|
51
|
-
|
|
52
|
-
@end
|
|
53
|
-
|
|
54
|
-
@implementation AppLovinMAXNativeAdView
|
|
55
|
-
|
|
56
|
-
- (instancetype)initWithBridge:(RCTBridge *)bridge
|
|
57
|
-
{
|
|
58
|
-
self = [super init];
|
|
59
|
-
if ( self )
|
|
60
|
-
{
|
|
61
|
-
self.bridge = bridge;
|
|
62
|
-
self.isLoading = [[ALAtomicBoolean alloc] init];
|
|
63
|
-
self.isAdUnitIdSet = [[ALAtomicBoolean alloc] init];
|
|
64
|
-
self.clickableViews = [NSMutableArray array];
|
|
65
|
-
}
|
|
66
|
-
return self;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Lazily loaded for when Ad Unit ID is available
|
|
70
|
-
- (nullable MANativeAdLoader *)adLoader
|
|
71
|
-
{
|
|
72
|
-
if ( ![self.adUnitId al_isValidString] ) return nil;
|
|
73
|
-
|
|
74
|
-
if ( ![self.adUnitId isEqualToString: _adLoader.adUnitIdentifier] )
|
|
75
|
-
{
|
|
76
|
-
_adLoader = [[MANativeAdLoader alloc] initWithAdUnitIdentifier: self.adUnitId sdk: [AppLovinMAX shared].sdk];
|
|
77
|
-
_adLoader.nativeAdDelegate = self;
|
|
78
|
-
_adLoader.revenueDelegate = self;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return _adLoader;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
- (void)didMoveToWindow
|
|
85
|
-
{
|
|
86
|
-
[super didMoveToWindow];
|
|
87
|
-
|
|
88
|
-
if ( !self.window )
|
|
89
|
-
{
|
|
90
|
-
[self destroyCurrentAdIfNeeded];
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
- (void)setAdUnitId:(NSString *)adUnitId
|
|
95
|
-
{
|
|
96
|
-
if ( ![adUnitId al_isValidString] ) return;
|
|
97
|
-
|
|
98
|
-
_adUnitId = adUnitId;
|
|
99
|
-
|
|
100
|
-
[self.isAdUnitIdSet set: YES];
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Called when Ad Unit ID is set, and via RN layer
|
|
104
|
-
- (void)loadAd
|
|
105
|
-
{
|
|
106
|
-
if ( ![AppLovinMAX shared].sdk )
|
|
107
|
-
{
|
|
108
|
-
[[AppLovinMAX shared] logUninitializedAccessError: @"AppLovinMAXNativeAdView.loadAd"];
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if ( [self.isLoading compareAndSet: NO update: YES] )
|
|
113
|
-
{
|
|
114
|
-
[[AppLovinMAX shared] log: @"Loading a native ad for Ad Unit ID: %@...", self.adUnitId];
|
|
115
|
-
|
|
116
|
-
self.adLoader.placement = self.placement;
|
|
117
|
-
self.adLoader.customData = self.customData;
|
|
118
|
-
|
|
119
|
-
for ( NSString *key in self.extraParameters )
|
|
120
|
-
{
|
|
121
|
-
[self.adLoader setExtraParameterForKey: key value: [self.extraParameters al_stringForKey: key]];
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
for ( NSString *key in self.localExtraParameters )
|
|
125
|
-
{
|
|
126
|
-
id value = self.localExtraParameters[key];
|
|
127
|
-
[self.adLoader setLocalExtraParameterForKey: key value: (value != [NSNull null] ? value : nil)];
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
[self.adLoader loadAd];
|
|
131
|
-
}
|
|
132
|
-
else
|
|
133
|
-
{
|
|
134
|
-
[[AppLovinMAX shared] log: @"Ignoring request to load native ad for Ad Unit ID %@, another ad load in progress", self.adUnitId];
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
#pragma mark - Views to Replace
|
|
139
|
-
|
|
140
|
-
- (void)setTitleView:(NSNumber *)tag
|
|
141
|
-
{
|
|
142
|
-
if ( !self.nativeAd.nativeAd.title ) return;
|
|
143
|
-
|
|
144
|
-
UIView *view = [self.bridge.uiManager viewForReactTag: tag];
|
|
145
|
-
if ( !view )
|
|
146
|
-
{
|
|
147
|
-
[[AppLovinMAX shared] log: @"Cannot find a title view with tag \"%@\" for %@", tag, self.adUnitId];
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
view.tag = TITLE_LABEL_TAG;
|
|
152
|
-
|
|
153
|
-
[self.clickableViews addObject: view];
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
- (void)setAdvertiserView:(NSNumber *)tag
|
|
157
|
-
{
|
|
158
|
-
if ( !self.nativeAd.nativeAd.advertiser ) return;
|
|
159
|
-
|
|
160
|
-
UIView *view = [self.bridge.uiManager viewForReactTag: tag];
|
|
161
|
-
if ( !view )
|
|
162
|
-
{
|
|
163
|
-
[[AppLovinMAX shared] log: @"Cannot find an advertiser view with tag \"%@\" for %@", tag, self.adUnitId];
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
view.tag = ADVERTISER_VIEW_TAG;
|
|
168
|
-
|
|
169
|
-
[self.clickableViews addObject: view];
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
- (void)setBodyView:(NSNumber *)tag
|
|
173
|
-
{
|
|
174
|
-
if ( !self.nativeAd.nativeAd.body ) return;
|
|
175
|
-
|
|
176
|
-
UIView *view = [self.bridge.uiManager viewForReactTag: tag];
|
|
177
|
-
if ( !view )
|
|
178
|
-
{
|
|
179
|
-
[[AppLovinMAX shared] log: @"Cannot find a body view with tag \"%@\" for %@", tag, self.adUnitId];
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
view.tag = BODY_VIEW_TAG;
|
|
184
|
-
|
|
185
|
-
[self.clickableViews addObject: view];
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
- (void)setCallToActionView:(NSNumber *)tag
|
|
189
|
-
{
|
|
190
|
-
if ( !self.nativeAd.nativeAd.callToAction ) return;
|
|
191
|
-
|
|
192
|
-
UIView *view = [self.bridge.uiManager viewForReactTag: tag];
|
|
193
|
-
if ( !view )
|
|
194
|
-
{
|
|
195
|
-
[[AppLovinMAX shared] log: @"Cannot find a callToAction view with tag \"%@\" for %@", tag, self.adUnitId];
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
view.tag = CALL_TO_ACTION_VIEW_TAG;
|
|
200
|
-
|
|
201
|
-
[self.clickableViews addObject: view];
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
- (void)setIconView:(NSNumber *)tag
|
|
205
|
-
{
|
|
206
|
-
UIView *view = [self.bridge.uiManager viewForReactTag: tag];
|
|
207
|
-
if ( ![view isKindOfClass: [RCTImageView class]] )
|
|
208
|
-
{
|
|
209
|
-
[[AppLovinMAX shared] log: @"Cannot find an icon image view with tag \"%@\" for %@", tag, self.adUnitId];
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
view.tag = ICON_VIEW_TAG;
|
|
214
|
-
|
|
215
|
-
[self.clickableViews addObject: view];
|
|
216
|
-
|
|
217
|
-
MANativeAdImage *icon = self.nativeAd.nativeAd.icon;
|
|
218
|
-
if ( icon )
|
|
219
|
-
{
|
|
220
|
-
// Check if "URL" was missing and therefore need to set the image data
|
|
221
|
-
if ( !icon.URL && icon.image )
|
|
222
|
-
{
|
|
223
|
-
RCTImageView *iconImageView = (RCTImageView *) view;
|
|
224
|
-
if ( [iconImageView respondsToSelector: @selector(setImage:)] )
|
|
225
|
-
{
|
|
226
|
-
[iconImageView performSelector: @selector(setImage:) withObject: icon.image];
|
|
227
|
-
}
|
|
228
|
-
else
|
|
229
|
-
{
|
|
230
|
-
[[AppLovinMAX shared] log: @"Unable to set native ad IconView image"];
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
else
|
|
235
|
-
{
|
|
236
|
-
UIView *iconView = self.nativeAd.nativeAd.iconView;
|
|
237
|
-
if ( iconView )
|
|
238
|
-
{
|
|
239
|
-
[view addSubview: iconView];
|
|
240
|
-
[iconView al_pinToSuperview];
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
- (void)setOptionsView:(NSNumber *)tag
|
|
246
|
-
{
|
|
247
|
-
if ( !self.nativeAd.nativeAd.optionsView ) return;
|
|
248
|
-
|
|
249
|
-
UIView *view = [self.bridge.uiManager viewForReactTag: tag];
|
|
250
|
-
if ( !view )
|
|
251
|
-
{
|
|
252
|
-
[[AppLovinMAX shared] log: @"Cannot find an option view with tag \"%@\" for %@", tag, self.adUnitId];
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
[view addSubview: self.nativeAd.nativeAd.optionsView];
|
|
257
|
-
[self.nativeAd.nativeAd.optionsView al_pinToSuperview];
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
- (void)setMediaView:(NSNumber *)tag
|
|
261
|
-
{
|
|
262
|
-
if ( !self.nativeAd.nativeAd.mediaView ) return;
|
|
263
|
-
|
|
264
|
-
UIView *view = [self.bridge.uiManager viewForReactTag: tag];
|
|
265
|
-
if ( !view )
|
|
266
|
-
{
|
|
267
|
-
[[AppLovinMAX shared] log: @"Cannot find a media view with tag \"%@\" for %@", tag, self.adUnitId];
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
view.tag = MEDIA_VIEW_CONTAINER_TAG;
|
|
272
|
-
|
|
273
|
-
[self.clickableViews addObject: view];
|
|
274
|
-
|
|
275
|
-
[view addSubview: self.nativeAd.nativeAd.mediaView];
|
|
276
|
-
[self.nativeAd.nativeAd.mediaView al_pinToSuperview];
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Invoked:
|
|
281
|
-
* 1. after all the JavaScript properties are set when mounting NativeAdView
|
|
282
|
-
* 2. after all the user's asset views are mounted, following the 1st event
|
|
283
|
-
*/
|
|
284
|
-
- (void)didSetProps:(NSArray<NSString *> *)changedProps
|
|
285
|
-
{
|
|
286
|
-
if ( [self.isAdUnitIdSet compareAndSet:YES update: NO] )
|
|
287
|
-
{
|
|
288
|
-
[self loadAd];
|
|
289
|
-
}
|
|
290
|
-
else
|
|
291
|
-
{
|
|
292
|
-
if ( !self.adLoader ) return;
|
|
293
|
-
|
|
294
|
-
[self.adLoader registerClickableViews: self.clickableViews withContainer: self forAd: self.nativeAd];
|
|
295
|
-
[self.adLoader handleNativeAdViewRenderedForAd: self.nativeAd];
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
#pragma mark - Ad Loader Delegate
|
|
300
|
-
|
|
301
|
-
- (void)didLoadNativeAd:(nullable MANativeAdView *)nativeAdView forAd:(MAAd *)ad
|
|
302
|
-
{
|
|
303
|
-
[[AppLovinMAX shared] log: @"Native ad loaded: %@", ad];
|
|
304
|
-
|
|
305
|
-
// Log a warning if it is a template native ad returned - as our plugin will be responsible for re-rendering the native ad's assets
|
|
306
|
-
if ( nativeAdView )
|
|
307
|
-
{
|
|
308
|
-
[self.isLoading set: NO];
|
|
309
|
-
|
|
310
|
-
[[AppLovinMAX shared] log: @"Native ad is of template type, failing ad load..."];
|
|
311
|
-
self.onAdLoadFailedEvent([[AppLovinMAX shared] adLoadFailedInfoForAd: self.adUnitId withError: nil]);
|
|
312
|
-
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
[self destroyCurrentAdIfNeeded];
|
|
317
|
-
|
|
318
|
-
self.nativeAd = ad;
|
|
319
|
-
|
|
320
|
-
// Notify `AppLovinNativeAdView.js`
|
|
321
|
-
[self sendAdLoadedReactNativeEventForAd: ad.nativeAd];
|
|
322
|
-
|
|
323
|
-
[self.isLoading set: NO];
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
- (void)sendAdLoadedReactNativeEventForAd:(MANativeAd *)ad
|
|
327
|
-
{
|
|
328
|
-
// 1. AdInfo for publisher to be notified via `onAdLoaded`
|
|
329
|
-
|
|
330
|
-
NSMutableDictionary<NSString *, id> *nativeAdInfo = [NSMutableDictionary dictionaryWithCapacity: 5];
|
|
331
|
-
nativeAdInfo[@"title"] = ad.title;
|
|
332
|
-
nativeAdInfo[@"advertiser"] = ad.advertiser;
|
|
333
|
-
nativeAdInfo[@"body"] = ad.body;
|
|
334
|
-
nativeAdInfo[@"callToAction"] = ad.callToAction;
|
|
335
|
-
nativeAdInfo[@"starRating"] = ad.starRating;
|
|
336
|
-
|
|
337
|
-
// The aspect ratio can be 0.0f when it is not provided by the network.
|
|
338
|
-
if ( ad.mediaContentAspectRatio > 0 )
|
|
339
|
-
{
|
|
340
|
-
nativeAdInfo[@"mediaContentAspectRatio"] = @(ad.mediaContentAspectRatio);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
nativeAdInfo[@"isIconImageAvailable"] = @(ad.icon != nil || ad.iconView != nil);
|
|
344
|
-
nativeAdInfo[@"isOptionsViewAvailable"] = @(ad.optionsView != nil);
|
|
345
|
-
nativeAdInfo[@"isMediaViewAvailable"] = @(ad.mediaView != nil);
|
|
346
|
-
|
|
347
|
-
NSMutableDictionary *adInfo = [[AppLovinMAX shared] adInfoForAd: self.nativeAd].mutableCopy;
|
|
348
|
-
adInfo[@"nativeAd"] = nativeAdInfo;
|
|
349
|
-
|
|
350
|
-
// 2. NativeAd for `AppLovinNativeAdView.js` to render the views
|
|
351
|
-
|
|
352
|
-
NSMutableDictionary<NSString *, id> *jsNativeAd = [NSMutableDictionary dictionaryWithCapacity: 5];
|
|
353
|
-
jsNativeAd[@"title"] = ad.title;
|
|
354
|
-
jsNativeAd[@"advertiser"] = ad.advertiser;
|
|
355
|
-
jsNativeAd[@"body"] = ad.body;
|
|
356
|
-
jsNativeAd[@"callToAction"] = ad.callToAction;
|
|
357
|
-
jsNativeAd[@"starRating"] = ad.starRating;
|
|
358
|
-
|
|
359
|
-
if ( ad.icon )
|
|
360
|
-
{
|
|
361
|
-
if ( ad.icon.URL )
|
|
362
|
-
{
|
|
363
|
-
jsNativeAd[@"url"] = ad.icon.URL.absoluteString;
|
|
364
|
-
}
|
|
365
|
-
else if ( ad.icon.image )
|
|
366
|
-
{
|
|
367
|
-
jsNativeAd[@"image"] = @(YES);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
else if ( ad.iconView )
|
|
371
|
-
{
|
|
372
|
-
jsNativeAd[@"image"] = @(YES);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
jsNativeAd[@"isOptionsViewAvailable"] = ad.optionsView ? @(YES) : @(NO);
|
|
376
|
-
jsNativeAd[@"isMediaViewAvailable"] = ad.mediaView ? @(YES) : @(NO);
|
|
377
|
-
|
|
378
|
-
NSMutableDictionary<NSString *, id> *arg = [NSMutableDictionary dictionaryWithCapacity: 2];
|
|
379
|
-
arg[@"adInfo"] = adInfo;
|
|
380
|
-
arg[@"nativeAd"] = jsNativeAd;
|
|
381
|
-
|
|
382
|
-
// Send to `AppLovinNativeAdView.js`
|
|
383
|
-
self.onAdLoadedEvent(arg);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
- (void)didFailToLoadNativeAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error
|
|
387
|
-
{
|
|
388
|
-
[self.isLoading set: NO];
|
|
389
|
-
|
|
390
|
-
[[AppLovinMAX shared] log: @"Failed to load native ad for Ad Unit ID %@ with error: %@", self.adUnitId, error];
|
|
391
|
-
|
|
392
|
-
// Notify publisher
|
|
393
|
-
self.onAdLoadFailedEvent([[AppLovinMAX shared] adLoadFailedInfoForAd: adUnitIdentifier withError: error]);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
- (void)didClickNativeAd:(MAAd *)ad
|
|
397
|
-
{
|
|
398
|
-
self.onAdClickedEvent([[AppLovinMAX shared] adInfoForAd: ad]);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
#pragma mark - Ad Revenue Delegate
|
|
402
|
-
|
|
403
|
-
- (void)didPayRevenueForAd:(MAAd *)ad
|
|
404
|
-
{
|
|
405
|
-
self.onAdRevenuePaidEvent([[AppLovinMAX shared] adInfoForAd: ad]);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
- (void)destroyCurrentAdIfNeeded
|
|
409
|
-
{
|
|
410
|
-
if ( self.nativeAd )
|
|
411
|
-
{
|
|
412
|
-
if ( self.nativeAd.nativeAd )
|
|
413
|
-
{
|
|
414
|
-
if ( self.nativeAd.nativeAd.mediaView )
|
|
415
|
-
{
|
|
416
|
-
[self.nativeAd.nativeAd.mediaView removeFromSuperview];
|
|
417
|
-
}
|
|
418
|
-
if ( self.nativeAd.nativeAd.optionsView )
|
|
419
|
-
{
|
|
420
|
-
[self.nativeAd.nativeAd.optionsView removeFromSuperview];
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
[self.adLoader destroyAd: self.nativeAd];
|
|
425
|
-
|
|
426
|
-
self.nativeAd = nil;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
[self.clickableViews removeAllObjects];
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
@end
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// AppLovinMAXNativeAdViewManager.m
|
|
3
|
-
// AppLovin MAX React Native Module
|
|
4
|
-
//
|
|
5
|
-
// Copyright © 2022 AppLovin. All rights reserved.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
#import "AppLovinMAX.h"
|
|
9
|
-
#import "AppLovinMAXNativeAdViewManager.h"
|
|
10
|
-
#import "AppLovinMAXNativeAdView.h"
|
|
11
|
-
|
|
12
|
-
@implementation AppLovinMAXNativeAdViewManager
|
|
13
|
-
|
|
14
|
-
RCT_EXPORT_MODULE(AppLovinMAXNativeAdView)
|
|
15
|
-
|
|
16
|
-
// Props
|
|
17
|
-
RCT_EXPORT_VIEW_PROPERTY(adUnitId, NSString)
|
|
18
|
-
RCT_EXPORT_VIEW_PROPERTY(placement, NSString)
|
|
19
|
-
RCT_EXPORT_VIEW_PROPERTY(customData, NSString)
|
|
20
|
-
RCT_EXPORT_VIEW_PROPERTY(extraParameters, NSDictionary)
|
|
21
|
-
RCT_EXPORT_VIEW_PROPERTY(localExtraParameters, NSDictionary)
|
|
22
|
-
|
|
23
|
-
// Asset views
|
|
24
|
-
RCT_EXPORT_VIEW_PROPERTY(titleView, NSNumber)
|
|
25
|
-
RCT_EXPORT_VIEW_PROPERTY(advertiserView, NSNumber)
|
|
26
|
-
RCT_EXPORT_VIEW_PROPERTY(bodyView, NSNumber)
|
|
27
|
-
RCT_EXPORT_VIEW_PROPERTY(callToActionView, NSNumber)
|
|
28
|
-
RCT_EXPORT_VIEW_PROPERTY(iconView, NSNumber)
|
|
29
|
-
RCT_EXPORT_VIEW_PROPERTY(optionsView, NSNumber)
|
|
30
|
-
RCT_EXPORT_VIEW_PROPERTY(mediaView, NSNumber)
|
|
31
|
-
|
|
32
|
-
// Callback
|
|
33
|
-
RCT_EXPORT_VIEW_PROPERTY(onAdLoadedEvent, RCTDirectEventBlock)
|
|
34
|
-
RCT_EXPORT_VIEW_PROPERTY(onAdLoadFailedEvent, RCTDirectEventBlock)
|
|
35
|
-
RCT_EXPORT_VIEW_PROPERTY(onAdClickedEvent, RCTDirectEventBlock)
|
|
36
|
-
RCT_EXPORT_VIEW_PROPERTY(onAdRevenuePaidEvent, RCTDirectEventBlock)
|
|
37
|
-
|
|
38
|
-
+ (BOOL)requiresMainQueueSetup
|
|
39
|
-
{
|
|
40
|
-
return YES;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
- (UIView *)view
|
|
44
|
-
{
|
|
45
|
-
return [[AppLovinMAXNativeAdView alloc] initWithBridge: self.bridge];
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
RCT_EXPORT_METHOD(loadAd:(nonnull NSNumber *)viewTag)
|
|
49
|
-
{
|
|
50
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
51
|
-
|
|
52
|
-
UIView *view = viewRegistry[viewTag];
|
|
53
|
-
if ( ![view isKindOfClass: [AppLovinMAXNativeAdView class]] )
|
|
54
|
-
{
|
|
55
|
-
[[AppLovinMAX shared] log: @"Cannot find AppLovinMAXNativeAdView with tag %@", viewTag];
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
AppLovinMAXNativeAdView *nativeAdView = (AppLovinMAXNativeAdView *) view;
|
|
60
|
-
[nativeAdView loadAd];
|
|
61
|
-
}];
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
@end
|