react-native-daro 1.0.15 → 2.0.0-rc.1

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 (241) hide show
  1. package/README.md +2 -5
  2. package/android/build.gradle +17 -14
  3. package/android/src/main/java/com/daro/reactnative/DaroMediaViewManager.kt +25 -0
  4. package/android/src/main/java/com/daro/reactnative/DaroRNAdBannerViewManager.kt +105 -0
  5. package/android/src/main/java/com/daro/reactnative/DaroRNAdNativeViewManager.kt +163 -0
  6. package/android/src/main/java/com/daro/reactnative/DaroRNModule.kt +376 -0
  7. package/android/src/main/java/com/daro/reactnative/DaroRNPackage.kt +45 -0
  8. package/android/src/main/java/com/daro/reactnative/DaroSdkBridge.kt +52 -0
  9. package/android/src/main/java/com/daro/reactnative/constants/{InternalDaroMBannerSize.kt → InternalDaroRNBannerSize.kt} +2 -2
  10. package/android/src/main/java/com/daro/reactnative/event/{DaroMEvent.kt → DaroRNEvent.kt} +22 -11
  11. package/android/src/main/java/com/daro/reactnative/impl/{DaroMBannerViewModuleImpl.kt → DaroRNBannerViewModuleImpl.kt} +3 -3
  12. package/android/src/main/java/com/daro/reactnative/impl/{DaroMInterstitialModuleImpl.kt → DaroRNInterstitialModuleImpl.kt} +4 -4
  13. package/android/src/main/java/com/daro/reactnative/impl/{DaroMLightPopupModuleImpl.kt → DaroRNLightPopupModuleImpl.kt} +4 -4
  14. package/android/src/main/java/com/daro/reactnative/impl/{DaroMRewardedAdModuleImpl.kt → DaroRNRewardedAdModuleImpl.kt} +4 -4
  15. package/android/src/main/java/com/daro/reactnative/util/AdInfoUtil.kt +12 -0
  16. package/android/src/main/java/com/daro/reactnative/util/DaroQaProbe.kt +147 -0
  17. package/android/src/main/java/com/daro/reactnative/util/EventEmitterUtil.kt +20 -7
  18. package/android/src/main/java/com/daro/reactnative/view/DaroMediaView.kt +123 -0
  19. package/android/src/main/java/com/daro/reactnative/view/{DaroMAdBannerViewContainer.kt → DaroRNAdBannerViewContainer.kt} +2 -3
  20. package/android/src/main/java/com/daro/reactnative/view/DaroRNAdNativeViewContainer.kt +623 -0
  21. package/android/src/newarch/java/com/daro/reactnative/DaroRNModuleSpec.kt +6 -0
  22. package/android/src/oldarch/java/com/daro/reactnative/DaroRNModuleSpec.kt +119 -0
  23. package/ios/{DaroMModule+AppOpen.swift → DaroRNModule+AppOpen.swift} +22 -20
  24. package/ios/DaroRNModule+Consent.swift +88 -0
  25. package/ios/{DaroMModule+Interstitial.swift → DaroRNModule+Interstitial.swift} +21 -18
  26. package/ios/{DaroMModule+LightPopup.swift → DaroRNModule+LightPopup.swift} +18 -15
  27. package/ios/DaroRNModule+Qa.swift +158 -0
  28. package/ios/{DaroMModule+Rewarded.swift → DaroRNModule+Rewarded.swift} +22 -19
  29. package/ios/DaroRNModule.mm +88 -0
  30. package/ios/{DaroMModule.swift → DaroRNModule.swift} +24 -10
  31. package/ios/Fabric/DaroRNAdBannerComponentView.mm +219 -0
  32. package/ios/Fabric/DaroRNFabricEventSink.mm +31 -0
  33. package/ios/Fabric/DaroRNFabricPropApplier.mm +123 -0
  34. package/ios/Fabric/DaroRNNativeAdComponentView.mm +306 -0
  35. package/ios/{DaroMAdBannerViewManager.m → Paper/DaroRNAdBannerViewManager.m} +4 -2
  36. package/ios/Paper/DaroRNAdBannerViewManager.swift +21 -0
  37. package/ios/{DaroMNativeAdViewManager.m → Paper/DaroRNNativeAdViewManager.m} +3 -2
  38. package/ios/Paper/DaroRNNativeAdViewManager.swift +22 -0
  39. package/ios/Shared/DaroMediationDebugger.swift +14 -0
  40. package/ios/{mediation/admob → Shared}/DaroMediationTypes.swift +1 -0
  41. package/ios/Shared/DaroRNAdEventSink.swift +24 -0
  42. package/ios/Shared/DaroRNBannerAdView.swift +188 -0
  43. package/ios/Shared/DaroRNNativeAdLoadCoordinator.swift +49 -0
  44. package/ios/Shared/DaroRNNativeAdView.swift +575 -0
  45. package/ios/Shared/DaroRNNativeAssetResolver.swift +53 -0
  46. package/lib/commonjs/AdBannerView.js +20 -41
  47. package/lib/commonjs/AdBannerView.js.map +1 -1
  48. package/lib/commonjs/AppOpenAd.js +45 -12
  49. package/lib/commonjs/AppOpenAd.js.map +1 -1
  50. package/lib/commonjs/DaroMediaViewNativeComponent.ts +9 -0
  51. package/lib/commonjs/DaroRNAdBannerViewNativeComponent.ts +50 -0
  52. package/lib/commonjs/DaroRNNativeAdViewNativeComponent.ts +65 -0
  53. package/lib/commonjs/EventEmitter.js +4 -5
  54. package/lib/commonjs/EventEmitter.js.map +1 -1
  55. package/lib/commonjs/InterstitialAd.js +9 -11
  56. package/lib/commonjs/InterstitialAd.js.map +1 -1
  57. package/lib/commonjs/LightPopupAd.js +11 -12
  58. package/lib/commonjs/LightPopupAd.js.map +1 -1
  59. package/lib/commonjs/NativeDaroModule.js +9 -0
  60. package/lib/commonjs/NativeDaroModule.js.map +1 -0
  61. package/lib/commonjs/RewardedAd.js +9 -11
  62. package/lib/commonjs/RewardedAd.js.map +1 -1
  63. package/lib/commonjs/codegen-env.d.js +2 -0
  64. package/lib/commonjs/codegen-env.d.js.map +1 -0
  65. package/lib/commonjs/hooks/useInterstitialAd.js +110 -0
  66. package/lib/commonjs/hooks/useInterstitialAd.js.map +1 -0
  67. package/lib/commonjs/hooks/useLightPopupAd.js +114 -0
  68. package/lib/commonjs/hooks/useLightPopupAd.js.map +1 -0
  69. package/lib/commonjs/hooks/useRewardedAd.js +113 -0
  70. package/lib/commonjs/hooks/useRewardedAd.js.map +1 -0
  71. package/lib/commonjs/index.js +150 -13
  72. package/lib/commonjs/index.js.map +1 -1
  73. package/lib/commonjs/nativeAd/NativeAdView.js +23 -22
  74. package/lib/commonjs/nativeAd/NativeAdView.js.map +1 -1
  75. package/lib/commonjs/nativeAd/NativeAdViewComponents.js +43 -31
  76. package/lib/commonjs/nativeAd/NativeAdViewComponents.js.map +1 -1
  77. package/lib/commonjs/nativeAd/NativeAdViewProvider.js +34 -7
  78. package/lib/commonjs/nativeAd/NativeAdViewProvider.js.map +1 -1
  79. package/lib/module/AdBannerView.js +19 -42
  80. package/lib/module/AdBannerView.js.map +1 -1
  81. package/lib/module/AppOpenAd.js +45 -13
  82. package/lib/module/AppOpenAd.js.map +1 -1
  83. package/lib/module/DaroMediaViewNativeComponent.ts +9 -0
  84. package/lib/module/DaroRNAdBannerViewNativeComponent.ts +50 -0
  85. package/lib/module/DaroRNNativeAdViewNativeComponent.ts +65 -0
  86. package/lib/module/EventEmitter.js +4 -6
  87. package/lib/module/EventEmitter.js.map +1 -1
  88. package/lib/module/InterstitialAd.js +8 -11
  89. package/lib/module/InterstitialAd.js.map +1 -1
  90. package/lib/module/LightPopupAd.js +11 -13
  91. package/lib/module/LightPopupAd.js.map +1 -1
  92. package/lib/module/NativeDaroModule.js +5 -0
  93. package/lib/module/NativeDaroModule.js.map +1 -0
  94. package/lib/module/RewardedAd.js +8 -11
  95. package/lib/module/RewardedAd.js.map +1 -1
  96. package/lib/module/codegen-env.d.js +2 -0
  97. package/lib/module/codegen-env.d.js.map +1 -0
  98. package/lib/module/hooks/useInterstitialAd.js +106 -0
  99. package/lib/module/hooks/useInterstitialAd.js.map +1 -0
  100. package/lib/module/hooks/useLightPopupAd.js +110 -0
  101. package/lib/module/hooks/useLightPopupAd.js.map +1 -0
  102. package/lib/module/hooks/useRewardedAd.js +109 -0
  103. package/lib/module/hooks/useRewardedAd.js.map +1 -0
  104. package/lib/module/index.js +108 -13
  105. package/lib/module/index.js.map +1 -1
  106. package/lib/module/nativeAd/NativeAdView.js +22 -23
  107. package/lib/module/nativeAd/NativeAdView.js.map +1 -1
  108. package/lib/module/nativeAd/NativeAdViewComponents.js +45 -34
  109. package/lib/module/nativeAd/NativeAdViewComponents.js.map +1 -1
  110. package/lib/module/nativeAd/NativeAdViewProvider.js +35 -8
  111. package/lib/module/nativeAd/NativeAdViewProvider.js.map +1 -1
  112. package/lib/typescript/commonjs/plugin/src/index.d.ts +2 -6
  113. package/lib/typescript/commonjs/plugin/src/index.d.ts.map +1 -1
  114. package/lib/typescript/commonjs/plugin/src/withAndroid.d.ts +2 -6
  115. package/lib/typescript/commonjs/plugin/src/withAndroid.d.ts.map +1 -1
  116. package/lib/typescript/commonjs/plugin/src/withIos.d.ts +2 -6
  117. package/lib/typescript/commonjs/plugin/src/withIos.d.ts.map +1 -1
  118. package/lib/typescript/commonjs/src/AdBannerView.d.ts +2 -2
  119. package/lib/typescript/commonjs/src/AdBannerView.d.ts.map +1 -1
  120. package/lib/typescript/commonjs/src/AppOpenAd.d.ts +2 -2
  121. package/lib/typescript/commonjs/src/AppOpenAd.d.ts.map +1 -1
  122. package/lib/typescript/commonjs/src/DaroMediaViewNativeComponent.d.ts +6 -0
  123. package/lib/typescript/commonjs/src/DaroMediaViewNativeComponent.d.ts.map +1 -0
  124. package/lib/typescript/commonjs/src/DaroRNAdBannerViewNativeComponent.d.ts +33 -0
  125. package/lib/typescript/commonjs/src/DaroRNAdBannerViewNativeComponent.d.ts.map +1 -0
  126. package/lib/typescript/commonjs/src/DaroRNNativeAdViewNativeComponent.d.ts +43 -0
  127. package/lib/typescript/commonjs/src/DaroRNNativeAdViewNativeComponent.d.ts.map +1 -0
  128. package/lib/typescript/commonjs/src/EventEmitter.d.ts.map +1 -1
  129. package/lib/typescript/commonjs/src/InterstitialAd.d.ts.map +1 -1
  130. package/lib/typescript/commonjs/src/LightPopupAd.d.ts.map +1 -1
  131. package/lib/typescript/commonjs/src/NativeDaroModule.d.ts +70 -0
  132. package/lib/typescript/commonjs/src/NativeDaroModule.d.ts.map +1 -0
  133. package/lib/typescript/commonjs/src/RewardedAd.d.ts.map +1 -1
  134. package/lib/typescript/commonjs/src/hooks/useInterstitialAd.d.ts +19 -0
  135. package/lib/typescript/commonjs/src/hooks/useInterstitialAd.d.ts.map +1 -0
  136. package/lib/typescript/commonjs/src/hooks/useLightPopupAd.d.ts +23 -0
  137. package/lib/typescript/commonjs/src/hooks/useLightPopupAd.d.ts.map +1 -0
  138. package/lib/typescript/commonjs/src/hooks/useRewardedAd.d.ts +20 -0
  139. package/lib/typescript/commonjs/src/hooks/useRewardedAd.d.ts.map +1 -0
  140. package/lib/typescript/commonjs/src/index.d.ts +86 -1
  141. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  142. package/lib/typescript/commonjs/src/nativeAd/NativeAdView.d.ts +1 -0
  143. package/lib/typescript/commonjs/src/nativeAd/NativeAdView.d.ts.map +1 -1
  144. package/lib/typescript/commonjs/src/nativeAd/NativeAdViewComponents.d.ts.map +1 -1
  145. package/lib/typescript/commonjs/src/nativeAd/NativeAdViewProvider.d.ts +11 -5
  146. package/lib/typescript/commonjs/src/nativeAd/NativeAdViewProvider.d.ts.map +1 -1
  147. package/lib/typescript/commonjs/src/types/AdInfo.d.ts +15 -0
  148. package/lib/typescript/commonjs/src/types/AdInfo.d.ts.map +1 -1
  149. package/lib/typescript/commonjs/src/types/AdProps.d.ts +0 -1
  150. package/lib/typescript/commonjs/src/types/AdProps.d.ts.map +1 -1
  151. package/lib/typescript/commonjs/src/types/NativeAdViewProps.d.ts +2 -0
  152. package/lib/typescript/commonjs/src/types/NativeAdViewProps.d.ts.map +1 -1
  153. package/lib/typescript/module/plugin/src/index.d.ts +2 -6
  154. package/lib/typescript/module/plugin/src/index.d.ts.map +1 -1
  155. package/lib/typescript/module/plugin/src/withAndroid.d.ts +2 -6
  156. package/lib/typescript/module/plugin/src/withAndroid.d.ts.map +1 -1
  157. package/lib/typescript/module/plugin/src/withIos.d.ts +2 -6
  158. package/lib/typescript/module/plugin/src/withIos.d.ts.map +1 -1
  159. package/lib/typescript/module/src/AdBannerView.d.ts +2 -2
  160. package/lib/typescript/module/src/AdBannerView.d.ts.map +1 -1
  161. package/lib/typescript/module/src/AppOpenAd.d.ts +2 -2
  162. package/lib/typescript/module/src/AppOpenAd.d.ts.map +1 -1
  163. package/lib/typescript/module/src/DaroMediaViewNativeComponent.d.ts +6 -0
  164. package/lib/typescript/module/src/DaroMediaViewNativeComponent.d.ts.map +1 -0
  165. package/lib/typescript/module/src/DaroRNAdBannerViewNativeComponent.d.ts +33 -0
  166. package/lib/typescript/module/src/DaroRNAdBannerViewNativeComponent.d.ts.map +1 -0
  167. package/lib/typescript/module/src/DaroRNNativeAdViewNativeComponent.d.ts +43 -0
  168. package/lib/typescript/module/src/DaroRNNativeAdViewNativeComponent.d.ts.map +1 -0
  169. package/lib/typescript/module/src/EventEmitter.d.ts.map +1 -1
  170. package/lib/typescript/module/src/InterstitialAd.d.ts.map +1 -1
  171. package/lib/typescript/module/src/LightPopupAd.d.ts.map +1 -1
  172. package/lib/typescript/module/src/NativeDaroModule.d.ts +70 -0
  173. package/lib/typescript/module/src/NativeDaroModule.d.ts.map +1 -0
  174. package/lib/typescript/module/src/RewardedAd.d.ts.map +1 -1
  175. package/lib/typescript/module/src/hooks/useInterstitialAd.d.ts +19 -0
  176. package/lib/typescript/module/src/hooks/useInterstitialAd.d.ts.map +1 -0
  177. package/lib/typescript/module/src/hooks/useLightPopupAd.d.ts +23 -0
  178. package/lib/typescript/module/src/hooks/useLightPopupAd.d.ts.map +1 -0
  179. package/lib/typescript/module/src/hooks/useRewardedAd.d.ts +20 -0
  180. package/lib/typescript/module/src/hooks/useRewardedAd.d.ts.map +1 -0
  181. package/lib/typescript/module/src/index.d.ts +86 -1
  182. package/lib/typescript/module/src/index.d.ts.map +1 -1
  183. package/lib/typescript/module/src/nativeAd/NativeAdView.d.ts +1 -0
  184. package/lib/typescript/module/src/nativeAd/NativeAdView.d.ts.map +1 -1
  185. package/lib/typescript/module/src/nativeAd/NativeAdViewComponents.d.ts.map +1 -1
  186. package/lib/typescript/module/src/nativeAd/NativeAdViewProvider.d.ts +11 -5
  187. package/lib/typescript/module/src/nativeAd/NativeAdViewProvider.d.ts.map +1 -1
  188. package/lib/typescript/module/src/types/AdInfo.d.ts +15 -0
  189. package/lib/typescript/module/src/types/AdInfo.d.ts.map +1 -1
  190. package/lib/typescript/module/src/types/AdProps.d.ts +0 -1
  191. package/lib/typescript/module/src/types/AdProps.d.ts.map +1 -1
  192. package/lib/typescript/module/src/types/NativeAdViewProps.d.ts +2 -0
  193. package/lib/typescript/module/src/types/NativeAdViewProps.d.ts.map +1 -1
  194. package/package.json +12 -5
  195. package/plugin/build/index.d.ts +2 -6
  196. package/plugin/build/index.js +21 -56
  197. package/plugin/build/withAndroid.d.ts +2 -6
  198. package/plugin/build/withAndroid.js +123 -83
  199. package/plugin/build/withIos.d.ts +2 -6
  200. package/plugin/build/withIos.js +37 -34
  201. package/react-native-daro.podspec +4 -2
  202. package/src/AdBannerView.tsx +24 -63
  203. package/src/AppOpenAd.ts +48 -17
  204. package/src/DaroMediaViewNativeComponent.ts +9 -0
  205. package/src/DaroRNAdBannerViewNativeComponent.ts +50 -0
  206. package/src/DaroRNNativeAdViewNativeComponent.ts +65 -0
  207. package/src/EventEmitter.ts +4 -5
  208. package/src/InterstitialAd.ts +8 -10
  209. package/src/LightPopupAd.ts +11 -12
  210. package/src/NativeDaroModule.ts +106 -0
  211. package/src/RewardedAd.ts +8 -10
  212. package/src/codegen-env.d.ts +45 -0
  213. package/src/hooks/useInterstitialAd.ts +117 -0
  214. package/src/hooks/useLightPopupAd.ts +132 -0
  215. package/src/hooks/useRewardedAd.ts +122 -0
  216. package/src/index.tsx +157 -22
  217. package/src/nativeAd/NativeAdView.tsx +41 -54
  218. package/src/nativeAd/NativeAdViewComponents.tsx +80 -42
  219. package/src/nativeAd/NativeAdViewProvider.tsx +75 -17
  220. package/src/types/AdInfo.ts +17 -0
  221. package/src/types/AdProps.ts +0 -2
  222. package/src/types/NativeAdViewProps.ts +7 -0
  223. package/android/src/admob/java/com/daro/reactnative/DaroSdkBridge.kt +0 -23
  224. package/android/src/main/java/com/daro/reactnative/DaroMAdBannerViewManager.kt +0 -132
  225. package/android/src/main/java/com/daro/reactnative/DaroMAdNativeViewManager.kt +0 -136
  226. package/android/src/main/java/com/daro/reactnative/DaroMModule.kt +0 -202
  227. package/android/src/main/java/com/daro/reactnative/DaroMPackage.kt +0 -21
  228. package/android/src/main/java/com/daro/reactnative/view/DaroMAdNativeViewContainer.kt +0 -375
  229. package/ios/DaroMAdBannerViewManager.swift +0 -91
  230. package/ios/DaroMModule.mm +0 -45
  231. package/ios/DaroMNativeAdViewManager.swift +0 -291
  232. package/ios/mediation/admob/DaroMediationDebugger.swift +0 -11
  233. package/lib/commonjs/types/DaroMMobileAds.js +0 -2
  234. package/lib/commonjs/types/DaroMMobileAds.js.map +0 -1
  235. package/lib/module/types/DaroMMobileAds.js +0 -2
  236. package/lib/module/types/DaroMMobileAds.js.map +0 -1
  237. package/lib/typescript/commonjs/src/types/DaroMMobileAds.d.ts +0 -6
  238. package/lib/typescript/commonjs/src/types/DaroMMobileAds.d.ts.map +0 -1
  239. package/lib/typescript/module/src/types/DaroMMobileAds.d.ts +0 -6
  240. package/lib/typescript/module/src/types/DaroMMobileAds.d.ts.map +0 -1
  241. package/src/types/DaroMMobileAds.ts +0 -5
