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.
- package/README.md +2 -5
- package/android/build.gradle +17 -14
- package/android/src/main/java/com/daro/reactnative/DaroMediaViewManager.kt +25 -0
- package/android/src/main/java/com/daro/reactnative/DaroRNAdBannerViewManager.kt +105 -0
- package/android/src/main/java/com/daro/reactnative/DaroRNAdNativeViewManager.kt +163 -0
- package/android/src/main/java/com/daro/reactnative/DaroRNModule.kt +376 -0
- package/android/src/main/java/com/daro/reactnative/DaroRNPackage.kt +45 -0
- package/android/src/main/java/com/daro/reactnative/DaroSdkBridge.kt +52 -0
- package/android/src/main/java/com/daro/reactnative/constants/{InternalDaroMBannerSize.kt → InternalDaroRNBannerSize.kt} +2 -2
- package/android/src/main/java/com/daro/reactnative/event/{DaroMEvent.kt → DaroRNEvent.kt} +22 -11
- package/android/src/main/java/com/daro/reactnative/impl/{DaroMBannerViewModuleImpl.kt → DaroRNBannerViewModuleImpl.kt} +3 -3
- package/android/src/main/java/com/daro/reactnative/impl/{DaroMInterstitialModuleImpl.kt → DaroRNInterstitialModuleImpl.kt} +4 -4
- package/android/src/main/java/com/daro/reactnative/impl/{DaroMLightPopupModuleImpl.kt → DaroRNLightPopupModuleImpl.kt} +4 -4
- package/android/src/main/java/com/daro/reactnative/impl/{DaroMRewardedAdModuleImpl.kt → DaroRNRewardedAdModuleImpl.kt} +4 -4
- package/android/src/main/java/com/daro/reactnative/util/AdInfoUtil.kt +12 -0
- package/android/src/main/java/com/daro/reactnative/util/DaroQaProbe.kt +147 -0
- package/android/src/main/java/com/daro/reactnative/util/EventEmitterUtil.kt +20 -7
- package/android/src/main/java/com/daro/reactnative/view/DaroMediaView.kt +123 -0
- package/android/src/main/java/com/daro/reactnative/view/{DaroMAdBannerViewContainer.kt → DaroRNAdBannerViewContainer.kt} +2 -3
- package/android/src/main/java/com/daro/reactnative/view/DaroRNAdNativeViewContainer.kt +623 -0
- package/android/src/newarch/java/com/daro/reactnative/DaroRNModuleSpec.kt +6 -0
- package/android/src/oldarch/java/com/daro/reactnative/DaroRNModuleSpec.kt +119 -0
- package/ios/{DaroMModule+AppOpen.swift → DaroRNModule+AppOpen.swift} +22 -20
- package/ios/DaroRNModule+Consent.swift +88 -0
- package/ios/{DaroMModule+Interstitial.swift → DaroRNModule+Interstitial.swift} +21 -18
- package/ios/{DaroMModule+LightPopup.swift → DaroRNModule+LightPopup.swift} +18 -15
- package/ios/DaroRNModule+Qa.swift +158 -0
- package/ios/{DaroMModule+Rewarded.swift → DaroRNModule+Rewarded.swift} +22 -19
- package/ios/DaroRNModule.mm +88 -0
- package/ios/{DaroMModule.swift → DaroRNModule.swift} +24 -10
- package/ios/Fabric/DaroRNAdBannerComponentView.mm +219 -0
- package/ios/Fabric/DaroRNFabricEventSink.mm +31 -0
- package/ios/Fabric/DaroRNFabricPropApplier.mm +123 -0
- package/ios/Fabric/DaroRNNativeAdComponentView.mm +306 -0
- package/ios/{DaroMAdBannerViewManager.m → Paper/DaroRNAdBannerViewManager.m} +4 -2
- package/ios/Paper/DaroRNAdBannerViewManager.swift +21 -0
- package/ios/{DaroMNativeAdViewManager.m → Paper/DaroRNNativeAdViewManager.m} +3 -2
- package/ios/Paper/DaroRNNativeAdViewManager.swift +22 -0
- package/ios/Shared/DaroMediationDebugger.swift +14 -0
- package/ios/{mediation/admob → Shared}/DaroMediationTypes.swift +1 -0
- package/ios/Shared/DaroRNAdEventSink.swift +24 -0
- package/ios/Shared/DaroRNBannerAdView.swift +188 -0
- package/ios/Shared/DaroRNNativeAdLoadCoordinator.swift +49 -0
- package/ios/Shared/DaroRNNativeAdView.swift +575 -0
- package/ios/Shared/DaroRNNativeAssetResolver.swift +53 -0
- package/lib/commonjs/AdBannerView.js +20 -41
- package/lib/commonjs/AdBannerView.js.map +1 -1
- package/lib/commonjs/AppOpenAd.js +45 -12
- package/lib/commonjs/AppOpenAd.js.map +1 -1
- package/lib/commonjs/DaroMediaViewNativeComponent.ts +9 -0
- package/lib/commonjs/DaroRNAdBannerViewNativeComponent.ts +50 -0
- package/lib/commonjs/DaroRNNativeAdViewNativeComponent.ts +65 -0
- package/lib/commonjs/EventEmitter.js +4 -5
- package/lib/commonjs/EventEmitter.js.map +1 -1
- package/lib/commonjs/InterstitialAd.js +9 -11
- package/lib/commonjs/InterstitialAd.js.map +1 -1
- package/lib/commonjs/LightPopupAd.js +11 -12
- package/lib/commonjs/LightPopupAd.js.map +1 -1
- package/lib/commonjs/NativeDaroModule.js +9 -0
- package/lib/commonjs/NativeDaroModule.js.map +1 -0
- package/lib/commonjs/RewardedAd.js +9 -11
- package/lib/commonjs/RewardedAd.js.map +1 -1
- package/lib/commonjs/codegen-env.d.js +2 -0
- package/lib/commonjs/codegen-env.d.js.map +1 -0
- package/lib/commonjs/hooks/useInterstitialAd.js +110 -0
- package/lib/commonjs/hooks/useInterstitialAd.js.map +1 -0
- package/lib/commonjs/hooks/useLightPopupAd.js +114 -0
- package/lib/commonjs/hooks/useLightPopupAd.js.map +1 -0
- package/lib/commonjs/hooks/useRewardedAd.js +113 -0
- package/lib/commonjs/hooks/useRewardedAd.js.map +1 -0
- package/lib/commonjs/index.js +150 -13
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/nativeAd/NativeAdView.js +23 -22
- package/lib/commonjs/nativeAd/NativeAdView.js.map +1 -1
- package/lib/commonjs/nativeAd/NativeAdViewComponents.js +43 -31
- package/lib/commonjs/nativeAd/NativeAdViewComponents.js.map +1 -1
- package/lib/commonjs/nativeAd/NativeAdViewProvider.js +34 -7
- package/lib/commonjs/nativeAd/NativeAdViewProvider.js.map +1 -1
- package/lib/module/AdBannerView.js +19 -42
- package/lib/module/AdBannerView.js.map +1 -1
- package/lib/module/AppOpenAd.js +45 -13
- package/lib/module/AppOpenAd.js.map +1 -1
- package/lib/module/DaroMediaViewNativeComponent.ts +9 -0
- package/lib/module/DaroRNAdBannerViewNativeComponent.ts +50 -0
- package/lib/module/DaroRNNativeAdViewNativeComponent.ts +65 -0
- package/lib/module/EventEmitter.js +4 -6
- package/lib/module/EventEmitter.js.map +1 -1
- package/lib/module/InterstitialAd.js +8 -11
- package/lib/module/InterstitialAd.js.map +1 -1
- package/lib/module/LightPopupAd.js +11 -13
- package/lib/module/LightPopupAd.js.map +1 -1
- package/lib/module/NativeDaroModule.js +5 -0
- package/lib/module/NativeDaroModule.js.map +1 -0
- package/lib/module/RewardedAd.js +8 -11
- package/lib/module/RewardedAd.js.map +1 -1
- package/lib/module/codegen-env.d.js +2 -0
- package/lib/module/codegen-env.d.js.map +1 -0
- package/lib/module/hooks/useInterstitialAd.js +106 -0
- package/lib/module/hooks/useInterstitialAd.js.map +1 -0
- package/lib/module/hooks/useLightPopupAd.js +110 -0
- package/lib/module/hooks/useLightPopupAd.js.map +1 -0
- package/lib/module/hooks/useRewardedAd.js +109 -0
- package/lib/module/hooks/useRewardedAd.js.map +1 -0
- package/lib/module/index.js +108 -13
- package/lib/module/index.js.map +1 -1
- package/lib/module/nativeAd/NativeAdView.js +22 -23
- package/lib/module/nativeAd/NativeAdView.js.map +1 -1
- package/lib/module/nativeAd/NativeAdViewComponents.js +45 -34
- package/lib/module/nativeAd/NativeAdViewComponents.js.map +1 -1
- package/lib/module/nativeAd/NativeAdViewProvider.js +35 -8
- package/lib/module/nativeAd/NativeAdViewProvider.js.map +1 -1
- package/lib/typescript/commonjs/plugin/src/index.d.ts +2 -6
- package/lib/typescript/commonjs/plugin/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/plugin/src/withAndroid.d.ts +2 -6
- package/lib/typescript/commonjs/plugin/src/withAndroid.d.ts.map +1 -1
- package/lib/typescript/commonjs/plugin/src/withIos.d.ts +2 -6
- package/lib/typescript/commonjs/plugin/src/withIos.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/AdBannerView.d.ts +2 -2
- package/lib/typescript/commonjs/src/AdBannerView.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/AppOpenAd.d.ts +2 -2
- package/lib/typescript/commonjs/src/AppOpenAd.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DaroMediaViewNativeComponent.d.ts +6 -0
- package/lib/typescript/commonjs/src/DaroMediaViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/DaroRNAdBannerViewNativeComponent.d.ts +33 -0
- package/lib/typescript/commonjs/src/DaroRNAdBannerViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/DaroRNNativeAdViewNativeComponent.d.ts +43 -0
- package/lib/typescript/commonjs/src/DaroRNNativeAdViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/EventEmitter.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/InterstitialAd.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/LightPopupAd.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/NativeDaroModule.d.ts +70 -0
- package/lib/typescript/commonjs/src/NativeDaroModule.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/RewardedAd.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/hooks/useInterstitialAd.d.ts +19 -0
- package/lib/typescript/commonjs/src/hooks/useInterstitialAd.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/hooks/useLightPopupAd.d.ts +23 -0
- package/lib/typescript/commonjs/src/hooks/useLightPopupAd.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/hooks/useRewardedAd.d.ts +20 -0
- package/lib/typescript/commonjs/src/hooks/useRewardedAd.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +86 -1
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/nativeAd/NativeAdView.d.ts +1 -0
- package/lib/typescript/commonjs/src/nativeAd/NativeAdView.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/nativeAd/NativeAdViewComponents.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/nativeAd/NativeAdViewProvider.d.ts +11 -5
- package/lib/typescript/commonjs/src/nativeAd/NativeAdViewProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types/AdInfo.d.ts +15 -0
- package/lib/typescript/commonjs/src/types/AdInfo.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types/AdProps.d.ts +0 -1
- package/lib/typescript/commonjs/src/types/AdProps.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types/NativeAdViewProps.d.ts +2 -0
- package/lib/typescript/commonjs/src/types/NativeAdViewProps.d.ts.map +1 -1
- package/lib/typescript/module/plugin/src/index.d.ts +2 -6
- package/lib/typescript/module/plugin/src/index.d.ts.map +1 -1
- package/lib/typescript/module/plugin/src/withAndroid.d.ts +2 -6
- package/lib/typescript/module/plugin/src/withAndroid.d.ts.map +1 -1
- package/lib/typescript/module/plugin/src/withIos.d.ts +2 -6
- package/lib/typescript/module/plugin/src/withIos.d.ts.map +1 -1
- package/lib/typescript/module/src/AdBannerView.d.ts +2 -2
- package/lib/typescript/module/src/AdBannerView.d.ts.map +1 -1
- package/lib/typescript/module/src/AppOpenAd.d.ts +2 -2
- package/lib/typescript/module/src/AppOpenAd.d.ts.map +1 -1
- package/lib/typescript/module/src/DaroMediaViewNativeComponent.d.ts +6 -0
- package/lib/typescript/module/src/DaroMediaViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/DaroRNAdBannerViewNativeComponent.d.ts +33 -0
- package/lib/typescript/module/src/DaroRNAdBannerViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/DaroRNNativeAdViewNativeComponent.d.ts +43 -0
- package/lib/typescript/module/src/DaroRNNativeAdViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/EventEmitter.d.ts.map +1 -1
- package/lib/typescript/module/src/InterstitialAd.d.ts.map +1 -1
- package/lib/typescript/module/src/LightPopupAd.d.ts.map +1 -1
- package/lib/typescript/module/src/NativeDaroModule.d.ts +70 -0
- package/lib/typescript/module/src/NativeDaroModule.d.ts.map +1 -0
- package/lib/typescript/module/src/RewardedAd.d.ts.map +1 -1
- package/lib/typescript/module/src/hooks/useInterstitialAd.d.ts +19 -0
- package/lib/typescript/module/src/hooks/useInterstitialAd.d.ts.map +1 -0
- package/lib/typescript/module/src/hooks/useLightPopupAd.d.ts +23 -0
- package/lib/typescript/module/src/hooks/useLightPopupAd.d.ts.map +1 -0
- package/lib/typescript/module/src/hooks/useRewardedAd.d.ts +20 -0
- package/lib/typescript/module/src/hooks/useRewardedAd.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +86 -1
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/nativeAd/NativeAdView.d.ts +1 -0
- package/lib/typescript/module/src/nativeAd/NativeAdView.d.ts.map +1 -1
- package/lib/typescript/module/src/nativeAd/NativeAdViewComponents.d.ts.map +1 -1
- package/lib/typescript/module/src/nativeAd/NativeAdViewProvider.d.ts +11 -5
- package/lib/typescript/module/src/nativeAd/NativeAdViewProvider.d.ts.map +1 -1
- package/lib/typescript/module/src/types/AdInfo.d.ts +15 -0
- package/lib/typescript/module/src/types/AdInfo.d.ts.map +1 -1
- package/lib/typescript/module/src/types/AdProps.d.ts +0 -1
- package/lib/typescript/module/src/types/AdProps.d.ts.map +1 -1
- package/lib/typescript/module/src/types/NativeAdViewProps.d.ts +2 -0
- package/lib/typescript/module/src/types/NativeAdViewProps.d.ts.map +1 -1
- package/package.json +12 -5
- package/plugin/build/index.d.ts +2 -6
- package/plugin/build/index.js +21 -56
- package/plugin/build/withAndroid.d.ts +2 -6
- package/plugin/build/withAndroid.js +123 -83
- package/plugin/build/withIos.d.ts +2 -6
- package/plugin/build/withIos.js +37 -34
- package/react-native-daro.podspec +4 -2
- package/src/AdBannerView.tsx +24 -63
- package/src/AppOpenAd.ts +48 -17
- package/src/DaroMediaViewNativeComponent.ts +9 -0
- package/src/DaroRNAdBannerViewNativeComponent.ts +50 -0
- package/src/DaroRNNativeAdViewNativeComponent.ts +65 -0
- package/src/EventEmitter.ts +4 -5
- package/src/InterstitialAd.ts +8 -10
- package/src/LightPopupAd.ts +11 -12
- package/src/NativeDaroModule.ts +106 -0
- package/src/RewardedAd.ts +8 -10
- package/src/codegen-env.d.ts +45 -0
- package/src/hooks/useInterstitialAd.ts +117 -0
- package/src/hooks/useLightPopupAd.ts +132 -0
- package/src/hooks/useRewardedAd.ts +122 -0
- package/src/index.tsx +157 -22
- package/src/nativeAd/NativeAdView.tsx +41 -54
- package/src/nativeAd/NativeAdViewComponents.tsx +80 -42
- package/src/nativeAd/NativeAdViewProvider.tsx +75 -17
- package/src/types/AdInfo.ts +17 -0
- package/src/types/AdProps.ts +0 -2
- package/src/types/NativeAdViewProps.ts +7 -0
- package/android/src/admob/java/com/daro/reactnative/DaroSdkBridge.kt +0 -23
- package/android/src/main/java/com/daro/reactnative/DaroMAdBannerViewManager.kt +0 -132
- package/android/src/main/java/com/daro/reactnative/DaroMAdNativeViewManager.kt +0 -136
- package/android/src/main/java/com/daro/reactnative/DaroMModule.kt +0 -202
- package/android/src/main/java/com/daro/reactnative/DaroMPackage.kt +0 -21
- package/android/src/main/java/com/daro/reactnative/view/DaroMAdNativeViewContainer.kt +0 -375
- package/ios/DaroMAdBannerViewManager.swift +0 -91
- package/ios/DaroMModule.mm +0 -45
- package/ios/DaroMNativeAdViewManager.swift +0 -291
- package/ios/mediation/admob/DaroMediationDebugger.swift +0 -11
- package/lib/commonjs/types/DaroMMobileAds.js +0 -2
- package/lib/commonjs/types/DaroMMobileAds.js.map +0 -1
- package/lib/module/types/DaroMMobileAds.js +0 -2
- package/lib/module/types/DaroMMobileAds.js.map +0 -1
- package/lib/typescript/commonjs/src/types/DaroMMobileAds.d.ts +0 -6
- package/lib/typescript/commonjs/src/types/DaroMMobileAds.d.ts.map +0 -1
- package/lib/typescript/module/src/types/DaroMMobileAds.d.ts +0 -6
- package/lib/typescript/module/src/types/DaroMMobileAds.d.ts.map +0 -1
- 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
|
|
5
|
+
extension DaroRNModule {
|
|
6
6
|
|
|
7
|
-
@objc(isAppOpenAdReady
|
|
7
|
+
@objc(isAppOpenAdReady:adUnitId:resolve:reject:)
|
|
8
8
|
func isAppOpenAdReady(
|
|
9
|
-
|
|
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
|
-
|
|
16
|
+
DaroRNModule.logger.debug("[DaroRNMobileAds] !isInitialized")
|
|
16
17
|
resolve(false)
|
|
17
18
|
return
|
|
18
19
|
}
|
|
19
|
-
resolve(appOpenAds[requestId
|
|
20
|
+
resolve(appOpenAds[requestId]?.loadedAd != nil)
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
@objc(loadAppOpenAd
|
|
23
|
+
@objc(loadAppOpenAd:adUnitId:resolve:reject:)
|
|
23
24
|
func loadAppOpenAd(
|
|
24
|
-
|
|
25
|
+
requestId: Double,
|
|
25
26
|
adUnitId: String,
|
|
26
27
|
resolve: RCTPromiseResolveBlock,
|
|
27
28
|
reject: RCTPromiseRejectBlock
|
|
28
29
|
) {
|
|
29
|
-
|
|
30
|
+
let requestId = Int(requestId)
|
|
31
|
+
let appOpenAdLoader = retrieveAppOpenLoader(requestId: requestId, adUnitId: adUnitId)
|
|
30
32
|
appOpenAdLoader.loadAd()
|
|
31
|
-
|
|
33
|
+
resolve(Void())
|
|
32
34
|
}
|
|
33
35
|
|
|
34
|
-
@objc(showAppOpenAd
|
|
36
|
+
@objc(showAppOpenAd:adUnitId:customData:resolve:reject:)
|
|
35
37
|
func showAppOpenAd(
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
5
|
+
extension DaroRNModule {
|
|
6
6
|
|
|
7
|
-
@objc(isInterstitialReady
|
|
7
|
+
@objc(isInterstitialReady:adUnitId:resolve:reject:)
|
|
8
8
|
func isInterstitialReady(
|
|
9
|
-
|
|
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
|
-
|
|
16
|
+
DaroRNModule.logger.debug("[DaroRNMobileAds] !isInitialized")
|
|
16
17
|
resolve(false)
|
|
17
18
|
return
|
|
18
19
|
}
|
|
19
|
-
resolve(interstitials[requestId
|
|
20
|
+
resolve(interstitials[requestId]?.loadedAd != nil)
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
@objc(loadInterstitial
|
|
23
|
+
@objc(loadInterstitial:adUnitId:resolve:reject:)
|
|
23
24
|
func loadInterstitial(
|
|
24
|
-
|
|
25
|
+
requestId: Double,
|
|
25
26
|
adUnitId: String,
|
|
26
27
|
resolve: RCTPromiseResolveBlock,
|
|
27
28
|
reject: RCTPromiseRejectBlock
|
|
28
29
|
) {
|
|
29
|
-
let
|
|
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
|
-
|
|
38
|
+
requestId: Double,
|
|
37
39
|
adUnitId: String,
|
|
38
40
|
resolve: @escaping RCTPromiseResolveBlock,
|
|
39
41
|
reject: @escaping RCTPromiseRejectBlock
|
|
40
42
|
) {
|
|
41
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
4
|
+
extension DaroRNModule {
|
|
5
5
|
|
|
6
|
-
@objc(isLightPopupReady
|
|
6
|
+
@objc(isLightPopupReady:adUnitId:resolve:reject:)
|
|
7
7
|
func isLightPopupReady(
|
|
8
|
-
|
|
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
|
-
|
|
15
|
+
DaroRNModule.logger.debug("[DaroRNMobileAds] !isInitialized")
|
|
15
16
|
resolve(false)
|
|
16
17
|
return
|
|
17
18
|
}
|
|
18
|
-
resolve(lightPopups[requestId
|
|
19
|
+
resolve(lightPopups[requestId]?.loadedAd != nil)
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
@objc(loadLightPopup
|
|
22
|
+
@objc(loadLightPopup:adUnitId:resolve:reject:)
|
|
22
23
|
func loadLightPopup(
|
|
23
|
-
|
|
24
|
+
requestId: Double,
|
|
24
25
|
adUnitId: String,
|
|
25
26
|
resolve: RCTPromiseResolveBlock,
|
|
26
27
|
reject: RCTPromiseRejectBlock
|
|
27
28
|
) {
|
|
28
|
-
let
|
|
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
|
-
|
|
37
|
+
requestId: Double,
|
|
36
38
|
adUnitId: String,
|
|
37
39
|
resolve: @escaping RCTPromiseResolveBlock,
|
|
38
40
|
reject: @escaping RCTPromiseRejectBlock
|
|
39
41
|
) {
|
|
40
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
+
}
|