adwhale-sdk-react-native 2.7.203 → 2.7.300

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 (109) hide show
  1. package/AdwhaleSdkReactNative.podspec +22 -0
  2. package/README.md +105 -39
  3. package/android/build.gradle +15 -15
  4. package/android/proguard-rules.pro +52 -107
  5. package/android/src/main/java/com/adwhalesdkreactnative/AdWhaleCustomNativeBinderFactory.java +18 -0
  6. package/android/src/main/java/com/adwhalesdkreactnative/AdwhaleSdkReactNativePackage.java +51 -6
  7. package/android/src/main/java/com/adwhalesdkreactnative/BinderFactory.java +9 -0
  8. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdSettingModule.java +149 -42
  9. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdView.java +60 -30
  10. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAppOpenAd.java +136 -0
  11. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationCustomNativeAdView.java +37 -46
  12. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationExitPopupAd.java +240 -0
  13. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationInterstitialAd.java +189 -0
  14. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationLoggerModule.java +2 -1
  15. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationNativeAdViewListenerBridge.java +83 -0
  16. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationRewardAd.java +255 -6
  17. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationTemplateNativeAdView.java +191 -70
  18. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationTransitionPopupAd.java +218 -0
  19. package/android/src/main/java/com/adwhalesdkreactnative/RNWrapperView.java +137 -0
  20. package/android/src/main/java/com/adwhalesdkreactnative/SimpleBinderFactory.java +1 -1
  21. package/android/src/main/java/com/adwhalesdkreactnative/common/RNMethodArgConst.java +112 -0
  22. package/android/src/main/java/com/adwhalesdkreactnative/common/RNMethodCallConst.java +113 -0
  23. package/android/src/main/java/com/adwhalesdkreactnative/common/RNMethodResultConst.java +28 -0
  24. package/build/generated/ios/ReactAppDependencyProvider.podspec +34 -0
  25. package/ios/AdWhaleNativeCustomViewFactoryRegistry.swift +56 -0
  26. package/ios/AdwhaleSdkReactNative.mm +96 -5
  27. package/ios/AdwhaleSdkReactNativeModule.swift +148 -0
  28. package/ios/RNAdWhaleMediationAdViewManager.m +38 -0
  29. package/ios/RNAdWhaleMediationAdViewManager.swift +14 -0
  30. package/ios/RNAdWhaleMediationAppOpenAd.m +18 -0
  31. package/ios/RNAdWhaleMediationAppOpenAd.swift +175 -0
  32. package/ios/RNAdWhaleMediationCustomNativeAdViewManager.m +22 -0
  33. package/ios/RNAdWhaleMediationCustomNativeAdViewManager.swift +239 -0
  34. package/ios/RNAdWhaleMediationInterstitialAd.m +18 -0
  35. package/ios/RNAdWhaleMediationInterstitialAd.swift +161 -0
  36. package/ios/RNAdWhaleMediationRewardAd.m +18 -0
  37. package/ios/RNAdWhaleMediationRewardAd.swift +172 -0
  38. package/ios/WhaleMediationBannerContainer.swift +182 -0
  39. package/lib/module/AdWhaleAdView.js +80 -1
  40. package/lib/module/AdWhaleAdView.js.map +1 -1
  41. package/lib/module/AdWhaleAppOpenAd.js +223 -25
  42. package/lib/module/AdWhaleAppOpenAd.js.map +1 -1
  43. package/lib/module/AdWhaleExitPopupAd.js +93 -0
  44. package/lib/module/AdWhaleExitPopupAd.js.map +1 -0
  45. package/lib/module/AdWhaleInterstitialAd.js +146 -22
  46. package/lib/module/AdWhaleInterstitialAd.js.map +1 -1
  47. package/lib/module/AdWhaleMediationAds.js +75 -4
  48. package/lib/module/AdWhaleMediationAds.js.map +1 -1
  49. package/lib/module/AdWhaleNativeCustomView.js +59 -8
  50. package/lib/module/AdWhaleNativeCustomView.js.map +1 -1
  51. package/lib/module/AdWhaleNativeTemplateView.js +37 -19
  52. package/lib/module/AdWhaleNativeTemplateView.js.map +1 -1
  53. package/lib/module/AdWhaleRewardAd.js +169 -24
  54. package/lib/module/AdWhaleRewardAd.js.map +1 -1
  55. package/lib/module/AdWhaleTransitionPopupAd.js +87 -0
  56. package/lib/module/AdWhaleTransitionPopupAd.js.map +1 -0
  57. package/lib/module/NativeAdwhaleSdkReactNative.js +16 -1
  58. package/lib/module/NativeAdwhaleSdkReactNative.js.map +1 -1
  59. package/lib/module/constants/AdWhaleMethodArgConst.js +53 -0
  60. package/lib/module/constants/AdWhaleMethodArgConst.js.map +1 -0
  61. package/lib/module/constants/AdWhaleMethodCallConst.js +56 -0
  62. package/lib/module/constants/AdWhaleMethodCallConst.js.map +1 -0
  63. package/lib/module/constants/AdWhaleMethodResultConst.js +16 -0
  64. package/lib/module/constants/AdWhaleMethodResultConst.js.map +1 -0
  65. package/lib/module/index.js +10 -1
  66. package/lib/module/index.js.map +1 -1
  67. package/lib/typescript/src/AdWhaleAdView.d.ts +46 -2
  68. package/lib/typescript/src/AdWhaleAdView.d.ts.map +1 -1
  69. package/lib/typescript/src/AdWhaleAppOpenAd.d.ts +10 -0
  70. package/lib/typescript/src/AdWhaleAppOpenAd.d.ts.map +1 -1
  71. package/lib/typescript/src/AdWhaleExitPopupAd.d.ts +36 -0
  72. package/lib/typescript/src/AdWhaleExitPopupAd.d.ts.map +1 -0
  73. package/lib/typescript/src/AdWhaleInterstitialAd.d.ts +16 -0
  74. package/lib/typescript/src/AdWhaleInterstitialAd.d.ts.map +1 -1
  75. package/lib/typescript/src/AdWhaleMediationAds.d.ts +14 -5
  76. package/lib/typescript/src/AdWhaleMediationAds.d.ts.map +1 -1
  77. package/lib/typescript/src/AdWhaleNativeCustomView.d.ts +7 -4
  78. package/lib/typescript/src/AdWhaleNativeCustomView.d.ts.map +1 -1
  79. package/lib/typescript/src/AdWhaleNativeTemplateView.d.ts +20 -7
  80. package/lib/typescript/src/AdWhaleNativeTemplateView.d.ts.map +1 -1
  81. package/lib/typescript/src/AdWhaleRewardAd.d.ts +18 -2
  82. package/lib/typescript/src/AdWhaleRewardAd.d.ts.map +1 -1
  83. package/lib/typescript/src/AdWhaleTransitionPopupAd.d.ts +33 -0
  84. package/lib/typescript/src/AdWhaleTransitionPopupAd.d.ts.map +1 -0
  85. package/lib/typescript/src/NativeAdwhaleSdkReactNative.d.ts +33 -6
  86. package/lib/typescript/src/NativeAdwhaleSdkReactNative.d.ts.map +1 -1
  87. package/lib/typescript/src/constants/AdWhaleMethodArgConst.d.ts +51 -0
  88. package/lib/typescript/src/constants/AdWhaleMethodArgConst.d.ts.map +1 -0
  89. package/lib/typescript/src/constants/AdWhaleMethodCallConst.d.ts +53 -0
  90. package/lib/typescript/src/constants/AdWhaleMethodCallConst.d.ts.map +1 -0
  91. package/lib/typescript/src/constants/AdWhaleMethodResultConst.d.ts +14 -0
  92. package/lib/typescript/src/constants/AdWhaleMethodResultConst.d.ts.map +1 -0
  93. package/lib/typescript/src/index.d.ts +10 -2
  94. package/lib/typescript/src/index.d.ts.map +1 -1
  95. package/package.json +1 -1
  96. package/src/AdWhaleAdView.tsx +126 -9
  97. package/src/AdWhaleAppOpenAd.ts +293 -38
  98. package/src/AdWhaleExitPopupAd.ts +183 -0
  99. package/src/AdWhaleInterstitialAd.ts +206 -36
  100. package/src/AdWhaleMediationAds.ts +109 -5
  101. package/src/AdWhaleNativeCustomView.tsx +85 -23
  102. package/src/AdWhaleNativeTemplateView.tsx +79 -42
  103. package/src/AdWhaleRewardAd.ts +245 -43
  104. package/src/AdWhaleTransitionPopupAd.ts +171 -0
  105. package/src/NativeAdwhaleSdkReactNative.ts +36 -6
  106. package/src/constants/AdWhaleMethodArgConst.ts +50 -0
  107. package/src/constants/AdWhaleMethodCallConst.ts +60 -0
  108. package/src/constants/AdWhaleMethodResultConst.ts +13 -0
  109. package/src/index.ts +34 -1