@@ -0,0 +1,119 @@
1
+ package com.daro.reactnative
2
+
3
+ import com.facebook.react.bridge.Promise
4
+ import com.facebook.react.bridge.ReactApplicationContext
5
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
6
+ import com.facebook.react.bridge.ReactMethod
7
+ import com.facebook.react.bridge.ReadableMap
8
+
9
+ abstract class DaroRNModuleSpec(reactContext: ReactApplicationContext) :
10
+ ReactContextBaseJavaModule(reactContext) {
11
+
12
+ override fun getName(): String = DaroRNModule.NAME
13
+
14
+ protected abstract fun getTypedExportedConstants(): MutableMap<String, Any>
15
+
16
+ override fun getConstants(): MutableMap<String, Any> = getTypedExportedConstants()
17
+
18
+ @ReactMethod
19
+ abstract fun addListener(eventName: String)
20
+
21
+ @ReactMethod
22
+ abstract fun removeListeners(count: Double)
23
+
24
+ @ReactMethod
25
+ abstract fun isInitialized(promise: Promise)
26
+
27
+ @ReactMethod
28
+ abstract fun initializeSdk(promise: Promise)
29
+
30
+ @ReactMethod
31
+ abstract fun setUserId(userId: String, promise: Promise)
32
+
33
+ @ReactMethod
34
+ abstract fun setGdpr(status: String, consentString: String, promise: Promise)
35
+
36
+ @ReactMethod
37
+ abstract fun setCcpa(status: String, consentString: String, promise: Promise)
38
+
39
+ @ReactMethod
40
+ abstract fun setCoppa(status: String, promise: Promise)
41
+
42
+ @ReactMethod
43
+ abstract fun showMediationDebugger(promise: Promise)
44
+
45
+ // QA 표면 — newarch 는 NativeDaroModule.ts 에서 코드젠으로 생기지만 oldarch 는 이
46
+ // 손 스펙이 정본이다. 스펙에 메서드를 더할 때 여기도 같이 더하지 않으면 oldarch
47
+ // 소비자에서 "overrides nothing" 으로 컴파일이 깨진다 (example 은 newarch 라 안 보인다).
48
+ @ReactMethod
49
+ abstract fun showMediationDebuggerFor(mediation: String, promise: Promise)
50
+
51
+ @ReactMethod
52
+ abstract fun getSdkVersion(promise: Promise)
53
+
54
+ @ReactMethod
55
+ abstract fun getMediationStatuses(promise: Promise)
56
+
57
+ @ReactMethod
58
+ abstract fun getMediationWeights(promise: Promise)
59
+
60
+ @ReactMethod
61
+ abstract fun getAdapterInventory(promise: Promise)
62
+
63
+ @ReactMethod
64
+ abstract fun getIntegrationKeyInfo(promise: Promise)
65
+
66
+ @ReactMethod
67
+ abstract fun isInterstitialReady(requestId: Double, adUnitId: String, promise: Promise)
68
+
69
+ @ReactMethod
70
+ abstract fun loadInterstitial(requestId: Double, adUnitId: String, promise: Promise)
71
+
72
+ @ReactMethod
73
+ abstract fun showInterstitial(requestId: Double, adUnitId: String, promise: Promise)
74
+
75
+ @ReactMethod
76
+ abstract fun isRewardedAdReady(requestId: Double, adUnitId: String, promise: Promise)
77
+
78
+ @ReactMethod
79
+ abstract fun loadRewardedAd(requestId: Double, adUnitId: String, promise: Promise)
80
+
81
+ @ReactMethod
82
+ abstract fun showRewardedAd(
83
+ requestId: Double,
84
+ adUnitId: String,
85
+ customData: String?,
86
+ promise: Promise,
87
+ )
88
+
89
+ @ReactMethod
90
+ abstract fun isAppOpenAdReady(requestId: Double, adUnitId: String, promise: Promise)
91
+
92
+ @ReactMethod
93
+ abstract fun loadAppOpenAd(requestId: Double, adUnitId: String, promise: Promise)
94
+
95
+ @ReactMethod
96
+ abstract fun showAppOpenAd(
97
+ requestId: Double,
98
+ adUnitId: String,
99
+ customData: String?,
100
+ promise: Promise,
101
+ )
102
+
103
+ @ReactMethod
104
+ abstract fun isLightPopupReady(requestId: Double, adUnitId: String, promise: Promise)
105
+
106
+ @ReactMethod
107
+ abstract fun loadLightPopup(requestId: Double, adUnitId: String, promise: Promise)
108
+
109
+ @ReactMethod
110
+ abstract fun showLightPopup(requestId: Double, adUnitId: String, promise: Promise)
111
+
112
+ @ReactMethod
113
+ abstract fun setLightPopupAdConfiguration(
114
+ requestId: Double,
115
+ adUnitId: String,
116
+ configuration: ReadableMap,
117
+ promise: Promise,
118
+ )
119
+ }
@@ -2,45 +2,47 @@ import React
2
2
 
