adwhale-sdk-react-native 2.7.204 → 2.7.400

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 +95 -91
  3. package/android/build.gradle +35 -1
  4. package/android/proguard-rules.pro +58 -0
  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 +148 -49
  9. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdView.java +46 -27
  10. package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAppOpenAd.java +148 -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 +205 -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 +341 -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 +22 -0
  37. package/ios/RNAdWhaleMediationRewardAd.swift +206 -0
  38. package/ios/WhaleMediationBannerContainer.swift +182 -0
  39. package/lib/module/AdWhaleAdView.js +58 -3
  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 +221 -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 +20 -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 +13 -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 +63 -6
  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 +28 -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 +92 -4
  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 +108 -4
  101. package/src/AdWhaleNativeCustomView.tsx +85 -23
  102. package/src/AdWhaleNativeTemplateView.tsx +79 -42
  103. package/src/AdWhaleRewardAd.ts +317 -51
  104. package/src/AdWhaleTransitionPopupAd.ts +171 -0
  105. package/src/NativeAdwhaleSdkReactNative.ts +30 -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 +35 -0
@@ -4,8 +4,14 @@ export interface AdWhaleRewardErrorEvent {
4
4
  message: string;
5
5
  }
6
6
  export interface AdWhaleRewardUserRewardedEvent {
7
- type: string;
8
- amount: number;
7
+ /** Flutter payload key */
8
+ RewardType?: string;
9
+ /** Flutter payload key */
10
+ RewardAmount?: number;
11
+ /** 레거시 호환 */
12
+ type?: string;
13
+ /** 레거시 호환 */
14
+ amount?: number;
9
15
  }