@@ -16,5 +16,27 @@ Pod::Spec.new do |s|
16
16
  s.source_files = "ios/**/*.{h,m,mm,swift,cpp}"
17
17
  s.private_header_files = "ios/**/*.h"
18
18
 
19
+ # adwhale_sdk_flutter/ios/adwhale_sdk_flutter.podspec 과 동일: static framework + AdWhaleSDK
20
+ s.static_framework = true
21
+ s.swift_version = "5.0"
22
+
23
+ # ios/AdwhaleSdkReactNative.mm 에서 AdWhale iOS SDK(AdWhaleAds 등)를 사용
24
+ # 앱 Podfile 에는 AdWhaleSDK_iOS 소스가 있어야 함:
25
+ # source 'https://github.com/dev-adwhale/AdWhaleSDK_iOS.git'
26
+ s.dependency "AdWhaleSDK", "1.0.4"
27
+ # AdWhaleSDK-Swift.h 가 GAD* 프로토콜/클래스를 참조하므로 컴파일 단위에 GMA 헤더가 필요함 (AdWhaleSDK/Core 와 동일 버전)
28
+ s.dependency "Google-Mobile-Ads-SDK", "13.0.0"
29
+
30
+ # Flutter 플러그인과 동일: UMP(UserMessagingPlatform) 검색 경로 + RN install_modules_dependencies 가 HEADER_SEARCH_PATHS 병합
31
+ # AdWhaleSDK-Swift.h 는 Pods 내 xcframework Headers 경로를 직접 넣음 (인덱싱/빌드 안정화)
32
+ s.pod_target_xcconfig = {
33
+ "DEFINES_MODULE" => "YES",
34
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" => "i386",
35
+ "FRAMEWORK_SEARCH_PATHS" => "$(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/GoogleUserMessagingPlatform\" \"${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release/UserMessagingPlatform.xcframework/ios-arm64\" \"${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release/UserMessagingPlatform.xcframework/ios-arm64_x86_64-simulator\"",
36
+ # Swift → ObjC 생성 헤더(…-Swift.h). .mm 가 Swift보다 먼저 스캔될 때도 찾을 수 있게 함.
37
+ "HEADER_SEARCH_PATHS" => "$(inherited) \"$(DERIVED_SOURCES_DIR)\" \"${PODS_CONFIGURATION_BUILD_DIR}/AdwhaleSdkReactNative/AdwhaleSdkReactNative.framework/Headers\" \"${PODS_ROOT}/AdWhaleSDK/AdWhaleSDK.xcframework/ios-arm64/AdWhaleSDK.framework/Headers\" \"${PODS_ROOT}/AdWhaleSDK/AdWhaleSDK.xcframework/ios-arm64_x86_64-simulator/AdWhaleSDK.framework/Headers\"",
38
+ "OTHER_LDFLAGS" => "$(inherited) -framework \"UserMessagingPlatform\"",
39
+ }
40
+
19
41
  install_modules_dependencies(s)