3
3
  // MARK: - AppOpen Ad Methods
4
4
 
5
- extension DaroMModule {
5
+ extension DaroRNModule {
6
6
 
7
- @objc(isAppOpenAdReady::::)
7
+ @objc(isAppOpenAdReady:adUnitId:resolve:reject:)
8
8
  func isAppOpenAdReady(
9
- _ requestId: NSNumber,
9
+ requestId: Double,
10
10
  adUnitId: String,
11
11
  resolve: RCTPromiseResolveBlock,
12
12
  reject: RCTPromiseRejectBlock
13
13
  ) {
14
+ let requestId = Int(requestId)
14
15
  if !Self.sdkInitialized {
15
- DaroMModule.logger.debug("[DaroMMobileAds] !isInitialized")
16
+ DaroRNModule.logger.debug("[DaroRNMobileAds] !isInitialized")
16
17
  resolve(false)
17
18
  return
18
19
  }
19
- resolve(appOpenAds[requestId.intValue]?.loadedAd != nil)
20
+ resolve(appOpenAds[requestId]?.loadedAd != nil)
20
21
  }
21
22
 
22
- @objc(loadAppOpenAd::::)
23
+ @objc(loadAppOpenAd:adUnitId:resolve:reject:)
23
24
  func loadAppOpenAd(
24
- _ requestId: NSNumber,
25
+ requestId: Double,
25
26
  adUnitId: String,
26
27
  resolve: RCTPromiseResolveBlock,
27
28
  reject: RCTPromiseRejectBlock
28
29
  ) {
29
- let appOpenAdLoader = retrieveAppOpenLoader(requestId: requestId.intValue, adUnitId: adUnitId)
30
+ let requestId = Int(requestId)
31
+ let appOpenAdLoader = retrieveAppOpenLoader(requestId: requestId, adUnitId: adUnitId)
30
32
  appOpenAdLoader.loadAd()
31
- resolve(Void())
33
+ resolve(Void())
32
34
  }
33
35
 
34
- @objc(showAppOpenAd::::::)
36
+ @objc(showAppOpenAd:adUnitId:customData:resolve:reject:)
35
37
  func showAppOpenAd(
36
- _ requestId: NSNumber,
38
+ requestId: Double,
37
39
  adUnitId: String,
38
- placement: String?,
39
40
  customData: String?,
40
41
  resolve: @escaping RCTPromiseResolveBlock,
41
42
  reject: RCTPromiseRejectBlock
42
43
  ) {
43
- guard let loadedAd = appOpenAds[requestId.intValue]?.loadedAd else {
44
+ let requestId = Int(requestId)
45
+ guard let loadedAd = appOpenAds[requestId]?.loadedAd else {
44
46
  reject("APPOPEN_NOT_LOADED", "AppOpen ad not loaded", nil)
45
47
  return
46
48
  }
@@ -56,25 +58,25 @@ extension DaroMModule {
56
58
  } else {
57
59
  let appOpenLoader = DaroAppOpenAdLoader(unit: DaroAdUnit(unitId: adUnitId))
58
60
  appOpenLoader.listener.onAdClicked = { [weak self] adInfo in
59
- DaroMModule.logger.debug("[DARO] Sample AppOpen Ad clicked")
61
+ DaroRNModule.logger.debug("[DARO] Sample AppOpen Ad clicked")
60
62
  self?.sendEvent(with: .onAppOpenAdClickedEvent, body: adInfo?.toBody(requestId: requestId))
61
63
  }
62
64
 
63
65
  appOpenLoader.listener.onAdImpression = { [weak self] adInfo in
64
- DaroMModule.logger.debug("[DARO] Sample AppOpen Ad impression")
66
+ DaroRNModule.logger.debug("[DARO] Sample AppOpen Ad impression")
65
67
  self?.appOpenAds[requestId]?.loadedAd = nil
66
68
  self?.sendEvent(with: .onAppOpenAdImpressionRecordedEvent, body: adInfo?.toBody(requestId: requestId))
67
69
  }
68
70
 
69
71
  appOpenLoader.listener.onAdLoadSuccess = { [weak self] ad, adInfo in
70
- DaroMModule.logger.debug("[DARO] Sample AppOpen Ad loaded")
72
+ DaroRNModule.logger.debug("[DARO] Sample AppOpen Ad loaded")
71
73
  self?.appOpenAds[requestId]?.loadedAd = ad
72
74
  self?.sendEvent(with: .onAppOpenAdLoadedEvent, body: adInfo?.toBody(requestId: requestId))
73
75
  self?.setupAppOpenListener(for: ad, requestId: requestId)
74
76
  }
75
77
 
76
78
  appOpenLoader.listener.onAdLoadFail = { [weak self] error in
77
- DaroMModule.logger.debug("[DARO] Sample AppOpen Ad failed: \(error)")
79
+ DaroRNModule.logger.debug("[DARO] Sample AppOpen Ad failed: \(error)")
78
80
  self?.sendEvent(with: .onAppOpenAdLoadFailedEvent, body: error.toBody(requestId: requestId))
79
81
  }
80
82
  self.appOpenAds[requestId] = AppOpenAd(loader: appOpenLoader)
@@ -84,17 +86,17 @@ extension DaroMModule {
84
86
 
85
87
  private func setupAppOpenListener(for ad: DaroAppOpenAd, requestId: Int) {
86
88
  ad.appOpenAdListener.onShown = { [weak self] adInfo in
87
- DaroMModule.logger.debug("[DARO] Sample AppOpen Ad displayed")
89
+ DaroRNModule.logger.debug("[DARO] Sample AppOpen Ad displayed")
88
90
  self?.sendEvent(with: .onAppOpenAdDisplayedEvent, body: adInfo?.toBody(requestId: requestId))
89
91
  }
90
92
 
91
93
  ad.appOpenAdListener.onDismiss = { [weak self] adInfo in
92
- DaroMModule.logger.debug("[DARO] Sample AppOpen Ad hidden")
94
+ DaroRNModule.logger.debug("[DARO] Sample AppOpen Ad hidden")
93
95
  self?.sendEvent(with: .onAppOpenAdHiddenEvent, body: adInfo?.toBody(requestId: requestId))
94
96
  }
95
97
 
96
98
  ad.appOpenAdListener.onFailedToShow = { [weak self] adInfo, error in
97
- DaroMModule.logger.debug("[DARO] Sample AppOpen Ad failed to display")
99
+ DaroRNModule.logger.debug("[DARO] Sample AppOpen Ad failed to display")
98
100
  self?.sendEvent(with: .onAppOpenAdFailedToDisplayEvent, body: adInfo?.toBody(requestId: requestId))
99
101
  }
100
102
  }
@@ -0,0 +1,88 @@
1
+ import Daro
2
+ import Dispatch
3
+ import React
4
+
5
+ /// 동의 표면(GDPR·CCPA·COPPA) — JS 의 플랫폼 중립 문자열을 iOS 표현으로 옮긴다.
6
+ ///
7
+ /// **JS 가 raw Int 를 넘기지 않는다.** `DaroGdprStatus` 는 `@objc enum … : Int` 라
8
+ /// 브리지로 정수를 흘리는 게 제일 짧지만, 그러면 iOS 의 case 순서가 JS 계약이 되어
9
+ /// Android(enum 이름 기반)가 그 정수를 되옮겨야 한다. 되옮김이 빠지거나 낡으면 **에러
10
+ /// 없이 틀린 동의 상태**가 전달된다 — Flutter 가 그 반대 방향(Android enum 이름을 그대로
11
+ /// iOS 로)으로 겪은 사고가 DARO-1471 이다. 그래서 오가는 것은 어느 플랫폼 것도 아닌
12
+ /// 문자열이고, 옮기는 표가 여기 한 장 있다.
13
+ extension DaroRNModule {
14
+
15
+ private static let gdprStatuses: [String: DaroGdprStatus] = [
16
+ "optIn": .optIn,
17
+ "optOut": .optOut,
18
+ "notApplicable": .notApplicable,
19
+ "unknown": .unknown,
20
+ ]
21
+
22
+ private static let ccpaStatuses: [String: DaroCcpaStatus] = [
23
+ "optIn": .optIn,
24
+ "optOut": .optOut,
25
+ "notApplicable": .notApplicable,
26
+ ]
27
+
28
+ private static let coppaStatuses: [String: DaroCoppaStatus] = [
29
+ "child": .child,
30
+ "notChild": .notChild,
31
+ ]
32
+
33
+ // 모르는 상태는 **기본값으로 떨어뜨리지 않고 reject 한다.** 동의는 조용히 틀리면 안 되는
34
+ // 값이다 — 오타가 "일단 옵트인"으로 흡수되면 호출자는 성공 응답을 받고 규제 대상
35
+ // 트래픽에 개인화 광고를 계속 태운다. 실패가 화면에 남는 쪽이 싸다.
36
+ @objc(setGdpr:consentString:resolve:reject:)
37
+ func setGdpr(
38
+ status: String,
39
+ consentString: String,
40
+ resolve: @escaping RCTPromiseResolveBlock,
41
+ reject: @escaping RCTPromiseRejectBlock
42
+ ) {
43
+ guard let parsed = Self.gdprStatuses[status] else {
44
+ reject("INVALID_CONSENT_STATUS", "Unknown GdprStatus: \(status)", nil)
45
+ return
46
+ }
47
+ // `DaroAds.setGdpr` 는 메인 스레드 호출을 요구한다(SDK 주석). 이 모듈의 메서드는
48
+ // RN 이 모듈 전용 큐에서 부르므로 여기서 옮겨야 한다 — 안 옮기면 백그라운드에서
49
+ // 네트워크 SDK 의 프라이버시 설정을 만지게 된다.
50
+ DispatchQueue.main.async {
51
+ DaroAds.shared.setGdpr(parsed, consentString: consentString)
52
+ resolve(nil)
53
+ }
54
+ }
55
+
56
+ @objc(setCcpa:consentString:resolve:reject:)
57
+ func setCcpa(
58
+ status: String,
59
+ consentString: String,
60
+ resolve: @escaping RCTPromiseResolveBlock,
61
+ reject: @escaping RCTPromiseRejectBlock
62
+ ) {
63
+ guard let parsed = Self.ccpaStatuses[status] else {
64
+ reject("INVALID_CONSENT_STATUS", "Unknown CcpaStatus: \(status)", nil)
65
+ return
66
+ }
67
+ DispatchQueue.main.async {
68
+ DaroAds.shared.setCcpa(parsed, consentString: consentString)
69
+ resolve(nil)
70
+ }
71
+ }
72
+
73
+ @objc(setCoppa:resolve:reject:)
74
+ func setCoppa(
75
+ status: String,
76
+ resolve: @escaping RCTPromiseResolveBlock,
77
+ reject: @escaping RCTPromiseRejectBlock
78
+ ) {
79
+ guard let parsed = Self.coppaStatuses[status] else {
80
+ reject("INVALID_CONSENT_STATUS", "Unknown CoppaStatus: \(status)", nil)
81
+ return
82
+ }
83
+ DispatchQueue.main.async {
84
+ DaroAds.shared.setCoppa(parsed)
85
+ resolve(nil)
86
+ }
87
+ }
88
+ }
@@ -2,43 +2,46 @@ import React
2
2
 
3
3
  // MARK: - Interstitial Ad Methods
4
4
 
5
- extension DaroMModule {
5
+ extension DaroRNModule {
6
6
 
7
- @objc(isInterstitialReady::::)
7
+ @objc(isInterstitialReady:adUnitId:resolve:reject:)
8
8
  func isInterstitialReady(
9
- _ requestId: NSNumber,
9
+ requestId: Double,
10
10
  adUnitId: String,
11
11
  resolve: RCTPromiseResolveBlock,
12
12
  reject: RCTPromiseRejectBlock
13
13
  ) {
14
+ let requestId = Int(requestId)
14
15
  if !Self.sdkInitialized {
15
- DaroMModule.logger.debug("[DaroMMobileAds] !isInitialized")
16
+ DaroRNModule.logger.debug("[DaroRNMobileAds] !isInitialized")
16
17
  resolve(false)
17
18
  return
18
19
  }
19
- resolve(interstitials[requestId.intValue]?.loadedAd != nil)
20
+ resolve(interstitials[requestId]?.loadedAd != nil)
20
21
  }
21
22
 
22
- @objc(loadInterstitial::::)
23
+ @objc(loadInterstitial:adUnitId:resolve:reject:)
23
24
  func loadInterstitial(
24
- _ requestId: NSNumber,
25
+ requestId: Double,
25
26
  adUnitId: String,
26
27
  resolve: RCTPromiseResolveBlock,
27
28
  reject: RCTPromiseRejectBlock
28
29
  ) {
29
- let interstitialLoader = retrieveInterstitialLoader(requestId: requestId.intValue, adUnitId: adUnitId)
30
+ let requestId = Int(requestId)
31
+ let interstitialLoader = retrieveInterstitialLoader(requestId: requestId, adUnitId: adUnitId)
30
32
  interstitialLoader.loadAd()
31
33
  resolve(Void())
32
34
  }
33
35
 
34
- @objc(showInterstitial::::)
36
+ @objc(showInterstitial:adUnitId:resolve:reject:)
35
37
  func showInterstitial(
36
- _ requestId: NSNumber,
38
+ requestId: Double,
37
39
  adUnitId: String,
38
40
  resolve: @escaping RCTPromiseResolveBlock,
39
41
  reject: @escaping RCTPromiseRejectBlock
40
42
  ) {
41
- guard let loadedAd = interstitials[requestId.intValue]?.loadedAd else {
43
+ let requestId = Int(requestId)
44
+ guard let loadedAd = interstitials[requestId]?.loadedAd else {
42
45
  reject("INTERSTITIAL_NOT_LOADED", "Interstitial ad not loaded", nil)
43
46
  return
44
47
  }
@@ -58,25 +61,25 @@ extension DaroMModule {
58
61
  } else {
59
62
  let interstitialLoader = DaroInterstitialAdLoader(unit: DaroAdUnit(unitId: adUnitId))
60
63
  interstitialLoader.listener.onAdClicked = { [weak self] adInfo in
61
- DaroMModule.logger.debug("[DARO] Sample Interstitial Ad clicked")
64
+ DaroRNModule.logger.debug("[DARO] Sample Interstitial Ad clicked")
62
65
  self?.sendEvent(with: .onInterstitialClickedEvent, body: adInfo?.toBody(requestId: requestId))
63
66
  }
64
67
 
65
68
  interstitialLoader.listener.onAdImpression = { [weak self] adInfo in
66
- DaroMModule.logger.debug("[DARO] Sample Interstitial Ad impression")
69
+ DaroRNModule.logger.debug("[DARO] Sample Interstitial Ad impression")
67
70
  self?.interstitials[requestId]?.loadedAd = nil
68
71
  self?.sendEvent(with: .onInterstitialAdImpressionRecordedEvent, body: adInfo?.toBody(requestId: requestId))
69
72
  }
70
73
 
71
74
  interstitialLoader.listener.onAdLoadSuccess = { [weak self] ad, adInfo in
72
- DaroMModule.logger.debug("[DARO] Sample Interstitial Ad loaded")
75
+ DaroRNModule.logger.debug("[DARO] Sample Interstitial Ad loaded")
73
76
  self?.interstitials[requestId]?.loadedAd = ad
74
77
  self?.sendEvent(with: .onInterstitialLoadedEvent, body: adInfo?.toBody(requestId: requestId))
75
78
  self?.setupInterstitialListener(for: ad, requestId: requestId)
76
79
  }
77
80
 
78
81
  interstitialLoader.listener.onAdLoadFail = { [weak self] error in
79
- DaroMModule.logger.debug("[DARO] Sample Interstitial Ad failed: \(error)")
82
+ DaroRNModule.logger.debug("[DARO] Sample Interstitial Ad failed: \(error)")
80
83
  self?.sendEvent(with: .onInterstitialLoadFailedEvent, body: error.toBody(requestId: requestId))
81
84
  }
82
85
  self.interstitials[requestId] = InterstitialAd(loader: interstitialLoader)
@@ -86,17 +89,17 @@ extension DaroMModule {
86
89
 
87
90
  private func setupInterstitialListener(for ad: DaroInterstitialAd, requestId: Int) {
88
91
  ad.interstitialListener.onShown = { [weak self] adInfo in
89
- DaroMModule.logger.debug("[DARO] Sample Interstitial Ad displayed")
92
+ DaroRNModule.logger.debug("[DARO] Sample Interstitial Ad displayed")
90
93
  self?.sendEvent(with: .onInterstitialDisplayedEvent, body: adInfo?.toBody(requestId: requestId))
91
94
  }
92
95
 
93
96
  ad.interstitialListener.onDismiss = { [weak self] adInfo in
94
- DaroMModule.logger.debug("[DARO] Sample Interstitial Ad hidden")
97
+ DaroRNModule.logger.debug("[DARO] Sample Interstitial Ad hidden")
95
98
  self?.sendEvent(with: .onInterstitialHiddenEvent, body: adInfo?.toBody(requestId: requestId))
96
99
  }
97
100
 
98
101
  ad.interstitialListener.onFailedToShow = { [weak self] adInfo, error in
99
- DaroMModule.logger.debug("[DARO] Sample Interstitial Ad failed to display")
102
+ DaroRNModule.logger.debug("[DARO] Sample Interstitial Ad failed to display")
100
103
  self?.sendEvent(with: .onInterstitialAdFailedToDisplayEvent, body: adInfo?.toBody(requestId: requestId))
101
104
  }
102
105
  }
@@ -1,47 +1,50 @@
1
1
  import React
2
2
  import UIKit
3
3
  // MARK: - LightPopup Ad
4
- extension DaroMModule {
4
+ extension DaroRNModule {
5
5
 
6
- @objc(isLightPopupReady::::)
6
+ @objc(isLightPopupReady:adUnitId:resolve:reject:)
7
7
  func isLightPopupReady(
8
- _ requestId: NSNumber,
8
+ requestId: Double,
9
9
  adUnitId: String,
10
10
  resolve: RCTPromiseResolveBlock,
11
11
  reject: RCTPromiseRejectBlock
12
12
  ) {
13
+ let requestId = Int(requestId)
13
14
  if !Self.sdkInitialized {
14
- DaroMModule.logger.debug("[DaroMMobileAds] !isInitialized")
15
+ DaroRNModule.logger.debug("[DaroRNMobileAds] !isInitialized")
15
16
  resolve(false)
16
17
  return
17
18
  }
18
- resolve(lightPopups[requestId.intValue]?.loadedAd != nil)
19
+ resolve(lightPopups[requestId]?.loadedAd != nil)
19
20
  }
20
21
 
21
- @objc(loadLightPopup::::)
22
+ @objc(loadLightPopup:adUnitId:resolve:reject:)
22
23
  func loadLightPopup(
23
- _ requestId: NSNumber,
24
+ requestId: Double,
24
25
  adUnitId: String,
25
26
  resolve: RCTPromiseResolveBlock,
26
27
  reject: RCTPromiseRejectBlock
27
28
  ) {
28
- let lightPopupLoader = retrieveLightPopupLoader(requestId: requestId.intValue, adUnitId: adUnitId)
29
+ let requestId = Int(requestId)
30
+ let lightPopupLoader = retrieveLightPopupLoader(requestId: requestId, adUnitId: adUnitId)
29
31
  lightPopupLoader.loadAd()
30
32
  resolve(Void())
31
33
  }
32
34
 
33
- @objc(showLightPopup::::)
35
+ @objc(showLightPopup:adUnitId:resolve:reject:)
34
36
  func showLightPopup(
35
- _ requestId: NSNumber,
37
+ requestId: Double,
36
38
  adUnitId: String,
37
39
  resolve: @escaping RCTPromiseResolveBlock,
38
40
  reject: @escaping RCTPromiseRejectBlock
39
41
  ) {
40
- guard let loadedAd = lightPopups[requestId.intValue]?.loadedAd else {
42
+ let requestId = Int(requestId)
43
+ guard let loadedAd = lightPopups[requestId]?.loadedAd else {
41
44
  reject("LIGHTPOPUP_NOT_LOADED", "LightPopup ad not loaded", nil)
42
45
  return
43
46
  }
44
- let reqIdInt = requestId.intValue
47
+ let reqIdInt = requestId
45
48
  executeOnMainThread { [weak self] in
46
49
  guard let viewController = UIApplication.shared.windows.first?.rootViewController else {
47
50
  reject("VIEW_CONTROLLER_NOT_FOUND", "Root view controller not found", nil)
@@ -53,15 +56,15 @@ extension DaroMModule {
53
56
  }
54
57
  }
55
58
 
56
- @objc(setLightPopupAdConfiguration:::::)
59
+ @objc(setLightPopupAdConfiguration:adUnitId:configuration:resolve:reject:)
57
60
  func setLightPopupAdConfiguration(
58
- _ requestId: NSNumber,
61
+ requestId: Double,
59
62
  adUnitId: String,
60
63
  configuration: [String: Any],
61
64
  resolve: RCTPromiseResolveBlock,
62
65
  reject: RCTPromiseRejectBlock
63
66
  ) {
64
- let reqIdInt = requestId.intValue
67
+ let reqIdInt = Int(requestId)
65
68
  guard let loadedAd = lightPopups[reqIdInt]?.loadedAd else {
66
69
  lightPopupConfigurations[reqIdInt] = configuration
67
70
  resolve(Void())
@@ -0,0 +1,158 @@
1
+ import AppLovinSDK
2
+ import Daro
3
+ import Dispatch
4
+ import GoogleMobileAds
5
+ import React
6
+
7
+ /// Ad Inspector 제시 판정 상태 — **메인 큐에서만 만진다.**
8
+ ///
9
+ /// 값 타입 로컬을 escaping 클로저가 캡처하면 콜백 큐에 따라 읽기·쓰기가 겹칠 수 있어
10
+ /// promise 가 두 번 settle 될 위험이 있다. 참조 타입으로 두고 접근을 메인 큐로 모은다.
11
+ private final class DebuggerPresentation {
12
+ var settled = false
13
+ }
14
+
15
+ // QA 표면 — 통합 SDK 의 공개 API(mediationStatuses·mediationWeights)는 그대로 브리지하고,
16
+ // SDK 가 갖지 않는 것(서브네트워크 인벤토리·벤더 디버거)은 네이티브 QA 앱들과 같은 축으로
17
+ // 벤더에 직접 묻는다 (DARO-1424).
18
+ extension DaroRNModule {
19
+
20
+ @objc(getSdkVersion:reject:)
21
+ func getSdkVersion(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
22
+ // 핀(2.0.0-beta01, 8/19 빌드)에는 @_spi sdkVersion(DARO-1409, 8/21)이 없다.
23
+ // SPI 실린 베타로 핀이 오르면 실제 값으로 교체한다.
24
+ resolve(NSNull())
25
+ }
26
+
27
+ @objc(getMediationStatuses:reject:)
28
+ func getMediationStatuses(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
29
+ resolve(
30
+ DaroAds.shared.mediationStatuses.map {
31
+ [
32
+ "mediationPlatform": $0.mediationPlatform,
33
+ "isReady": $0.isReady,
34
+ "hasFailed": $0.hasFailed,
35
+ ]
36
+ }
37
+ )
38
+ }
39
+
40
+ @objc(getMediationWeights:reject:)
41
+ func getMediationWeights(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
42
+ if let weights = DaroAds.shared.mediationWeights {
43
+ // 키가 공개 어휘를 따른다 (DARO-1594). SDK 프로퍼티 이름과 같으므로 여기서
44
+ // 매핑하지 않는다 — 매핑을 두면 어휘가 또 바뀔 때 한쪽만 낡는다.
45
+ resolve(["daroa": weights.daroa, "darom": weights.darom])
46
+ } else {
47
+ resolve(NSNull())
48
+ }
49
+ }
50
+
51
+ @objc(showMediationDebuggerFor:resolve:reject:)
52
+ func showMediationDebuggerFor(
53
+ mediation: String,
54
+ resolve: @escaping RCTPromiseResolveBlock,
55
+ reject: @escaping RCTPromiseRejectBlock
56
+ ) {
57
+ DispatchQueue.main.async {
58
+ if mediation == "applovin" {
59
+ // ALSdk 초기화 뒤에 불러야 한다 — 전이면 빈 화면이 뜬다 (QA 앱 DebuggerHelper 실측).
60
+ ALSdk.shared().showMediationDebugger()
61
+ resolve(nil)
62
+ } else {
63
+ // **에러를 삼키지 않는다.** 초기화 전이거나 테스트 기기가 아니면 GMA 가 여기로
64
+ // 사유를 준다 — 버리면 화면에는 성공 로그만 남고 검사기는 안 뜬다.
65
+ //
66
+ // 이 콜백 하나가 두 사건을 겸한다: **실패(제시 못 함)** 와 **닫힘(정상 종료)**.
67
+ // 그래서 어느 쪽도 그냥 믿을 수 없다 — 콜백을 기다려 성공을 판정하면 "열렸다"가
68
+ // 검사기를 닫을 때까지(또는 앱을 그대로 죽이면 영영) 안 뜨고, 기다리지 않고 바로
69
+ // 성공 처리하면 **비동기로 오는 실패**(GMA 는 설정을 받아본 뒤에야 거절 사유를
70
+ // 안다)를 놓쳐 성공 로그만 남는다.
71
+ //
72
+ // 그래서 짧은 유예를 둔다. 그 안에 온 콜백은 제시 실패로 보고 reject 하고,
73
+ // 조용하면 떠 있는 것으로 보고 resolve 한다 — 그 뒤에 오는 콜백은 닫힘이다.
74
+ // **모든 판정을 메인 큐에서 한다** — 벤더가 어느 큐로 콜백하든 이중 settle 이
75
+ // 나지 않게(RN 은 두 번 settle 하면 예외를 던진다).
76
+ let state = DebuggerPresentation()
77
+ MobileAds.shared.presentAdInspector(from: nil) { error in
78
+ DispatchQueue.main.async {
79
+ if state.settled {
80
+ if let error {
81
+ Self.logger.error("Ad Inspector 종료 시 에러: \(error.localizedDescription)")
82
+ }
83
+ return
84
+ }
85
+ state.settled = true
86
+ if let error {
87
+ reject("AD_INSPECTOR_FAILED", error.localizedDescription, error)
88
+ } else {
89
+ // 유예 안에 에러 없이 닫혔다 — 열렸다가 곧장 닫힌 경우다.
90
+ resolve(nil)
91
+ }
92
+ }
93
+ }
94
+ DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
95
+ guard !state.settled else { return }
96
+ state.settled = true
97
+ resolve(nil)
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ // 주입 결과 판독 — pod install 훅이 Info.plist 에 심은 봉투·파생값 4종을 그대로 돌려준다.
104
+ @objc(getIntegrationKeyInfo:reject:)
105
+ func getIntegrationKeyInfo(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
106
+ let keys = [
107
+ "DaroIntegrationKey",
108
+ "DaroAppKey",
109
+ "GADApplicationIdentifier",
110
+ "DaroAppLovinSdkKey",
111
+ "DaroAppLovinAdReviewKey",
112
+ ]
113
+ var info: [String: Any] = [:]
114
+ for key in keys {
115
+ info[key] = Bundle.main.object(forInfoDictionaryKey: key) as? String ?? NSNull()
116
+ }
117
+ resolve(info)
118
+ }
119
+
120
+ @objc(getAdapterInventory:reject:)
121
+ func getAdapterInventory(
122
+ resolve: @escaping RCTPromiseResolveBlock,
123
+ reject: @escaping RCTPromiseRejectBlock
124
+ ) {
125
+ // **여기서 GMA 를 깨우지 않는다.** 한때 `MobileAds.start` 로 스냅샷을 받았는데, 그러면
126
+ // 초기화 전에 부른 호출이 GMA 를 먼저 띄워 SDK 의 초기화 순서 검증을 망가뜨린다 —
127
+ // 그 가드를 화면 콜백 하나에만 두면 다른 호출자(진단 스크립트·소비자)가 그냥 밟는다.
128
+ // `initializationStatus` 는 읽기 전용이라 부작용이 없다.
129
+ //
130
+ // **iOS 는 손 목록을 두지 않는다.** Android 는 `adapterStatusMap` 이 초기화된 것만
131
+ // 담아 미탑재와 구분이 안 되므로 클래스명을 나열하지만, iOS 의
132
+ // `adapterStatusesByClassName` 은 **링크된 어댑터를 전부** 담는다 — 손 목록은
133
+ // 반드시 낡는다(iOS QA 앱 `SDKInitializer.adapterInventory` 의 실측 결정과 같다).
134
+ // 초기화 전에는 비어 있을 수 있는데, 그건 화면이 펼 때마다 다시 읽어 메운다.
135
+ DispatchQueue.main.async {
136
+ let status = MobileAds.shared.initializationStatus
137
+ let admob = status.adapterStatusesByClassName
138
+ .sorted { $0.key < $1.key }
139
+ .map { key, value in
140
+ [
141
+ "name": key.replacingOccurrences(of: "GADMediationAdapter", with: ""),
142
+ "detail": value.state == .ready ? "READY" : value.description,
143
+ "isReady": value.state == .ready,
144
+ ]
145
+ }
146
+ let applovin = ALSdk.shared().availableMediatedNetworks
147
+ .sorted { $0.name < $1.name }
148
+ .map {
149
+ [
150
+ "name": $0.name,
151
+ "detail": $0.adapterVersion.isEmpty ? "미탑재" : $0.adapterVersion,
152
+ "isReady": !$0.adapterVersion.isEmpty,
153
+ ]
154
+ }
155
+ resolve(["admob": admob, "applovin": applovin])
156
+ }
157
+ }
158
+ }