adwhale-sdk-react-native 2.7.202 → 2.7.204

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.
Files changed (41) hide show
  1. package/README.md +29 -6
  2. package/android/build.gradle +15 -15
  3. package/android/proguard-rules.pro +0 -111
  4. package/android/src/main/java/com/adwhalesdkreactnative/AdwhaleSdkReactNativePackage.java +37 -0
  5. package/android/src/main/java/com/adwhalesdkreactnative/NativeAdBinderFactory.java +19 -0
  6. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdSettingModule.java +10 -2
  7. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdView.java +15 -4
  8. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationCustomNativeAdView.java +186 -196
  9. package/android/src/main/java/com/adwhalesdkreactnative/SimpleBinderFactory.java +55 -0
  10. package/lib/module/AdWhaleAdView.js +44 -0
  11. package/lib/module/AdWhaleAdView.js.map +1 -0
  12. package/lib/module/{AdWhaleMediationSdk.js → AdWhaleMediationAds.js} +14 -14
  13. package/lib/module/AdWhaleMediationAds.js.map +1 -0
  14. package/lib/module/NativeAdwhaleSdkReactNative.js.map +1 -1
  15. package/lib/module/index.js +9 -9
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/typescript/src/AdWhaleAdView.d.ts +51 -0
  18. package/lib/typescript/src/AdWhaleAdView.d.ts.map +1 -0
  19. package/lib/typescript/src/{AdWhaleMediationSdk.d.ts → AdWhaleMediationAds.d.ts} +4 -3
  20. package/lib/typescript/src/AdWhaleMediationAds.d.ts.map +1 -0
  21. package/lib/typescript/src/AdWhaleNativeCustomView.d.ts +1 -1
  22. package/lib/typescript/src/AdWhaleNativeCustomView.d.ts.map +1 -1
  23. package/lib/typescript/src/NativeAdwhaleSdkReactNative.d.ts +6 -1
  24. package/lib/typescript/src/NativeAdwhaleSdkReactNative.d.ts.map +1 -1
  25. package/lib/typescript/src/index.d.ts +3 -3
  26. package/lib/typescript/src/index.d.ts.map +1 -1
  27. package/package.json +4 -4
  28. package/plugin/index.js +14 -367
  29. package/src/AdWhaleAdView.tsx +90 -0
  30. package/src/{AdWhaleMediationSdk.ts → AdWhaleMediationAds.ts} +15 -15
  31. package/src/AdWhaleNativeCustomView.tsx +1 -1
  32. package/src/NativeAdwhaleSdkReactNative.ts +7 -1
  33. package/src/index.ts +12 -12
  34. package/android/src/main/res/layout/custom_native_ad_layout.xml +0 -58
  35. package/lib/module/AdWhaleBannerView.js +0 -20
  36. package/lib/module/AdWhaleBannerView.js.map +0 -1
  37. package/lib/module/AdWhaleMediationSdk.js.map +0 -1
  38. package/lib/typescript/src/AdWhaleBannerView.d.ts +0 -25
  39. package/lib/typescript/src/AdWhaleBannerView.d.ts.map +0 -1
  40. package/lib/typescript/src/AdWhaleMediationSdk.d.ts.map +0 -1
  41. package/src/AdWhaleBannerView.tsx +0 -61
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # adwhale-sdk-react-native
2
- AdWhale Android 네이티브 광고 미디에이션 SDK를
2
+ ADwhale Android 네이티브 광고 미디에이션 SDK를
3
3
  React Native 환경에서 사용할 수 있도록 제공하는 공식 SDK입니다.
4
4
 
5
5
  - Android 네이티브 SDK 기반
@@ -43,7 +43,7 @@ npm install adwhale-sdk-react-native
43
43
  운영 안정성을 중시하는 경우
44
44
  ```json
45
45
  {
46
- "adwhale-sdk-react-native": "~2.7.202"
46
+ "adwhale-sdk-react-native": "~2.7.204"
47
47
  }
48
48
  ```
49
49
  - Android SDK 2.7.2 기반 유지
@@ -52,7 +52,7 @@ npm install adwhale-sdk-react-native
52
52
  ### 동일한 Android SDK 기반의 최신 RN 수정만 사용