20
42
  end
package/README.md CHANGED
@@ -1,14 +1,18 @@
1
+ # 최신 버전: 2.7.300
2
+
1
3
  # adwhale-sdk-react-native
2
- AdWhale Android 네이티브 광고 미디에이션 SDK를
4
+ ADwhale Android/iOS 네이티브 광고 미디에이션 SDK를
3
5
  React Native 환경에서 사용할 수 있도록 제공하는 공식 SDK입니다.
4
6
 
5
7
  - Android 네이티브 SDK 기반
6
8
  - React Native Bridge / TurboModule 지원
7
- - 배너, 전면, 보상형, 네이티브 광고 지원
9
+ - SDK 초기화, 배너, 전면, 보상형, 네이티브 광고(템플릿, 커스텀), 앱오프닝 광고, 앱 종료 팝업 광고, Android 전용 전환 팝업 광고 지원
10
+ - 광고 이벤트 콜백 리스너 제공
8
11
  - Expo Bare Workflow / Custom Dev Client 지원
9
12
 
10
13
  > ⚠️ Expo Go (Managed Workflow)에서는 네이티브 모듈 특성상 사용할 수 없습니다.
11
14
 
15
+ 자세한 가이드는 https://adwhale.gitbook.io/adwhale-mediation-sdk/react-native/sdk 를 참고하세요.
12
16
  ---
13
17
 
14
18
  ## Installation
@@ -22,18 +26,19 @@ npm install adwhale-sdk-react-native
22
26
 
23
27
 
24
28
  ## Version Policy
25
- 본 SDK는 Android 네이티브 SDK 버전과의 대응 관계를 명확히 유지하기 위해
29
+ 본 SDK는 Android 네이티브 및 iOS 네이티브 SDK 버전과의 대응 관계를 명확히 유지하기 위해
26
30
  다음과 같은 버전 규칙을 사용합니다.
27
31
  - 앞 세 자릿수(Major.Minor.Patch) 는 Android SDK 버전과 동일
28
32
  - React Native 전용 수정 사항은 Patch 값을 확장하여 관리
29
33
 
30
34
  ### Version Mapping Example