10
16
  export interface AdWhaleRewardEvents {
11
17
  onLoaded?: () => void;
@@ -20,13 +26,64 @@ export interface AdWhaleRewardGcoder {
20
26
  lt: number;
21
27
  lng: number;
22
28
  }
29
+ /**
30
+ * 보상형 광고 로드 시 함께 지정할 수 있는 옵션.
31
+ * placementName / region / gcoder 는 기존 옵션이며,
32
+ * userId / customData 는 보상형 SSV(서버 사이드 검증) 전용 옵션입니다.
33
+ */
34
+ export interface AdWhaleRewardLoadOptions {
35
+ placementName?: string;
36
+ region?: string;
37
+ gcoder?: AdWhaleRewardGcoder;
38
+ /**
39
+ * 보상형 SSV(서버 사이드 검증)용 앱 사용자 id.
40
+ * AdMob / AdManager SSV postback 의 user_id 로 전달됩니다.
41
+ * (그 외 네트워크에서는 무시됩니다.)
42
+ */
43
+ userId?: string;
44
+ /**
45
+ * 보상형 SSV(서버 사이드 검증)용 커스텀 데이터.
46
+ * AdMob / AdManager SSV postback 의 custom_data 로 전달되며,
47
+ * 네이티브에서 JSON 문자열로 직렬화되어 실립니다.
48
+ * (그 외 네트워크에서는 무시됩니다.)
49
+ */
50
+ customData?: {
51
+ [key: string]: string;
52
+ };
53
+ }
23
54
  export declare const AdWhaleRewardAd: {
24
- loadAd(placementUid: string, options?: {
25
- placementName?: string;
26
- region?: string;
27
- gcoder?: AdWhaleRewardGcoder;
55
+ /**
56
+ * 보상형 SSV(서버 사이드 검증)용 앱 사용자 id 설정.
57
+ *
58
+ * - AdMob / AdManager 의 SSV postback `user_id` 로 전달됩니다. 그 외 네트워크에서는 무시(no-op)됩니다.
59
+ * - `loadAd()` 호출 전에 설정하는 것을 권장하며, `showAd()` 이전까지 호출할 수 있습니다.
60
+ * - 여러 번 호출하면 마지막 값이 적용됩니다.
61
+ *
62
+ * 참고: `loadAd(placementUid, { userId })` 옵션으로도 동일하게 지정할 수 있습니다.
63
+ */
64
+ setUserId(userId: string): void;
65
+ /**
66
+ * 보상형 SSV(서버 사이드 검증)용 커스텀 데이터 설정.
67
+ *
68
+ * - AdMob / AdManager 의 SSV postback `custom_data` 로 전달됩니다. 그 외 네트워크에서는 무시(no-op)됩니다.
69
+ * - 전달한 객체는 네이티브에서 JSON 문자열로 직렬화되어 단일 문자열 필드에 실립니다.
70
+ * 퍼블리셔 서버는 postback 의 `custom_data` 값을 JSON 으로 파싱해야 합니다.
71
+ * - AdMob 의 `custom_data` 는 실무상 200자 정도를 넘기면 잘릴 수 있으니 길이에 유의하세요.
72
+ * - `loadAd()` 호출 전에 설정하는 것을 권장하며, `showAd()` 이전까지 호출할 수 있습니다.
73
+ *
74
+ * 참고: `loadAd(placementUid, { customData })` 옵션으로도 동일하게 지정할 수 있습니다.
75
+ */
76
+ setCustomData(customData: {
77
+ [key: string]: string;
28
78
  }): void;
79
+ loadAd(placementUid: string, options?: AdWhaleRewardLoadOptions): void;
29
80
  showAd(): void;
81
+ /** Flutter와 동일한 신규 API (권장) */
82
+ loadRewardAd(adId: number, placementUid: string, options?: AdWhaleRewardLoadOptions): void;
83
+ showAdWithoutView(adId: number): void;
84
+ destroyAd(adId: number): void;
30
85
  addEventListeners(listeners: AdWhaleRewardEvents): EmitterSubscription[];
86
+ /** Flutter `onAdEvent` 스타일 (adId 필터링) */
87
+ addAdEventListenersById(adId: number, listeners: AdWhaleRewardEvents): EmitterSubscription[];
31
88
  };
32
89
  //# sourceMappingURL=AdWhaleRewardAd.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdWhaleRewardAd.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleRewardAd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAkBD,eAAO,MAAM,eAAe;yBAEV,MAAM,YACV;QACR,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;KAC9B;;iCAoB0B,mBAAmB,GAAG,mBAAmB,EAAE;CA2DzE,CAAC"}
1
+ {"version":3,"file":"AdWhaleRewardAd.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleRewardAd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACxC;AAoCD,eAAO,MAAM,eAAe;IAC1B;;;;;;;;OAQG;sBACe,MAAM;IAQxB;;;;;;;;;;OAUG;8BACuB;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;yBAQ9B,MAAM,YAAY,wBAAwB;;IA+D/D,+BAA+B;uBAEvB,MAAM,gBACE,MAAM,YACV,wBAAwB;4BAqBZ,MAAM;oBAYd,MAAM;iCAIO,mBAAmB,GAAG,mBAAmB,EAAE;IAmGxE,yCAAyC;kCAEjC,MAAM,aACD,mBAAmB,GAC7B,mBAAmB,EAAE;CA4DzB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { EmitterSubscription } from 'react-native';
2
+ export interface AdWhaleTransitionPopupAdErrorEvent {
3
+ statusCode: number;
4
+ message: string;
5
+ }
6
+ export interface AdWhaleTransitionPopupAdClosedEvent {
7
+ reasonId: number;
8
+ reasonMessage: string;
9
+ }
10
+ export interface AdWhaleTransitionPopupAdEvents {
11
+ onLoaded?: () => void;
12
+ onLoadFailed?: (event: AdWhaleTransitionPopupAdErrorEvent) => void;
13
+ onShowed?: () => void;
14
+ onShowFailed?: (event: AdWhaleTransitionPopupAdErrorEvent) => void;
15
+ onClicked?: () => void;
16
+ onClosed?: (event: AdWhaleTransitionPopupAdClosedEvent) => void;
17
+ }
18
+ export interface AdWhaleTransitionPopupGcoder {
19
+ lt: number;
20
+ lng: number;
21
+ }
22
+ export declare const AdWhaleTransitionPopupAd: {
23
+ loadAd(placementUid: string, options?: {
24
+ placementName?: string;
25
+ region?: string;
26
+ gcoder?: AdWhaleTransitionPopupGcoder;
27
+ }): void;
28
+ showAd(): void;
29
+ destroy(): void;
30
+ resume(): void;
31
+ addEventListeners(listeners: AdWhaleTransitionPopupAdEvents): EmitterSubscription[];
32
+ };
33
+ //# sourceMappingURL=AdWhaleTransitionPopupAd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdWhaleTransitionPopupAd.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleTransitionPopupAd.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,kCAAkC;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,kCAAkC,KAAK,IAAI,CAAC;IACnE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,kCAAkC,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,mCAAmC,KAAK,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AA2BD,eAAO,MAAM,wBAAwB;yBAEnB,MAAM,YACV;QACR,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,4BAA4B,CAAC;KACvC;;;;iCA2CU,8BAA8B,GACxC,mBAAmB,EAAE;CA8DzB,CAAC"}
@@ -1,16 +1,28 @@
1
1
  import { type TurboModule } from 'react-native';
2
+ /**
3
+ * Flutter `AdWhaleInitResult` / 네이티브 초기화 성공 맵과 동일: `statusCode`, `message` 만.
4
+ * 성공 여부는 `statusCode === 100` (Flutter 와 동일).
5
+ * TurboModule codegen 은 메서드명 `initialize` 를 사용합니다 (Flutter MethodChannel 은 `_init`).
6
+ */
2
7
  export interface InitializeResult {
3
8
  statusCode: number;
4
9
  message: string;
5
- isSuccess: boolean;
10
+ }
11
+ /** Flutter GDPR `requestGdprConsent` 응답 맵: `success`, `message` */
12
+ export interface GdprConsentResult {
13
+ success: boolean;
14
+ message: string;
15
+ }
16
+ /** Ad Inspector 닫힘 콜백과 동일한 status/message (Flutter 와 키 정렬) */
17
+ export interface AdInspectorResult {
18
+ statusCode: number;
19
+ message: string;
6
20
  }
7
21
  export interface Spec extends TurboModule {
22
+ /** RN codegen Java `initialize(Promise)` — Flutter MethodChannel 은 `_init` */
8
23
  initialize(): Promise<InitializeResult>;
9
24
  setCoppa(isEnabled: boolean): void;
10
- requestGdprConsent(): Promise<{
11
- isSuccess: boolean;
12
- message: string;
13
- }>;
25
+ requestGdprConsent(): Promise<GdprConsentResult>;
14
26
  getConsentStatus(): Promise<{
15
27
  coppa: boolean;
16
28
  gdpr: string;
@@ -18,7 +30,17 @@ export interface Spec extends TurboModule {
18
30
  }>;
19
31
  resetGdprConsentStatus(): void;
20
32
  setGdpr(consent: boolean): void;
33
+ setTagForUnderAgeOfConsent(tag: boolean): void;
34
+ setMaxAdContentRating(rating: string | null): void;
35
+ setTestDeviceIdentifiers(testDeviceIds: string[] | null): void;
36
+ showAdInspector(): Promise<AdInspectorResult>;
37
+ setAppMuted(isMuted: boolean): void;
38
+ setAppVolume(volume: number): void;
21
39
  }
22
- declare const _default: Spec;
40
+ /**
41
+ * iOS/Android 네이티브에 모듈이 없거나 링크되지 않은 경우 null.
42
+ * (getEnforcing 는 로드 시점에 앱 전체가 크래시하므로 get 사용)
43
+ */
44
+ declare const _default: Spec | null | undefined;
23
45
  export default _default;
24
46
  //# sourceMappingURL=NativeAdwhaleSdkReactNative.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NativeAdwhaleSdkReactNative.d.ts","sourceRoot":"","sources":["../../../src/NativeAdwhaleSdkReactNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kBAAkB,IAAI,OAAO,CAAC;QAC5B,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,gBAAgB,IAAI,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC,CAAC;IACH,sBAAsB,IAAI,IAAI,CAAC;IAC/B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACjC;;AAED,wBAA+E"}
1
+ {"version":3,"file":"NativeAdwhaleSdkReactNative.d.ts","sourceRoot":"","sources":["../../../src/NativeAdwhaleSdkReactNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8DAA8D;AAC9D,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,8EAA8E;IAC9E,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjD,gBAAgB,IAAI,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC,CAAC;IACH,sBAAsB,IAAI,IAAI,CAAC;IAC/B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACnD,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/D,eAAe,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9C,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;GAGG;;AACH,wBAAsE"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Flutter `lib/src/flutter_method_arg_const.dart` / Android `FlutterMethodArgConst` 와
3
+ * 동일한 키 문자열을 유지합니다. RN 전용 키는 주석으로 표시합니다.
4
+ */
5
+ export declare const AdWhaleMethodArgConst: {
6
+ readonly sendStatusCode: "statusCode";
7
+ readonly sendMessage: "message";
8
+ /** Flutter GDPR 등 */
9
+ readonly sendSuccess: "success";
10
+ /** RN 레거시 — init/showAdInspector 는 `sendStatusCode`(100) 로 성공 판별 */
11
+ readonly sendIsSuccess: "isSuccess";
12
+ readonly sendCode: "code";
13
+ readonly sendEventName: "eventName";
14
+ readonly sendErrorMessage: "errorMessage";
15
+ readonly sendErrorCode: "errorCode";
16
+ readonly sendRewardAmount: "RewardAmount";
17
+ readonly sendRewardType: "RewardType";
18
+ readonly sendHeightPx: "heightPx";
19
+ readonly sendReason: "reason";
20
+ readonly receiveAdId: "adId";
21
+ readonly receivePlacementUid: "placementUid";
22
+ readonly receiveRating: "rating";
23
+ readonly receiveHasConsent: "hasConsent";
24
+ readonly receiveValue: "value";
25
+ readonly receiveTfuaMode: "tfuaMode";
26
+ readonly receiveIds: "ids";
27
+ readonly receiveRequestId: "requestId";
28
+ readonly receiveIsChildDirected: "isChildDirected";
29
+ readonly receiveEnabled: "enabled";
30
+ readonly receiveIsMuted: "isMuted";
31
+ readonly receivedVolume: "volume";
32
+ readonly receiveRegion: "region";
33
+ readonly receiveGcoder: "gcoder";
34
+ readonly receiveLt: "lt";
35
+ readonly receiveLng: "lng";
36
+ readonly receivePlacementName: "placementName";
37
+ readonly receivePrimaryButtonText: "primaryButtonText";
38
+ readonly receiveSecondaryButtonText: "secondaryButtonText";
39
+ readonly receiveCustomDescription: "customDescription";
40
+ readonly receiveOptions: "options";
41
+ readonly receiveAdaptiveAnchorWidth: "adaptiveAnchorWidth";
42
+ readonly receiveAndroidPlacementUid: "androidPlacementUid";
43
+ readonly receiveBannerHeight: "bannerHeight";
44
+ readonly receiveNativeAdOptions: "nativeAdOptions";
45
+ readonly receiveTemplateStyle: "templateStyle";
46
+ readonly sendCoppa: "coppa";
47
+ readonly sendGdpr: "gdpr";
48
+ readonly sendPersonalizedConsent: "personalizedConsent";
49
+ readonly sendRegistrationName: "registrationName";
50
+ };
51
+ //# sourceMappingURL=AdWhaleMethodArgConst.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdWhaleMethodArgConst.d.ts","sourceRoot":"","sources":["../../../../src/constants/AdWhaleMethodArgConst.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;IAGhC,qBAAqB;;IAErB,oEAAoE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwC5D,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Flutter `lib/src/flutter_method_call_const.dart` 와 동일한 메서드·이벤트 이름.
3
+ * RN ViewManager 전용 prop 은 주석으로 구분합니다.
4
+ */
5
+ export declare const AdWhaleMethodCallConst: {
6
+ /** RN TurboModule codegen — Java {@code initialize(Promise)} */
7
+ readonly initialize: "initialize";
8
+ /** Flutter MethodChannel 전용 (TurboModule 과 다름) */
9
+ readonly flutterInit: "_init";
10
+ readonly requestGdprConsent: "requestGdprConsent";
11
+ readonly resetGdprConsentStatus: "resetGdprConsentStatus";
12
+ readonly setGdpr: "setGdpr";
13
+ readonly getConsentStatus: "getConsentStatus";
14
+ readonly setTagForUnderAgeOfConsent: "setTagForUnderAgeOfConsent";
15
+ readonly setMaxAdContentRating: "setMaxAdContentRating";
16
+ readonly setTestDeviceIdentifiers: "setTestDeviceIdentifiers";
17
+ readonly showAdInspector: "showAdInspector";
18
+ readonly setCoppa: "setCoppa";
19
+ readonly setLoggerEnabled: "setLoggerEnabled";
20
+ readonly getLogLevel: "getLogLevel";
21
+ readonly setAppMuted: "setAppMuted";
22
+ readonly setAppVolume: "setAppVolume";
23
+ readonly loadBannerAd: "loadBannerAd";
24
+ readonly resumeBannerAd: "resumeBannerAd";
25
+ readonly pauseBannerAd: "pauseBannerAd";
26
+ readonly destroyBannerAd: "destroyBannerAd";
27
+ /** RN Android 에는 아직 네이티브 구현 없음 — 상수만 동기화 */
28
+ readonly loadPreloadBannerAd: "loadPreloadBannerAd";
29
+ readonly showPreloadBannerAd: "showPreloadBannerAd";
30
+ readonly resumePreloadBannerAd: "resumePreloadBannerAd";
31
+ readonly pausePreloadBannerAd: "pausePreloadBannerAd";
32
+ readonly destroyPreloadBannerAd: "destroyPreloadBannerAd";
33
+ /** RN 배너 View — Flutter loadBannerAd 와 역할 유사한 prop */
34
+ readonly loadAd: "loadAd";
35
+ readonly showAd: "showAd";
36
+ readonly placementUid: "placementUid";
37
+ readonly adSize: "adSize";
38
+ readonly factoryId: "factoryId";
39
+ readonly onAdInspectorClosed: "onAdInspectorClosed";
40
+ readonly onInitComplete: "onInitComplete";
41
+ readonly onAdLoaded: "onAdLoaded";
42
+ readonly onAdLoadFailed: "onAdLoadFailed";
43
+ readonly onAdFailedToLoad: "onAdFailedToLoad";
44
+ readonly onAdClicked: "onAdClicked";
45
+ readonly onNativeAdLoaded: "onNativeAdLoaded";
46
+ readonly onNativeAdFailedToLoad: "onNativeAdFailedToLoad";
47
+ readonly onNativeAdShowFailed: "onNativeAdShowFailed";
48
+ readonly onNativeAdClicked: "onNativeAdClicked";
49
+ readonly onNativeAdClosed: "onNativeAdClosed";
50
+ readonly onNativeAdViewHeight: "onNativeAdViewHeight";
51
+ };
52
+ export type AdWhaleMethodCallConstKey = keyof typeof AdWhaleMethodCallConst;
53
+ //# sourceMappingURL=AdWhaleMethodCallConst.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdWhaleMethodCallConst.d.ts","sourceRoot":"","sources":["../../../../src/constants/AdWhaleMethodCallConst.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB;IAEjC,gEAAgE;;IAEhE,kDAAkD;;;;;;;;;;;;;;;;;;;IAsBlD,4CAA4C;;;;;;IAO5C,sDAAsD;;;;;;;;;;;;;;;;;;CAoB9C,CAAC;AAEX,MAAM,MAAM,yBAAyB,GAAG,MAAM,OAAO,sBAAsB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Flutter `FlutterMethodResultConst` 와 동일한 Promise.reject / result.error 코드 문자열.
3
+ */
4
+ export declare const AdWhaleMethodResultConst: {
5
+ readonly noActivity: "NoActivity";
6
+ readonly invalidArgs: "InvalidArgs";
7
+ readonly nativeAdError: "NativeAdError";
8
+ readonly preloadBannerError: "PreloadBannerError";
9
+ readonly bannerAdError: "BannerAdError";
10
+ readonly adShowError: "AdShowError";
11
+ readonly openInspectorFailed: "OpenInspectorFailed";
12
+ readonly getLogLevelError: "GetLogLevelError";
13
+ };
14
+ //# sourceMappingURL=AdWhaleMethodResultConst.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdWhaleMethodResultConst.d.ts","sourceRoot":"","sources":["../../../../src/constants/AdWhaleMethodResultConst.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;CAS3B,CAAC"}
@@ -1,12 +1,20 @@
1
1
  export { AdWhaleMediationAds } from './AdWhaleMediationAds';
2
- export { AdWhaleAdView, AdWhaleAdSize, } from './AdWhaleAdView';
2
+ export type { InitializeResult, GdprConsentResult, AdInspectorResult, } from './AdWhaleMediationAds';
3
+ export { AdWhaleMethodCallConst, type AdWhaleMethodCallConstKey, } from './constants/AdWhaleMethodCallConst';
4
+ export { AdWhaleMethodArgConst } from './constants/AdWhaleMethodArgConst';
5
+ export { AdWhaleMethodResultConst } from './constants/AdWhaleMethodResultConst';
6
+ export { AdWhaleAdView, AdWhaleAdSize, ADWHALE_BANNER_IOS_UNSUPPORTED_STATUS_CODE, isAdWhaleBannerAdSizeSupportedOnIos, } from './AdWhaleAdView';
3
7
  export type { AdWhaleBannerError, AdWhaleBannerViewProps, } from './AdWhaleAdView';
4
8
  export { AdWhaleInterstitialAd, } from './AdWhaleInterstitialAd';
5
9
  export type { AdWhaleInterstitialErrorEvent, AdWhaleInterstitialEvents, } from './AdWhaleInterstitialAd';
6
10
  export { AdWhaleRewardAd, } from './AdWhaleRewardAd';
7
- export type { AdWhaleRewardErrorEvent, AdWhaleRewardUserRewardedEvent, AdWhaleRewardEvents, } from './AdWhaleRewardAd';
11
+ export type { AdWhaleRewardErrorEvent, AdWhaleRewardUserRewardedEvent, AdWhaleRewardEvents, AdWhaleRewardGcoder, AdWhaleRewardLoadOptions, } from './AdWhaleRewardAd';
8
12
  export { AdWhaleAppOpenAd, } from './AdWhaleAppOpenAd';
9
13
  export type { AdWhaleAppOpenErrorEvent, AdWhaleAppOpenEvents, } from './AdWhaleAppOpenAd';
14
+ export { AdWhaleExitPopupAd } from './AdWhaleExitPopupAd';
15
+ export type { AdWhaleExitPopupAdClosedEvent, AdWhaleExitPopupAdErrorEvent, AdWhaleExitPopupAdEvents, AdWhaleExitPopupGcoder, } from './AdWhaleExitPopupAd';
16
+ export { AdWhaleTransitionPopupAd } from './AdWhaleTransitionPopupAd';
17
+ export type { AdWhaleTransitionPopupAdClosedEvent, AdWhaleTransitionPopupAdErrorEvent, AdWhaleTransitionPopupAdEvents, AdWhaleTransitionPopupGcoder, } from './AdWhaleTransitionPopupAd';
10
18
  export { AdWhaleNativeCustomView, } from './AdWhaleNativeCustomView';
11
19
  export type { AdWhaleNativeCustomHandle, AdWhaleNativeCustomViewProps, AdWhaleNativeCustomError, } from './AdWhaleNativeCustomView';
12
20
  export * from './AdWhaleNativeTemplateView';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D,OAAO,EACL,aAAa,EACb,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EACL,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EACL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAMnC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAW/B,OAAO,EACL,sBAAsB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAGhF,OAAO,EACL,aAAa,EACb,aAAa,EACb,0CAA0C,EAC1C,mCAAmC,GACpC,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EACL,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EACL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EACV,mCAAmC,EACnC,kCAAkC,EAClC,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EACL,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAMnC,cAAc,6BAA6B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adwhale-sdk-react-native",
3
- "version": "2.7.204",
3
+ "version": "2.7.400",
4
4
  "description": "Adwhale SDK React Native library for integrating Adwhale advertising mediation SDK into React Native applications.",
5
5
  "main": "./lib/module/index.js",
6
6
  "react-native": "./lib/module/index.js",
@@ -1,6 +1,6 @@
1
1
  // src/AdWhaleAdView.tsx
2
2
  import React from 'react';
3
- import { requireNativeComponent } from 'react-native';
3
+ import { Platform, requireNativeComponent } from 'react-native';
4
4
  import type { NativeSyntheticEvent, StyleProp, ViewStyle } from 'react-native';
5
5
 
6
6
  /**
@@ -14,17 +14,42 @@ export enum AdWhaleAdSize {
14
14
  BANNER_320x100 = 'BANNER320x100',
15
15
  /** 중간 직사각형 (300x250) */
16
16
  BANNER_300x250 = 'BANNER300x250',
17
- /** 정사각형 (250x250) */
17
+ /**
18
+ * 정사각형 (250x250)
19
+ * iOS: AdWhale iOS SDK 미지원 — 네이티브에서 로드하지 않으며 `onAdLoadFailed`(statusCode -100) 가 호출됩니다.
20
+ */
18
21
  BANNER_250x250 = 'BANNER250x250',
19
- /** 적응형 앵커 배너 - adaptiveAnchorWidth와 함께 사용 */
22
+ /**
23
+ * 적응형 앵커 배너 - adaptiveAnchorWidth와 함께 사용
24
+ * iOS: AdWhale iOS SDK 미지원 — 네이티브에서 로드하지 않으며 `onAdLoadFailed`(statusCode -100) 가 호출됩니다.
25
+ */
20
26
  ADAPTIVE_ANCHOR = 'ADAPTIVE_ANCHOR',
21
27
  }
22
28
 
29
+ /**
30
+ * AdWhale iOS SDK 가 해당 배너 사이즈를 지원하는지 (UI 비활성화 등에 사용).
31
+ * Android / 기타 플랫폼에서는 항상 true.
32
+ */
33
+ export function isAdWhaleBannerAdSizeSupportedOnIos(
34
+ adSize: AdWhaleAdSize,
35
+ ): boolean {
36
+ if (Platform.OS !== 'ios') {
37
+ return true;
38
+ }
39
+ return (
40
+ adSize !== AdWhaleAdSize.BANNER_250x250 &&
41
+ adSize !== AdWhaleAdSize.ADAPTIVE_ANCHOR
42
+ );
43
+ }
44
+
23
45
  export interface AdWhaleBannerError {
24
46
  statusCode: number;
25
47
  message: string;
26
48
  }
27
49
 
50
+ /** iOS: BANNER250x250 / ADAPTIVE_ANCHOR 요청 시 네이티브 `onAdLoadFailed` 의 statusCode */
51
+ export const ADWHALE_BANNER_IOS_UNSUPPORTED_STATUS_CODE = -100;
52
+
28
53
  export interface AdWhaleBannerGcoder {
29
54
  lt: number;
30
55
  lng: number;
@@ -32,6 +57,11 @@ export interface AdWhaleBannerGcoder {
32
57
 
33
58
  export interface AdWhaleBannerViewProps {
34
59
  style?: StyleProp<ViewStyle>;
60
+ /**
61
+ * Flutter와 동일한 개념의 배너 인스턴스 식별자.
62
+ * RN은 View 기반이므로, 여러 배너를 동시에 운용할 때 이벤트 라우팅/로그 추적 용도로 사용합니다.
63
+ */
64
+ adId?: number;
35
65
  placementUid: string;
36
66
  placementName?: string;
37
67
  region?: string;
@@ -55,7 +85,7 @@ export interface AdWhaleBannerViewProps {
55
85
  onAdClicked?: () => void;
56
86
  }
57
87
 
58
- type NativeErrorEvent = NativeSyntheticEvent<AdWhaleBannerError>;
88
+ type NativeErrorEvent = NativeSyntheticEvent<AdWhaleBannerError & { adId?: number }>;
59
89
 
60
90
  interface NativeAdViewProps
61
91
  extends Omit<AdWhaleBannerViewProps, 'onAdLoadFailed'> {
@@ -65,13 +95,69 @@ interface NativeAdViewProps
65
95
  const RNAdWhaleMediationAdView =
66
96
  requireNativeComponent<NativeAdViewProps>('RNAdWhaleMediationAdView');
67
97
 
98
+ const AD_SIZE_ENUM_NAME_BY_VALUE: Record<AdWhaleAdSize, string> = {
99
+ [AdWhaleAdSize.BANNER_320x50]: 'BANNER_320x50',
100
+ [AdWhaleAdSize.BANNER_320x100]: 'BANNER_320x100',
101
+ [AdWhaleAdSize.BANNER_300x250]: 'BANNER_300x250',
102
+ [AdWhaleAdSize.BANNER_250x250]: 'BANNER_250x250',
103
+ [AdWhaleAdSize.ADAPTIVE_ANCHOR]: 'ADAPTIVE_ANCHOR',
104
+ };
105
+
68
106
  export const AdWhaleAdView: React.FC<AdWhaleBannerViewProps> = ({
107
+ onAdLoaded,
69
108
  onAdLoadFailed,
70
109
  adSize,
71
110
  adaptiveAnchorWidth,
111
+ loadAd,
72
112
  ...restProps
73
113
  }) => {
114
+ const lastCreateBannerLogKeyRef = React.useRef<string | null>(null);
115
+
116
+ React.useEffect(() => {
117
+ if (!loadAd) {
118
+ return;
119
+ }
120
+
121
+ const enumName = AD_SIZE_ENUM_NAME_BY_VALUE[adSize] ?? adSize;
122
+ const adaptiveWidthForLog =
123
+ adSize === AdWhaleAdSize.ADAPTIVE_ANCHOR
124
+ ? String(adaptiveAnchorWidth ?? 0)
125
+ : 'null';
126
+ const logKey = `${enumName}:${adaptiveWidthForLog}`;
127
+
128
+ if (lastCreateBannerLogKeyRef.current === logKey) {
129
+ return;
130
+ }
131
+ lastCreateBannerLogKeyRef.current = logKey;
132
+
133
+ console.log(
134
+ `AdWhaleAdView.tsx _createBanner size=AdWhaleAdSize.${enumName}(${adSize}), adaptiveWidth=${adaptiveWidthForLog}`,
135
+ );
136
+ }, [loadAd, adSize, adaptiveAnchorWidth]);
137
+
138
+ const handleAdLoaded = () => {
139
+ const enumName = AD_SIZE_ENUM_NAME_BY_VALUE[adSize] ?? adSize;
140
+ console.log(
141
+ `AdWhaleAdView.tsx BannerAd onLoaded for size AdWhaleAdSize.${enumName}(${adSize})`,
142
+ );
143
+ onAdLoaded?.();
144
+ };
145
+
74
146
  const handleAdLoadFailed: NativeAdViewProps['onAdLoadFailed'] = e => {
147
+ if (
148
+ Platform.OS === 'ios' &&
149
+ e.nativeEvent.statusCode === ADWHALE_BANNER_IOS_UNSUPPORTED_STATUS_CODE
150
+ ) {
151
+ const enumName = AD_SIZE_ENUM_NAME_BY_VALUE[adSize] ?? adSize;
152
+ const errorMessage =
153
+ adSize === AdWhaleAdSize.BANNER_250x250
154
+ ? '250x250 is not supported on iOS'
155
+ : 'adaptive banner is not supported on iOS';
156
+ console.log(
157
+ `AdWhaleAdView.tsx BannerAd onLoadFailed for AdWhaleAdSize.${enumName}: errorCode: UNSUPPORTED_BANNER_SIZE, errorMessage: ${errorMessage}`,
158
+ );
159
+ return;
160
+ }
75
161
  onAdLoadFailed?.(e.nativeEvent);
76
162
  };
77
163
 
@@ -84,6 +170,8 @@ export const AdWhaleAdView: React.FC<AdWhaleBannerViewProps> = ({
84
170
  {...restProps}
85
171
  adSize={adSize}
86
172
  adaptiveAnchorWidth={nativeAdaptiveAnchorWidth}
173
+ loadAd={loadAd}
174
+ onAdLoaded={handleAdLoaded}
87
175
  onAdLoadFailed={onAdLoadFailed ? handleAdLoadFailed : undefined}
88
176
  />
89
177
  );