53
53
  ```json
54
54
  {
55
- "adwhale-sdk-react-native": "^2.7.202"
55
+ "adwhale-sdk-react-native": "^2.7.204"
56
56
  }
57
57
  ```
58
58
  - Android SDK 2.7.x 범위 내 최신 RN 수정 자동 반영
@@ -62,7 +62,7 @@ npm install adwhale-sdk-react-native
62
62
  ### 특정 버전을 완전히 고정하여 사용하는 경우
63
63
  ```json
64
64
  {
65
- "adwhale-sdk-react-native": "2.7.202"
65
+ "adwhale-sdk-react-native": "2.7.204"
66
66
  }
67
67
  ```
68
68
 
@@ -78,7 +78,10 @@ npm install adwhale-sdk-react-native
78
78
 
79
79
 
80
80
  ## Example Project
81
- SDK 동작을 바로 확인할 수 있는 example 프로젝트가 포함되어 있습니다.
81
+ SDK 동작을 바로 확인할 수 있는 example 프로젝트를 제공합니다.
82
+ - [React Native 샘플](https://github.com/dev-adwhale/ADwhaleMediationSDK-ReactNative/tree/main/ReactNativeSample)
83
+ - [Expo 샘플](https://github.com/dev-adwhale/ADwhaleMediationSDK-ReactNative/tree/main/ExpoSample)
84
+ yarn 사용시
82
85
  ```sh
83
86
  yarn install
84
87
  yarn prepare
@@ -86,6 +89,13 @@ cd example
86
89
  yarn android
87
90
  ```
88
91
 
92
+ npm 사용시
93
+ ```sh
94
+ npm install
95
+ cd example
96
+ npm run android
97
+ ```
98
+
89
99
  ## Expo Support
90
100
  다음 환경에서 사용 가능합니다.
91
101
  - Expo Bare Workflow
@@ -114,8 +124,21 @@ cd example/android
114
124
  npx react-native doctor
115
125
  ```
116
126
 
127
+ ## Changelog
128
+ | 배포버전 | 내용 | 배포날짜 |
129
+ |---------|-----------------------------------------------------------------------------------------------------------------------------------------------|------------|
130
+ | 2.7.204 | 버그 및 샘플 수정 | 2026.01.22 |
131
+ | 2.7.203 | 버그 및 샘플 수정 | 2026.01.19 |
132
+ | 2.7.202 | 버그 및 샘플 수정 | 2026.01.19 |
133
+ | 2.7.201 | 버그 및 샘플 수정 | 2026.01.12 |
134
+ | 2.7.200 | 앱오프닝 광고 추가 (ADwhale Android SDK v2.7.2에서 추가됨) | 2026.01.09 |
135
+ | 2.7.102 | gcoder 및 placement name 추가 | 2025.12.29 |
136
+ | 2.7.101 | 버그 및 샘플 수정 | 2025.12.23 |
137
+ | 2.7.100 | 네이티브 광고 추가 (ADwhale Android SDK v2.7.0) | 2025.12.15 |
138
+ | | GDPR 기능 추가 (ADwhale Android SDK v2.7.0) | |
139
+ | | 적응형 배너 추가 (ADwhale Android SDK v2.7.1) | |
117
140
 
118
141
  ## Learn More
142
+ - [ADwhale ReactNative 가이드](https://adwhale.gitbook.io/adwhale-mediation-sdk/react-native/sdk)
119
143
  - [React Native Documentation](https://reactnative.dev/docs/getting-started)
120
144
  - [Expo Documentation](https://docs.expo.dev)
121
- - [AdWhale SDK Guide](https://adwhale.gitbook.io/adwhale-mediation-sdk/react-native/sdk)
@@ -2,6 +2,21 @@ plugins {
2
2
  id "com.android.library"
3
3
  id "com.facebook.react"
4
4
  }
5
+ Properties properties = new Properties()
6
+ // local.properties 경로 탐색 (라이브러리 단독 빌드 vs example 앱 빌드)
7
+ def localPropertiesCandidates = [
8
+ project.file('../local.properties'), // 라이브러리 단독 빌드: android/ → adwhale-sdk-react-native/
9
+ project.rootProject.file('../../local.properties') // example 앱 빌드: example/android/ → adwhale-sdk-react-native/
10
+ ]
11
+ def lp = localPropertiesCandidates.find { it.exists() }
12
+ if (lp != null) {
13
+ properties.load(lp.newDataInputStream())
14
+ }
15
+ ext.sdkVersionMajor = (properties["sdkVersionMajor"] ?: "1")
16
+ ext.sdkVersionMinor = (properties["sdkVersionMinor"] ?: "0")
17
+ ext.sdkVersionPatch = (properties["sdkVersionPatch"] ?: "0")
18
+ ext.sdkVersionCode = Integer.valueOf((Integer.parseInt(sdkVersionMajor)*10000) + (Integer.parseInt(sdkVersionMinor)*100) + Integer.parseInt(sdkVersionPatch))
19
+ ext.sdkVersion = "${sdkVersionMajor}.${sdkVersionMinor}.${sdkVersionPatch}"
5
20
 
6
21
  def resolveNodeBinary() {
7
22
  def candidateSources = [
@@ -120,19 +135,4 @@ dependencies {
120
135
  // 기본 디펜던시: ADwhale Mediation SDK Repository
121
136
  implementation "net.adwhale.sdk.mediation:adwhale-mediation-sdk:2.7.2"
122
137
 
123
- // 옵션 디펜던시(제외가능): Cauly Adapter SDK Repository
124
- implementation "net.adwhale.sdk.cauly.adapter:cauly-sdk:3.5.41.0"
125
-
126
- // 옵션 디펜던시(제외가능): Admize Adapter SDK Repository
127
- implementation "net.adwhale.sdk.admize.adapter:admize-sdk:1.0.8.0"
128
-
129
- // 옵션 디펜던시(제외가능): AdFit Adapter SDK Repository
130
- implementation "net.adwhale.sdk.adfit.adapter:adfit-sdk:3.17.2.5"
131
-
132
- // 옵션 디펜던시(제외가능): Admob Adapter SDK Repository
133
- implementation "net.adwhale.sdk.admob.adapter:admob-sdk:24.3.0.2"
134
-
135
- // 옵션 디펜던시(제외가능): Levelplay Adapter SDK Repository
136
- implementation "net.adwhale.sdk.levelplay.adapter:levelplay-sdk:8.7.0.6"
137
-
138
138
  }
@@ -151,114 +151,3 @@
151
151
  -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAdListener {*;}
152
152
 
153
153
  #================== AdWhale Mediation SDK Proguard for Release 적용 코드 끝 ==================
154
-
155
- #================== AdWhale Cauly Adapter SDK Proguard for Release 적용 코드 시작 ==================
156
-
157
- -keep class net.adwhale.sdk.cauly.adapter.CaulyAdBannerLoader {*;}
158
-
159
- -keep class net.adwhale.sdk.cauly.adapter.CaulyAdBannerPreLoader {*;}
160
-
161
- -keep class net.adwhale.sdk.cauly.adapter.CaulyAdInterstitialLoader {*;}
162
-
163
- -keep class net.adwhale.sdk.cauly.adapter.CaulyAdRewardLoader {*;}
164
-
165
- -keep class net.adwhale.sdk.cauly.adapter.CaulyCustomEventInterstitialLoader {*;}
166
-
167
- -keep class net.adwhale.sdk.cauly.adapter.CaulyCustomEventBannerLoader {*;}
168
-
169
- -keep class net.adwhale.sdk.cauly.adapter.CaulyCustomEventRewardLoader {*;}
170
-
171
- #================== AdWhale Cauly Adapter SDK Proguard for Release 적용 코드 끝 ==================
172
-
173
- #================== AdWhale Admize Adapter SDK Proguard for Release 적용 코드 시작 ==================
174
-
175
- -keep class net.adwhale.sdk.admize.adapter.AdmizeAdBannerLoader {*;}
176
-
177
- -keep class net.adwhale.sdk.admize.adapter.AdmizeAdBannerPreLoader {*;}
178
-
179
- -keep class net.adwhale.sdk.admize.adapter.AdmizeAdInterstitialLoader {*;}
180
-
181
- -keep class net.adwhale.sdk.admize.adapter.AdmizeAdRewardLoader {*;}
182
-
183
- #================== AdWhale Admize Adapter SDK Proguard for Release 적용 코드 끝 ==================
184
-
185
- #================== AdWhale AdFit Adapter SDK Proguard for Release 적용 코드 시작 ==================
186
-
187
- -keep class net.adwhale.sdk.adfit.adapter.AdFitAdBannerLoader {*;}
188
-
189
- -keep class net.adwhale.sdk.adfit.adapter.AdFitAdBannerPreLoader {*;}
190
-
191
- #================== AdWhale AdFit Adapter SDK Proguard for Release 적용 코드 끝 ==================
192
-
193
- #================== AdWhale AdManager Adapter SDK Proguard for Release 적용 코드 시작 ==================
194
-
195
- -keep class net.adwhale.sdk.admob.adapter.AdManagerAdBannerLoader {*;}
196
-
197
- -keep class net.adwhale.sdk.admob.adapter.AdManagerAdBannerPreLoader {*;}
198
-
199
- -keep class net.adwhale.sdk.admob.adapter.AdManagerAdInterstitialLoader {*;}
200
-
201
- -keep class net.adwhale.sdk.admob.adapter.AdManagerAdNativeTemplateLoader {*;}
202
-
203
- -keep class net.adwhale.sdk.admob.adapter.AdManagerAdNativeCustomBindingLoader {*;}
204
-
205
- -keep class net.adwhale.sdk.admob.adapter.AdManagerAdRewardLoader {*;}
206
-
207
- -keep class net.adwhale.sdk.admob.adapter.AdManagerAdRewardedInterstitialLoader {*;}
208
- -keep class net.adwhale.sdk.admob.adapter.AdManagerAdAppOpeningLoader {*;}
209
-
210
- #================== AdWhale AdManager Adapter SDK Proguard for Release 적용 코드 끝 ==================
211
-
212
- #================== AdWhale Admob Adapter SDK Proguard for Release 적용 코드 시작 ==================
213
-
214
- -keep class net.adwhale.sdk.admob.adapter.AdmobAdBannerLoader {*;}
215
-
216
- -keep class net.adwhale.sdk.admob.adapter.AdmobAdBannerPreLoader {*;}
217
-
218
- -keep class net.adwhale.sdk.admob.adapter.AdmobAdInterstitialLoader {*;}
219
-
220
- -keep class net.adwhale.sdk.admob.adapter.AdmobAdNativeTemplateLoader {*;}
221
-
222
- -keep class net.adwhale.sdk.admob.adapter.AdmobAdNativeCustomBindingLoader {*;}
223
-
224
- -keep class net.adwhale.sdk.admob.adapter.AdmobAdRewardLoader {*;}
225
-
226
- -keep class net.adwhale.sdk.admob.adapter.AdmobAdRewardedInterstitialLoader {*;}
227
-
228
- -keep class net.adwhale.sdk.admob.adapter.AdmobAdAppOpeningLoader {*;}
229
-
230
- -keep class net.adwhale.sdk.admob.adapter.custom.cauly.AdMobCaulyEvent {*;}
231
-
232
- -keep class net.adwhale.sdk.admob.adapter.custom.cauly.CaulyMediationBannerAd {*;}
233
-
234
- -keep class net.adwhale.sdk.admob.adapter.custom.cauly.CaulyMediationInterstitialAd {*;}
235
-
236
- -keep class net.adwhale.sdk.admob.adapter.custom.cauly.CaulyMediationRewardAd {*;}
237
-
238
- # AdWhale AdMob Adapter - Keep the public entry points for reflection
239
- -keep public class net.adwhale.sdk.admob.adapter.AdMobPrivacyAdapter {
240
- public static net.adwhale.sdk.admob.adapter.AdMobPrivacyAdapter getInstance();
241
- }
242
-
243
- #================== AdWhale Admob Adapter SDK Proguard for Release 적용 코드 끝 ==================
244
-
245
- #================== AdWhale LevelPlay Adapter SDK Proguard for Release 적용 코드 시작 ==================
246
-
247
- -keep class net.adwhale.sdk.levelplay.adapter.LevelPlayAdBannerLoader {*;}
248
-
249
- -keep class net.adwhale.sdk.levelplay.adapter.LevelPlayAdBannerPreLoader {*;}
250
-
251
- -keep class net.adwhale.sdk.levelplay.adapter.LevelPlayAdInterstitialLoader {*;}
252
-
253
- -keep class net.adwhale.sdk.levelplay.adapter.LevelPlayAdRewardLoader {*;}
254
-
255
- -keep class net.adwhale.sdk.levelplay.adapter.LevelPlayAdNativeCustomBindingLoader {*;}
256
-
257
- -keep class net.adwhale.sdk.levelplay.adapter.LevelPlayAdNativeTemplateLoader {*;}
258
-
259
- # AdWhale LevelPlay Adapter - Keep the public entry points for reflection
260
- -keep public class net.adwhale.sdk.levelplay.adapter.LevelPlayPrivacyAdapter {
261
- public static net.adwhale.sdk.levelplay.adapter.LevelPlayPrivacyAdapter getInstance();
262
- }
263
-
264
- #================== AdWhale LevelPlay Adapter SDK Proguard for Release 적용 코드 끝 ==================
@@ -1,6 +1,7 @@
1
1
  package com.adwhalesdkreactnative;
2
2
 
3
3
  import androidx.annotation.NonNull;
4
+ import androidx.annotation.Nullable;
4
5
 
5
6
  import com.facebook.react.BaseReactPackage;
6
7
  import com.facebook.react.bridge.NativeModule;
@@ -13,12 +14,48 @@ import java.util.Arrays;
13
14
  import java.util.HashMap;
14
15
  import java.util.List;
15
16
  import java.util.Map;
17
+ import java.util.concurrent.ConcurrentHashMap;
16
18
 
17
19
  /**
18
20
  * React Native New Architecture 적용
19
21
  * TurboModule(code gen 모듈) + 기존 NativeModule(전면/보상형) + ViewManager 혼용 구조
20
22
  */
21
23
  public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
24
+ /**
25
+ * factoryId를 키로 하는 BinderFactory 저장소
26
+ */
27
+ private static final Map<String, NativeAdBinderFactory> binderFactoryMap = new ConcurrentHashMap<>();
28
+
29
+ /**
30
+ * 사용자 지정 커스텀 네이티브 레이아웃을 등록합니다.
31
+ * Flutter의 AdWhaleSdkFlutterPlugin.registerBinderFactory와 동일한 기능을 제공합니다.
32
+ *
33
+ * @param factoryId 팩토리 ID (예: "app_custom")
34
+ * @param factory BinderFactory 인스턴스
35
+ */
36
+ public static void registerBinderFactory(@NonNull String factoryId, @NonNull NativeAdBinderFactory factory) {
37
+ if (factoryId == null || factoryId.isEmpty()) {
38
+ throw new IllegalArgumentException("factoryId cannot be null or empty");
39
+ }
40
+ if (factory == null) {
41
+ throw new IllegalArgumentException("factory cannot be null");
42
+ }
43
+ binderFactoryMap.put(factoryId, factory);
44
+ }
45
+
46
+ /**
47
+ * 등록된 BinderFactory를 가져옵니다.
48
+ *
49
+ * @param factoryId 팩토리 ID
50
+ * @return 등록된 BinderFactory 또는 null
51
+ */
52
+ @Nullable
53
+ public static NativeAdBinderFactory getBinderFactory(@Nullable String factoryId) {
54
+ if (factoryId == null || factoryId.isEmpty()) {
55
+ return null;
56
+ }
57
+ return binderFactoryMap.get(factoryId);
58
+ }
22
59
 
23
60
  @Override
24
61
  public NativeModule getModule(String name, ReactApplicationContext reactContext) {
@@ -0,0 +1,19 @@
1
+ package com.adwhalesdkreactnative;
2
+
3
+ import android.app.Activity;
4
+ import androidx.annotation.NonNull;
5
+ import net.adwhale.sdk.mediation.ads.AdWhaleNativeAdBinder;
6
+
7
+ /**
8
+ * 네이티브 광고 바인더를 생성하는 팩토리 인터페이스
9
+ */
10
+ public interface NativeAdBinderFactory {
11
+ /**
12
+ * AdWhaleNativeAdBinder를 생성합니다.
13
+ *
14
+ * @param activity 현재 Activity
15
+ * @return AdWhaleNativeAdBinder 인스턴스
16
+ */
17
+ @NonNull
18
+ AdWhaleNativeAdBinder createBinder(@NonNull Activity activity);
19
+ }
@@ -100,7 +100,11 @@ public class RNAdWhaleMediationAdSettingModule extends NativeAdwhaleSdkReactNati
100
100
  Log.i(REACT_CLASS_NAME, ".initialize()");
101
101
  Activity currentActivity = getCurrentActivity();
102
102
  if (currentActivity == null) {
103
- promise.reject("NO_ACTIVITY", "Unable to initialize AdWhale SDK: No activity available");
103
+ WritableMap errorResult = Arguments.createMap();
104
+ errorResult.putInt("statusCode", -1);
105
+ errorResult.putString("message", "Unable to initialize AdWhale SDK: No activity available");
106
+ errorResult.putBoolean("isSuccess", false);
107
+ promise.resolve(errorResult);
104
108
  return;
105
109
  }
106
110
 
@@ -110,7 +114,11 @@ public class RNAdWhaleMediationAdSettingModule extends NativeAdwhaleSdkReactNati
110
114
  @Override
111
115
  public void onInitComplete(int statusCode, String message) {
112
116
  Log.i(REACT_CLASS_NAME, ".onInitComplete(" + statusCode + ", " + message + ")");
113
- promise.resolve(statusCode);
117
+ WritableMap result = Arguments.createMap();
118
+ result.putInt("statusCode", statusCode);
119
+ result.putString("message", message);
120
+ result.putBoolean("isSuccess", statusCode == 100);
121
+ promise.resolve(result);
114
122
  }
115
123
  });
116
124
  }
@@ -108,21 +108,32 @@ public class RNAdWhaleMediationAdView extends ViewGroupManager<RNWrapperView> {
108
108
  if (adView == null) return;
109
109
 
110
110
  ADWHALE_AD_SIZE adSize = ADWHALE_AD_SIZE.DEFAULT;
111
- if ("320x50".equals(adSizeName)) {
111
+
112
+ if ("BANNER320x50".equals(adSizeName)) {
112
113
  adSize = ADWHALE_AD_SIZE.BANNER320x50;
113
- } else if ("320x100".equals(adSizeName)) {
114
+ } else if ("BANNER320x100".equals(adSizeName)) {
114
115
  adSize = ADWHALE_AD_SIZE.BANNER320x100;
115
- } else if ("300x250".equals(adSizeName)) {
116
+ } else if ("BANNER300x250".equals(adSizeName)) {
116
117
  adSize = ADWHALE_AD_SIZE.BANNER300x250;
117
- } else if ("250x250".equals(adSizeName)) {
118
+ } else if ("BANNER250x250".equals(adSizeName)) {
118
119
  adSize = ADWHALE_AD_SIZE.BANNER250x250;
119
120
  } else if ("ADAPTIVE_ANCHOR".equals(adSizeName)) {
120
121
  adSize = ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR;
121
122
  }
123
+
122
124
  adView.setAdwhaleAdSize(adSize);
123
125
  Log.d(REACT_CLASS_NAME, "Ad size set to: " + adSize.name());
124
126
  }
125
127
 
128
+ @ReactProp(name = "adaptiveAnchorWidth", defaultInt = 0)
129
+ public void setAdaptiveAnchorWidth(RNWrapperView view, int width) {
130
+ AdWhaleMediationAdView adView = getAdWhaleMediationAdView(view);
131
+ if (adView != null) {
132
+ adView.setAdaptiveAnchorWidth(width);
133
+ Log.d(REACT_CLASS_NAME, "Adaptive anchor width set to: " + width);
134
+ }
135
+ }
136
+
126
137
  @ReactProp(name = "loadAd")
127
138
  public void setLoadAd(RNWrapperView view, boolean loadAd) {
128
139
  if (loadAd) {