31
- | Android SDK | React Native SDK | Description |
32
- |------------|------------------|-------------|
33
- | 2.7.1 | 2.7.100 | Android 2.7.1 기반 RN SDK 최초 릴리스 |
34
- | 2.7.1 | 2.7.101 | RN 레이어 핫픽스 |
35
- | 2.7.1 | 2.7.102 | RN 버그 수정 |
36
- | 2.7.2 | 2.7.200 | Android SDK 2.7.2 반영 |
35
+ | Android SDK | React Native SDK | Description |
36
+ |-------------|------------------|--------------------------------|
37
+ | 2.7.1 | 2.7.100 | Android 2.7.1 기반 RN SDK 최초 릴리스 |
38
+ | 2.7.1 | 2.7.101 | RN 레이어 핫픽스 |
39
+ | 2.7.1 | 2.7.102 | RN 버그 수정 |
40
+ | 2.7.2 | 2.7.200 | Android SDK 2.7.2 반영 |
41
+ | 2.7.3 | 2.7.300 | Android SDK 2.7.3 반영 |
37
42
 
38
43
 
39
44
  ## Version Usage Guide
@@ -43,42 +48,29 @@ npm install adwhale-sdk-react-native
43
48
  운영 안정성을 중시하는 경우
44
49
  ```json
45
50
  {
46
- "adwhale-sdk-react-native": "~2.7.203"
51
+ "adwhale-sdk-react-native": "~2.7.300"
47
52
  }
48
53
  ```
49
- - Android SDK 2.7.2 기반 유지
54
+ - Android SDK 2.7.3 기반 유지
50
55
  - RN 핫픽스만 자동 반영
51
-
52
- ### 동일한 Android SDK 기반의 최신 RN 수정만 사용
53
- ```json
54
- {
55
- "adwhale-sdk-react-native": "^2.7.203"
56
- }
57
- ```
58
- - Android SDK 2.7.x 범위 내 최신 RN 수정 자동 반영
59
- - Android SDK 상위 메이저/마이너 버전은 반영되지 않음
60
-
56
+ - >=2.7.3+0 <2.8.0 범위
61
57
 
62
58
  ### 특정 버전을 완전히 고정하여 사용하는 경우
63
59
  ```json
64
60
  {
65
- "adwhale-sdk-react-native": "2.7.203"
66
- }
67
- ```
68
-
69
-
70
- ### 항상 최신 버전을 사용하는 경우
71
- ```json
72
- {
73
- "adwhale-sdk-react-native": "latest"
61
+ "adwhale-sdk-react-native": "2.7.300"
74
62
  }
75
63
  ```
76
- - 최신 Android SDK 및 RN SDK 포함
77
- - 개발 검증 환경에 적합
78
-
64
+ - 버전 변경 없음
65
+ - 재현성, 장애 분석에 최적
66
+ - QA / 장애 재현 환경
67
+ - 장기 유지 브랜치
79
68
 
80
69
  ## Example Project
81
- SDK 동작을 바로 확인할 수 있는 example 프로젝트가 포함되어 있습니다.
70
+ SDK 동작을 바로 확인할 수 있는 example 프로젝트를 제공합니다.
71
+ - [React Native 샘플](https://github.com/dev-adwhale/ADwhaleMediationSDK-ReactNative/tree/main/ReactNativeSample)
72
+ - [Expo 샘플](https://github.com/dev-adwhale/ADwhaleMediationSDK-ReactNative/tree/main/ExpoSample)
73
+ yarn 사용시
82
74
  ```sh
83
75
  yarn install
84
76
  yarn prepare
@@ -86,6 +78,13 @@ cd example
86
78
  yarn android
87
79
  ```
88
80
 
81
+ npm 사용시
82
+ ```sh
83
+ npm install
84
+ cd example
85
+ npm run android
86
+ ```
87
+
89
88
  ## Expo Support
90
89
  다음 환경에서 사용 가능합니다.
91
90
  - Expo Bare Workflow
@@ -98,24 +97,91 @@ Expo Go 환경에서는 사용할 수 없습니다.
98
97
  - 배너 광고
99
98
  - 전면 광고
100
99
  - 보상형 광고
101
- - 네이티브 광고 (Template / Custom)
102
- - 광고 이벤트 리스너 제공
100
+ - 네이티브 템플릿 광고
101
+ - 네이티브 커스텀 광고
102
+ - 앱 오프닝 광고
103
+ - 앱 종료 팝업 광고
104
+ - Android 전용 전환 팝업 광고
105
+ - 광고 이벤트 콜백 리스너 제공
103
106
 
107
+ ---
104
108
 
105
109
  ## Troubleshooting
106
- Android 빌드 오류 발생 시:
110
+
111
+ ### Android 빌드 오류
107
112
  ```sh
108
113
  cd example/android
109
114
  ./gradlew clean
110
115
  ```
111
116
 
112
- 환경 점검:
117
+ ### iOS: "PhaseScriptExecution failed with a nonzero exit code"
118
+ Xcode 빌드 시 **Run Script** 단계 중 하나가 실패할 때 나옵니다. 어떤 스크립트에서 실패했는지부터 확인하세요.
119
+
120
+ **1) 실패한 스크립트 확인**
121
+ - Xcode에서 **Product → Build** 후 왼쪽 **Report navigator** (⌘9) → 최근 빌드 선택
122
+ - 빌드 로그에서 **PhaseScriptExecution** 또는 **Run Script** 근처의 **빨간 에러 메시지** 확인
123
+ - 실패한 스크립트 이름(예: "Bundle React Native code and images", "Embed Pods Frameworks")과 그 아래 출력 내용 확인
124
+
125
+ **2) 자주 쓰는 해결 방법**
126
+ ```sh
127
+ # example 기준 (저장소 루트에서)
128
+ cd example
129
+ yarn install # 또는 npm install
130
+ cd ios
131
+ rm -rf build Pods Podfile.lock
132
+ pod install
133
+ cd ..
134
+ yarn ios # 또는 npx react-native run-ios
135
+ # CLI로만 빌드해 볼 때:
136
+ # yarn build:ios # example/package.json의 react-native build-ios
137
+ ```
138
+ - **Podfile.lock 불일치**라면: `example/ios`에서 `pod install`을 다시 실행합니다.
139
+ - **"Bundle React Native code and images"** 등 Node를 쓰는 스크립트 실패: Xcode가 터미널과 다른 `PATH`로 `node`를 못 찾는 경우가 많습니다. 터미널에서 `which node`로 경로를 확인한 뒤, `example/ios/.xcode.env` 또는 `example/ios/.xcode.env.local`에 `export NODE_BINARY=...`로 지정하거나, Xcode **Build Phases**의 해당 Run Script 상단에 동일하게 넣어 보세요.
140
+ - **Hermes / 번들 관련 스크립트** 실패: 위 정리 후 터미널에서 `yarn build:ios`(또는 `npx react-native build-ios`)로 한 번 빌드해 로그를 확인합니다.
141
+ - **실기기/서명** 관련이라면: Development team·신뢰 설정을 확인합니다.
142
+
143
+ ### iOS 실기기에서 "Development team" 오류가 나는 이유
144
+ - **시뮬레이터**: 코드 서명이 필요 없어 Development team 없이 실행됩니다.
145
+ - **실제 기기(USB)**: iOS는 기기 설치 시 **Apple 개발자 팀(Development team)** 서명을 요구합니다.
146
+
147
+ **해결**: Xcode에서 `example/ios/AdwhaleSdkReactNativeExample.xcworkspace` 열기 → **AdwhaleSdkReactNativeExample** 타깃 → **Signing & Capabilities** → **Team**에서 본인 Apple ID(팀) 선택. (무료 Apple ID로도 실기기 테스트 가능)
148
+ 자신의 앱이라면 해당 앱의 `.xcworkspace`와 앱 타깃 이름에 맞춰 동일하게 설정하면 됩니다.
149
+
150
+ ### iOS 실기기에서 "신뢰하지 않는 개발자" / 앱이 실행되지 않을 때
151
+ 무료 Apple ID로 서명한 앱을 **처음** 실기기에 설치한 경우, iOS가 개발자를 "신뢰하지 않음"으로 두어 앱 실행을 막습니다.
152
+ 이때 Xcode에서는 *"failed to launch"*, *"exited before the debugger could attach"* 같은 메시지가 나올 수 있습니다.
153
+
154
+ **해결 (iPhone에서 한 번만 하면 됨)**
155
+ 1. iPhone **설정** → **일반** → **VPN 및 기기 관리** (또는 **기기 관리** / **프로필 및 기기 관리**)
156
+ 2. **개발자 앱** 아래에서 본인 Apple ID(예: `xxxxx@gmail.com`) 항목 선택
157
+ 3. **"[Apple ID]을(를) 신뢰"** 탭 → **신뢰** 확인
158
+ 4. 이후부터는 해당 기기에서 같은 Apple ID로 서명한 앱이 정상 실행됩니다.
159
+
160
+ ### iOS App Store 배포
161
+ 이 SDK를 사용한 앱을 App Store에 제출·배포하는 데 문제 없습니다.
162
+ 실기기 테스트·스토어 제출 시에는 위와 같이 서명(Development team, 프로비저닝 프로필)을 설정하고, [ADwhale React Native 가이드](https://adwhale.gitbook.io/adwhale-mediation-sdk/react-native/sdk)에 안내된 iOS 설정(Info.plist, App Transport Security, AdMob(Google) App ID 등)을 준수하면 됩니다.
163
+
164
+ ### 환경 점검:
113
165
  ```sh
114
166
  npx react-native doctor
115
167
  ```
116
168
 
169
+ ## Changelog
170
+ | 배포버전 | 내용 | 배포날짜 |
171
+ |---------|-----------------------------------------------------------------------------------------------------------------------------------------------|------------|
172
+ | 2.7.300 | 애드웨일 Android 2.7.3 업데이트 및 ios 1.0.4 추가 | 2026.04.11 |
173
+ | 2.7.204 | 버그 및 샘플 수정 | 2026.01.22 |
174
+ | 2.7.203 | 버그 및 샘플 수정 | 2026.01.19 |
175
+ | 2.7.202 | 버그 및 샘플 수정 | 2026.01.19 |
176
+ | 2.7.201 | 버그 및 샘플 수정 | 2026.01.12 |
177
+ | 2.7.200 | 앱오프닝 광고 추가 (ADwhale Android SDK v2.7.2에서 추가됨) | 2026.01.09 |
178
+ | 2.7.102 | gcoder 및 placement name 추가 | 2025.12.29 |
179
+ | 2.7.101 | 버그 및 샘플 수정 | 2025.12.23 |
180
+ | 2.7.100 | 네이티브 광고 추가 (ADwhale Android SDK v2.7.0) | 2025.12.15 |
181
+ | | GDPR 기능 추가 (ADwhale Android SDK v2.7.0) | |
182
+ | | 적응형 배너 추가 (ADwhale Android SDK v2.7.1) | |
117
183
 
118
184
  ## Learn More
185
+ - [ADwhale ReactNative 가이드](https://adwhale.gitbook.io/adwhale-mediation-sdk/react-native/sdk)
119
186
  - [React Native Documentation](https://reactnative.dev/docs/getting-started)
120
187
  - [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
  }
@@ -22,6 +22,14 @@
22
22
  #================== AdWhale Mediation SDK Proguard for Release 적용 코드 시작 ==================
23
23
 
24
24
  -keepclasseswithmembers class net.adwhale.sdk.mediation.ads.AdWhaleMediationAds {
25
+ public static final int TAG_FOR_UNDER_AGE_OF_CONSENT_UNSPECIFIED;
26
+ public static final int TAG_FOR_UNDER_AGE_OF_CONSENT_FALSE;
27
+ public static final int TAG_FOR_UNDER_AGE_OF_CONSENT_TRUE;
28
+ public static final java.lang.String MAX_AD_CONTENT_RATING_G;
29
+ public static final java.lang.String MAX_AD_CONTENT_RATING_PG;
30
+ public static final java.lang.String MAX_AD_CONTENT_RATING_T;
31
+ public static final java.lang.String MAX_AD_CONTENT_RATING_MA;
32
+
25
33
  public static *** init(***);
26
34
  public static *** init(***, ***);
27
35
  public static *** setCoppa(***);
@@ -32,24 +40,40 @@
32
40
  public static *** getGdprConsentStatus(***);
33
41
  public static *** resetGdprConsentStatus(***);
34
42
  public static *** getAdwhaleGDPR(***);
43
+ public static *** setAppVolume(***);
44
+ public static *** setAppMuted(***);
45
+ public static *** setTagForUnderAgeOfConsent(***);
46
+ public static *** setMaxAdContentRating(***);
47
+ public static *** setTestDeviceIdentifiers(***);
48
+ public static *** openAdInspector(***, ***);
35
49
  }
36
50
 
51
+ -keep interface net.adwhale.sdk.mediation.ads.AdWhaleGdprConsentListener {*;}
52
+ -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationAdInspectorCloseListener {*;}
37
53
  -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationOnInitCompleteListener {*;}
38
54
 
39
55
  -keepclasseswithmembers class net.adwhale.sdk.utils.AdWhaleLog {
40
56
  public static *** setLogLevel(***);
41
57
  public static *** getLogLevel();
58
+ public static *** d(***);
59
+ public static *** i(***);
60
+ public static *** w(***);
61
+ public static *** e(java.lang.String);
62
+ public static *** e(java.lang.String, java.lang.Exception);
63
+ public static *** e(java.lang.String, java.lang.Throwable);
42
64
  }
43
65
 
44
66
  -keep class net.adwhale.sdk.mediation.ads.ADWHALE_AD_SIZE {*;}
45
67
  -keep class net.adwhale.sdk.mediation.ads.ADWHALE_RESULT_CODE {*;}
46
68
  -keep class net.adwhale.sdk.mediation.ads.ADWHALE_NATIVE_TEMPLATE {*;}
69
+ -keep class net.adwhale.sdk.mediation.ads.ADWHALE_POPUP_AD_CLOSE_REASON {*;}
47
70
  -keep class net.adwhale.sdk.mediation.ads.GdprConsentStatus {*;}
48
71
 
49
72
  -keep class net.adwhale.sdk.utils.AdWhaleLog$LogLevel{*;}
50
73
  -keep class net.adwhale.sdk.impl.mediation.ReqMediationAdConfig {*;}
51
74
  -keep class net.adwhale.sdk.impl.mediation.ResMediationAdConfig {*;}
52
75
  -keep class net.adwhale.sdk.impl.mediation.ResMediation {*;}
76
+ -keep class net.adwhale.sdk.impl.mediation.ResExtension {*;}
53
77
 
54
78
  -keepclasseswithmembers class net.adwhale.sdk.mediation.ads.AdWhaleMediationInterstitialAd {
55
79
  public <init>(...);
@@ -150,115 +174,36 @@
150
174
 
151
175
  -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAdListener {*;}
152
176
 
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();
177
+ -keepclasseswithmembers class net.adwhale.sdk.mediation.ads.AdWhaleMediationExitPopupAd {
178
+ public <init>(...);
179
+ public *** loadAd();
180
+ public *** showAd(***, ***);
181
+ public *** setRegion(***);
182
+ public *** setGcoder(***, ***);
183
+ public *** setPlacementUid(***);
184
+ public *** setPlacementName(***);
185
+ public *** setCustomizeButtonText(***, ***);
186
+ public *** setCustomDescription(***);
187
+ public *** destroy();
188
+ public *** resume(***);
189
+ public *** setAdWhaleMediationExitPopupAdListener(***);
241
190
  }
242
191
 
243
- #================== AdWhale Admob Adapter SDK Proguard for Release 적용 코드 끝 ==================
192
+ -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationExitPopupAdListener {*;}
244
193
 
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();
194
+ -keepclasseswithmembers class net.adwhale.sdk.mediation.ads.AdWhaleMediationTransitionPopupAd {
195
+ public <init>(...);
196
+ public *** loadAd();
197
+ public *** showAd(***, ***);
198
+ public *** setRegion(***);
199
+ public *** setGcoder(***, ***);
200
+ public *** setPlacementUid(***);
201
+ public *** setPlacementName(***);
202
+ public *** destroy();
203
+ public *** resume(***);
204
+ public *** setAdWhaleMediationTransitionPopupAdListener(***);
262
205
  }
263
206
 
264
- #================== AdWhale LevelPlay Adapter SDK Proguard for Release 적용 코드 끝 ==================
207
+ -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationTransitionPopupAdListener {*;}
208
+
209
+ #================== AdWhale Mediation SDK Proguard for Release 적용 코드 끝 ==================
@@ -0,0 +1,18 @@
1
+ package com.adwhalesdkreactnative;
2
+
3
+ /**
4
+ * Flutter Android 편의 클래스명과 동일한 구현.
5
+ * 내부 동작은 기존 SimpleBinderFactory와 동일합니다.
6
+ */
7
+ public class AdWhaleCustomNativeBinderFactory extends SimpleBinderFactory implements BinderFactory {
8
+ public AdWhaleCustomNativeBinderFactory(
9
+ int layoutId,
10
+ int iconViewId,
11
+ int titleViewId,
12
+ int bodyTextViewId,
13
+ int callToActionViewId,
14
+ int mediaViewGroupId) {
15
+ super(layoutId, iconViewId, titleViewId, bodyTextViewId, callToActionViewId, mediaViewGroupId);
16
+ }
17
+ }
18
+
@@ -43,6 +43,13 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
43
43
  binderFactoryMap.put(factoryId, factory);
44
44
  }
45
45
 
46
+ /**
47
+ * Flutter와 동일 타입명(BinderFactory) 오버로드.
48
+ */
49
+ public static void registerBinderFactory(@NonNull String factoryId, @NonNull BinderFactory factory) {
50
+ registerBinderFactory(factoryId, (NativeAdBinderFactory) factory);
51
+ }
52
+
46
53
  /**
47
54
  * 등록된 BinderFactory를 가져옵니다.
48
55
  *
@@ -79,11 +86,21 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
79
86
  return new RNAdWhaleMediationRewardAd(reactContext);
80
87
  }
81
88
 
82
- // 엡오프닝 Old Architecture를 따르지만 등록은 TurboModule로 등록
89
+ // 앱오프닝 Old Architecture를 따르지만 등록은 TurboModule로 등록
83
90
  if(RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME.equals(name)) {
84
91
  return new RNAdWhaleMediationAppOpenAd(reactContext);
85
92
  }
86
93
 
94
+ // 앱종료 Old Architecture를 따르지만 등록은 TurboModule로 등록
95
+ if (RNAdWhaleMediationExitPopupAd.REACT_CLASS_NAME.equals(name)) {
96
+ return new RNAdWhaleMediationExitPopupAd(reactContext);
97
+ }
98
+
99
+ // 앱전환 Old Architecture를 따르지만 등록은 TurboModule로 등록
100
+ if (RNAdWhaleMediationTransitionPopupAd.REACT_CLASS_NAME.equals(name)) {
101
+ return new RNAdWhaleMediationTransitionPopupAd(reactContext);
102
+ }
103
+
87
104
  return null;
88
105
  }
89
106
 
@@ -96,7 +113,9 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
96
113
  new RNAdWhaleMediationLoggerModule(reactContext),
97
114
  new RNAdWhaleMediationInterstitialAd(reactContext),
98
115
  new RNAdWhaleMediationRewardAd(reactContext),
99
- new RNAdWhaleMediationAppOpenAd(reactContext)
116
+ new RNAdWhaleMediationAppOpenAd(reactContext),
117
+ new RNAdWhaleMediationExitPopupAd(reactContext),
118
+ new RNAdWhaleMediationTransitionPopupAd(reactContext)
100
119
  // RNAdWhaleMediationAdSettingModule는 TurboModule로 등록되므로 여기서 굳이 추가 안 해도 됨
101
120
  );
102
121
  }
@@ -129,7 +148,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
129
148
  )
130
149
  );
131
150
 
132
- // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
151
+ // 로거/전면/보상형/앱오프닝/앱종료/앱전환은 legacy 모듈로 사용 (isTurboModule = false)
133
152
  moduleInfos.put(
134
153
  RNAdWhaleMediationLoggerModule.REACT_CLASS_NAME,
135
154
  new ReactModuleInfo(
@@ -142,7 +161,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
142
161
  )
143
162
  );
144
163
 
145
- // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
164
+ // 로거/전면/보상형/앱오프닝/앱종료/앱전환은 legacy 모듈로 사용 (isTurboModule = false)
146
165
  moduleInfos.put(
147
166
  RNAdWhaleMediationInterstitialAd.REACT_CLASS_NAME,
148
167
  new ReactModuleInfo(
@@ -155,7 +174,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
155
174
  )
156
175
  );
157
176
 
158
- // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
177
+ // 로거/전면/보상형/앱오프닝/앱종료/앱전환은 legacy 모듈로 사용 (isTurboModule = false)
159
178
  moduleInfos.put(
160
179
  RNAdWhaleMediationRewardAd.REACT_CLASS_NAME,
161
180
  new ReactModuleInfo(
@@ -168,7 +187,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
168
187
  )
169
188
  );
170
189
 
171
- // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
190
+ // 로거/전면/보상형/앱오프닝/앱종료/앱전환은 legacy 모듈로 사용 (isTurboModule = false)
172
191
  moduleInfos.put(
173
192
  RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME,
174
193
  new ReactModuleInfo(
@@ -181,6 +200,32 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
181
200
  )
182
201
  );
183
202
 
203
+ // 로거/전면/보상형/앱오프닝/앱종료/앱전환은 legacy 모듈로 사용 (isTurboModule = false)
204
+ moduleInfos.put(
205
+ RNAdWhaleMediationExitPopupAd.REACT_CLASS_NAME,
206
+ new ReactModuleInfo(
207
+ RNAdWhaleMediationExitPopupAd.REACT_CLASS_NAME,
208
+ RNAdWhaleMediationExitPopupAd.REACT_CLASS_NAME,
209
+ false,
210
+ false,
211
+ false,
212
+ false
213
+ )
214
+ );
215
+
216
+ // 로거/전면/보상형/앱오프닝/앱종료/앱전환은 legacy 모듈로 사용 (isTurboModule = false)
217
+ moduleInfos.put(
218
+ RNAdWhaleMediationTransitionPopupAd.REACT_CLASS_NAME,
219
+ new ReactModuleInfo(
220
+ RNAdWhaleMediationTransitionPopupAd.REACT_CLASS_NAME,
221
+ RNAdWhaleMediationTransitionPopupAd.REACT_CLASS_NAME,
222
+ false,
223
+ false,
224
+ false,
225
+ false
226
+ )
227
+ );
228
+
184
229
  return moduleInfos;
185
230
  };
186
231
  }
@@ -0,0 +1,9 @@
1
+ package com.adwhalesdkreactnative;
2
+
3
+ /**
4
+ * Flutter Android 인터페이스명과 동일하게 맞춘 alias.
5
+ * 기존 RN 구현의 NativeAdBinderFactory와 동일 역할입니다.
6
+ */
7
+ public interface BinderFactory extends NativeAdBinderFactory {
8
+ }
9
+