react-native-google-mobile-ads 14.4.2 → 14.5.0

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 (142) hide show
  1. package/README.md +15 -10
  2. package/__tests__/googleMobileAds.test.ts +1 -1
  3. package/__tests__/interstitial.test.ts +9 -23
  4. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsModule.kt +6 -1
  5. package/docs/displaying-ads.mdx +20 -3
  6. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsAppOpenModule.h +36 -0
  7. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsAppOpenModule.mm +100 -0
  8. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsBannerView.h +4 -0
  9. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsBannerView.mm +6 -1
  10. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsConsentModule.m +2 -0
  11. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenAd.h +53 -0
  12. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenAd.mm +220 -0
  13. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenContentDelegate.h +36 -0
  14. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenContentDelegate.mm +80 -0
  15. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsInterstitialModule.h +36 -0
  16. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsInterstitialModule.mm +102 -0
  17. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedInterstitialModule.h +37 -0
  18. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedInterstitialModule.mm +102 -0
  19. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedModule.h +36 -0
  20. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedModule.mm +100 -0
  21. package/jest.setup.ts +8 -5
  22. package/lib/commonjs/MobileAds.js +1 -1
  23. package/lib/commonjs/ads/AppOpenAd.js +3 -1
  24. package/lib/commonjs/ads/AppOpenAd.js.map +1 -1
  25. package/lib/commonjs/ads/BannerAd.js +1 -1
  26. package/lib/commonjs/ads/BannerAd.js.map +1 -1
  27. package/lib/commonjs/ads/BaseAd.js +1 -1
  28. package/lib/commonjs/ads/GAMBannerAd.js +1 -1
  29. package/lib/commonjs/ads/GAMBannerAd.js.map +1 -1
  30. package/lib/commonjs/ads/InterstitialAd.js +3 -1
  31. package/lib/commonjs/ads/InterstitialAd.js.map +1 -1
  32. package/lib/commonjs/ads/MobileAd.js +5 -18
  33. package/lib/commonjs/ads/MobileAd.js.map +1 -1
  34. package/lib/commonjs/ads/RewardedAd.js +3 -1
  35. package/lib/commonjs/ads/RewardedAd.js.map +1 -1
  36. package/lib/commonjs/ads/RewardedInterstitialAd.js +3 -1
  37. package/lib/commonjs/ads/RewardedInterstitialAd.js.map +1 -1
  38. package/lib/commonjs/specs/components/GoogleMobileAdsBannerViewNativeComponent.js.map +1 -0
  39. package/lib/commonjs/specs/modules/NativeAppOpenModule.js +25 -0
  40. package/lib/commonjs/specs/modules/NativeAppOpenModule.js.map +1 -0
  41. package/lib/commonjs/specs/modules/NativeGoogleMobileAdsModule.js +25 -0
  42. package/lib/commonjs/specs/modules/NativeGoogleMobileAdsModule.js.map +1 -0
  43. package/lib/commonjs/specs/modules/NativeInterstitialModule.js +25 -0
  44. package/lib/commonjs/specs/modules/NativeInterstitialModule.js.map +1 -0
  45. package/lib/commonjs/specs/modules/NativeRewardedInterstitialModule.js +25 -0
  46. package/lib/commonjs/specs/modules/NativeRewardedInterstitialModule.js.map +1 -0
  47. package/lib/commonjs/specs/modules/NativeRewardedModule.js +25 -0
  48. package/lib/commonjs/specs/modules/NativeRewardedModule.js.map +1 -0
  49. package/lib/commonjs/version.js +1 -1
  50. package/lib/module/MobileAds.js +1 -1
  51. package/lib/module/MobileAds.js.map +1 -1
  52. package/lib/module/ads/AppOpenAd.js +2 -1
  53. package/lib/module/ads/AppOpenAd.js.map +1 -1
  54. package/lib/module/ads/BannerAd.js +1 -1
  55. package/lib/module/ads/BannerAd.js.map +1 -1
  56. package/lib/module/ads/BaseAd.js +1 -1
  57. package/lib/module/ads/BaseAd.js.map +1 -1
  58. package/lib/module/ads/GAMBannerAd.js +1 -1
  59. package/lib/module/ads/GAMBannerAd.js.map +1 -1
  60. package/lib/module/ads/InterstitialAd.js +3 -1
  61. package/lib/module/ads/InterstitialAd.js.map +1 -1
  62. package/lib/module/ads/MobileAd.js +5 -18
  63. package/lib/module/ads/MobileAd.js.map +1 -1
  64. package/lib/module/ads/RewardedAd.js +3 -1
  65. package/lib/module/ads/RewardedAd.js.map +1 -1
  66. package/lib/module/ads/RewardedInterstitialAd.js +3 -1
  67. package/lib/module/ads/RewardedInterstitialAd.js.map +1 -1
  68. package/lib/module/specs/components/GoogleMobileAdsBannerViewNativeComponent.js.map +1 -0
  69. package/lib/module/specs/modules/NativeAppOpenModule.js +20 -0
  70. package/lib/module/specs/modules/NativeAppOpenModule.js.map +1 -0
  71. package/lib/module/specs/modules/NativeGoogleMobileAdsModule.js +20 -0
  72. package/lib/module/specs/modules/NativeGoogleMobileAdsModule.js.map +1 -0
  73. package/lib/module/specs/modules/NativeInterstitialModule.js +20 -0
  74. package/lib/module/specs/modules/NativeInterstitialModule.js.map +1 -0
  75. package/lib/module/specs/modules/NativeRewardedInterstitialModule.js +20 -0
  76. package/lib/module/specs/modules/NativeRewardedInterstitialModule.js.map +1 -0
  77. package/lib/module/specs/modules/NativeRewardedModule.js +20 -0
  78. package/lib/module/specs/modules/NativeRewardedModule.js.map +1 -0
  79. package/lib/module/version.js +1 -1
  80. package/lib/typescript/ads/AppOpenAd.d.ts.map +1 -1
  81. package/lib/typescript/ads/BannerAd.d.ts.map +1 -1
  82. package/lib/typescript/ads/BaseAd.d.ts +1 -1
  83. package/lib/typescript/ads/BaseAd.d.ts.map +1 -1
  84. package/lib/typescript/ads/GAMBannerAd.d.ts.map +1 -1
  85. package/lib/typescript/ads/InterstitialAd.d.ts.map +1 -1
  86. package/lib/typescript/ads/MobileAd.d.ts +5 -4
  87. package/lib/typescript/ads/MobileAd.d.ts.map +1 -1
  88. package/lib/typescript/ads/RewardedAd.d.ts.map +1 -1
  89. package/lib/typescript/ads/RewardedInterstitialAd.d.ts.map +1 -1
  90. package/lib/typescript/index.d.ts +1 -1
  91. package/lib/typescript/specs/components/GoogleMobileAdsBannerViewNativeComponent.d.ts.map +1 -0
  92. package/lib/typescript/specs/modules/NativeAppOpenModule.d.ts +25 -0
  93. package/lib/typescript/specs/modules/NativeAppOpenModule.d.ts.map +1 -0
  94. package/lib/typescript/specs/modules/NativeGoogleMobileAdsModule.d.ts +30 -0
  95. package/lib/typescript/specs/modules/NativeGoogleMobileAdsModule.d.ts.map +1 -0
  96. package/lib/typescript/specs/modules/NativeInterstitialModule.d.ts +25 -0
  97. package/lib/typescript/specs/modules/NativeInterstitialModule.d.ts.map +1 -0
  98. package/lib/typescript/specs/modules/NativeRewardedInterstitialModule.d.ts +25 -0
  99. package/lib/typescript/specs/modules/NativeRewardedInterstitialModule.d.ts.map +1 -0
  100. package/lib/typescript/specs/modules/NativeRewardedModule.d.ts +25 -0
  101. package/lib/typescript/specs/modules/NativeRewardedModule.d.ts.map +1 -0
  102. package/lib/typescript/version.d.ts +1 -1
  103. package/package.json +2 -2
  104. package/src/MobileAds.ts +1 -1
  105. package/src/ads/AppOpenAd.ts +3 -1
  106. package/src/ads/BannerAd.tsx +3 -1
  107. package/src/ads/BaseAd.tsx +2 -2
  108. package/src/ads/GAMBannerAd.tsx +3 -1
  109. package/src/ads/InterstitialAd.ts +3 -1
  110. package/src/ads/MobileAd.ts +9 -25
  111. package/src/ads/RewardedAd.ts +3 -1
  112. package/src/ads/RewardedInterstitialAd.ts +3 -1
  113. package/src/specs/modules/NativeAppOpenModule.ts +26 -0
  114. package/src/specs/modules/NativeGoogleMobileAdsModule.ts +33 -0
  115. package/src/specs/modules/NativeInterstitialModule.ts +26 -0
  116. package/src/specs/modules/NativeRewardedInterstitialModule.ts +32 -0
  117. package/src/specs/modules/NativeRewardedModule.ts +26 -0
  118. package/src/version.ts +1 -1
  119. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsAppOpenModule.m +0 -46
  120. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsAppOpenModule.swift +0 -85
  121. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenAd.swift +0 -231
  122. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenContentDelegate.swift +0 -76
  123. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsInterstitialModule.m +0 -46
  124. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsInterstitialModule.swift +0 -123
  125. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedInterstitialModule.m +0 -46
  126. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedInterstitialModule.swift +0 -85
  127. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedModule.m +0 -46
  128. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedModule.swift +0 -85
  129. package/lib/commonjs/NativeGoogleMobileAdsModule.js +0 -9
  130. package/lib/commonjs/NativeGoogleMobileAdsModule.js.map +0 -1
  131. package/lib/commonjs/ads/GoogleMobileAdsBannerViewNativeComponent.js.map +0 -1
  132. package/lib/module/NativeGoogleMobileAdsModule.js +0 -3
  133. package/lib/module/NativeGoogleMobileAdsModule.js.map +0 -1
  134. package/lib/module/ads/GoogleMobileAdsBannerViewNativeComponent.js.map +0 -1
  135. package/lib/typescript/NativeGoogleMobileAdsModule.d.ts +0 -14
  136. package/lib/typescript/NativeGoogleMobileAdsModule.d.ts.map +0 -1
  137. package/lib/typescript/ads/GoogleMobileAdsBannerViewNativeComponent.d.ts.map +0 -1
  138. package/src/NativeGoogleMobileAdsModule.ts +0 -16
  139. /package/lib/commonjs/{ads → specs/components}/GoogleMobileAdsBannerViewNativeComponent.js +0 -0
  140. /package/lib/module/{ads → specs/components}/GoogleMobileAdsBannerViewNativeComponent.js +0 -0
  141. /package/lib/typescript/{ads → specs/components}/GoogleMobileAdsBannerViewNativeComponent.d.ts +0 -0
  142. /package/src/{ads → specs/components}/GoogleMobileAdsBannerViewNativeComponent.ts +0 -0
package/README.md CHANGED
@@ -31,19 +31,24 @@ React Native Google Mobile Ads is built with three key principals in mind;
31
31
  - full reference & installation documentation alongside detailed guides and FAQs
32
32
 
33
33
  ## Migrating to the New Architecture Status (backwards compatible)
34
+
34
35
  This package can be used in both The Old and [The New Architecture](https://reactnative.dev/docs/the-new-architecture/landing-page).
35
36
  When using The New Architecture, some legacy code will still be used though. See status below:
36
37
 
37
- - **iOS**
38
- - Mobile Ads SDK Methods (Turbo Native Module) 🟢🟢🟢🟢
39
- - Banners (Fabric Native Component) 🟢🟢🟢🟢
40
- - Full Screen Ads (Turbo Native Module) ⚪⚪⚪⚪
41
- - User Messaging Platform (Turbo Native Module) ⚪⚪⚪⚪
42
- - **Android**
43
- - Mobile Ads SDK Methods (Turbo Native Module) ⚪⚪⚪⚪
44
- - Banners (Fabric Native Component) ⚪⚪⚪⚪
45
- - Full Screen Ads (Turbo Native Module) ⚪⚪⚪⚪
46
- - User Messaging Platform (Turbo Native Module) ⚪⚪⚪⚪
38
+ | Platform | Feature | Status |
39
+ | -------- | ------------------------------------------------- | ----------- |
40
+ | iOS | Mobile Ads SDK Methods (Turbo Native Module) | ✅ Complete |
41
+ | iOS | Banners (Fabric Native Component) | ✅ Complete |
42
+ | iOS | Full Screen Ads (Turbo Native Module) | ✅ Complete |
43
+ | iOS | User Messaging Platform (Turbo Native Module) | ⏳ To-Do |
44
+ | iOS | EventEmitter (Turbo Native Module) | ⏳ To-Do |
45
+ | iOS | Revenue Precision Constants (Turbo Native Module) | ⏳ To-Do |
46
+ | Android | Mobile Ads SDK Methods (Turbo Native Module) | ⏳ To-Do |
47
+ | Android | Banners (Fabric Native Component) | ⏳ To-Do |
48
+ | Android | Full Screen Ads (Turbo Native Module) | ⏳ To-Do |
49
+ | Android | User Messaging Platform (Turbo Native Module) | ⏳ To-Do |
50
+ | Android | EventEmitter (Turbo Native Module) | ⏳ To-Do |
51
+ | Android | Revenue Precision Constants (Turbo Native Module) | ⏳ To-Do |
47
52
 
48
53
  ## Documentation
49
54
 
@@ -1,5 +1,5 @@
1
1
  import admob, { MaxAdContentRating } from '../src';
2
- import RNGoogleMobileAdsModule from '../src/NativeGoogleMobileAdsModule';
2
+ import RNGoogleMobileAdsModule from '../src/specs/modules/NativeGoogleMobileAdsModule';
3
3
 
4
4
  describe('Admob', function () {
5
5
  describe('setRequestConfiguration()', function () {
@@ -1,5 +1,5 @@
1
1
  import { AdEventType, InterstitialAd } from '../src';
2
- import { NativeModules } from 'react-native';
2
+ import NativeInterstitialModule from '../src/specs/modules/NativeInterstitialModule';
3
3
 
4
4
  describe('Google Mobile Ads Interstitial', function () {
5
5
  describe('createForAdRequest', function () {
@@ -34,23 +34,17 @@ describe('Google Mobile Ads Interstitial', function () {
34
34
  const ad = InterstitialAd.createForAdRequest('abc');
35
35
 
36
36
  ad.load();
37
- expect(NativeModules.RNGoogleMobileAdsInterstitialModule.interstitialLoad).toBeCalledTimes(
38
- 1,
39
- );
37
+ expect(NativeInterstitialModule.interstitialLoad).toBeCalledTimes(1);
40
38
  });
41
39
 
42
40
  it('does nothing if ad currently loading', () => {
43
41
  const ad = InterstitialAd.createForAdRequest('abc');
44
42
 
45
43
  ad.load();
46
- expect(NativeModules.RNGoogleMobileAdsInterstitialModule.interstitialLoad).toBeCalledTimes(
47
- 1,
48
- );
44
+ expect(NativeInterstitialModule.interstitialLoad).toBeCalledTimes(1);
49
45
 
50
46
  ad.load();
51
- expect(NativeModules.RNGoogleMobileAdsInterstitialModule.interstitialLoad).toBeCalledTimes(
52
- 1,
53
- );
47
+ expect(NativeInterstitialModule.interstitialLoad).toBeCalledTimes(1);
54
48
  });
55
49
 
56
50
  it('does nothing if ad is already loaded', () => {
@@ -60,41 +54,33 @@ describe('Google Mobile Ads Interstitial', function () {
60
54
  ad._handleAdEvent({ body: { type: AdEventType.LOADED } });
61
55
 
62
56
  ad.load();
63
- expect(NativeModules.RNGoogleMobileAdsInterstitialModule.interstitialLoad).not.toBeCalled();
57
+ expect(NativeInterstitialModule.interstitialLoad).not.toBeCalled();
64
58
  });
65
59
 
66
60
  it('can be called again after ad was closed', () => {
67
61
  const ad = InterstitialAd.createForAdRequest('abc');
68
62
 
69
63
  ad.load();
70
- expect(NativeModules.RNGoogleMobileAdsInterstitialModule.interstitialLoad).toBeCalledTimes(
71
- 1,
72
- );
64
+ expect(NativeInterstitialModule.interstitialLoad).toBeCalledTimes(1);
73
65
 
74
66
  // @ts-ignore
75
67
  ad._handleAdEvent({ body: { type: AdEventType.CLOSED } });
76
68
 
77
69
  ad.load();
78
- expect(NativeModules.RNGoogleMobileAdsInterstitialModule.interstitialLoad).toBeCalledTimes(
79
- 2,
80
- );
70
+ expect(NativeInterstitialModule.interstitialLoad).toBeCalledTimes(2);
81
71
  });
82
72
 
83
73
  it('can be called again after ad failed to load', () => {
84
74
  const ad = InterstitialAd.createForAdRequest('abc');
85
75
 
86
76
  ad.load();
87
- expect(NativeModules.RNGoogleMobileAdsInterstitialModule.interstitialLoad).toBeCalledTimes(
88
- 1,
89
- );
77
+ expect(NativeInterstitialModule.interstitialLoad).toBeCalledTimes(1);
90
78
 
91
79
  // @ts-ignore
92
80
  ad._handleAdEvent({ body: { type: AdEventType.ERROR } });
93
81
 
94
82
  ad.load();
95
- expect(NativeModules.RNGoogleMobileAdsInterstitialModule.interstitialLoad).toBeCalledTimes(
96
- 2,
97
- );
83
+ expect(NativeInterstitialModule.interstitialLoad).toBeCalledTimes(2);
98
84
  });
99
85
  });
100
86
 
@@ -95,7 +95,12 @@ class ReactNativeGoogleMobileAdsModule(
95
95
  @ReactMethod
96
96
  fun initialize(promise: Promise) {
97
97
  MobileAds.initialize(
98
- reactApplicationContext,
98
+ // in react-native, the Activity instance *may* go away, becoming null after initialize
99
+ // it is not clear if that can happen here without an initialize necessarily following the Activity lifecycle
100
+ // it is not clear if that will cause problems even if it happens, but users that have widely deployed this
101
+ // with the use of currentActivity have not seen problems
102
+ // reference if it needs attention: https://github.com/invertase/react-native-google-mobile-ads/pull/664
103
+ currentActivity ?: reactApplicationContext,
99
104
  OnInitializationCompleteListener { initializationStatus ->
100
105
  val result = Arguments.createArray()
101
106
  for ((key, value) in initializationStatus.adapterStatusMap) {
@@ -91,7 +91,7 @@ To listen to events, such as when the advert from the network has loaded or when
91
91
 
92
92
  ```jsx
93
93
  import React, { useEffect, useState } from 'react';
94
- import { Button } from 'react-native';
94
+ import { Button, Platform, StatusBar } from 'react-native';
95
95
  import { InterstitialAd, AdEventType, TestIds } from 'react-native-google-mobile-ads';
96
96
 
97
97
  const adUnitId = __DEV__ ? TestIds.INTERSTITIAL : 'ca-app-pub-xxxxxxxxxxxxx/yyyyyyyyyyyyyy';
@@ -104,15 +104,32 @@ function App() {
104
104
  const [loaded, setLoaded] = useState(false);
105
105
 
106
106
  useEffect(() => {
107
- const unsubscribe = interstitial.addAdEventListener(AdEventType.LOADED, () => {
107
+ const unsubscribeLoaded = interstitial.addAdEventListener(AdEventType.LOADED, () => {
108
108
  setLoaded(true);
109
109
  });
110
110
 
111
+ const unsubscribeOpened = interstitial.addAdEventListener(AdEventType.OPENED, () => {
112
+ if (Platform.OS === 'ios') {
113
+ // Prevent the close button from being unreachable by hiding the status bar on iOS
114
+ StatusBar.setHidden(true)
115
+ }
116
+ });
117
+
118
+ const unsubscribeClosed = interstitial.addAdEventListener(AdEventType.CLOSED, () => {
119
+ if (Platform.OS === 'ios') {
120
+ StatusBar.setHidden(false)
121
+ }
122
+ });
123
+
111
124
  // Start loading the interstitial straight away
112
125
  interstitial.load();
113
126
 
114
127
  // Unsubscribe from events on unmount
115
- return unsubscribe;
128
+ return () => {
129
+ unsubscribeLoaded();
130
+ unsubscribeOpened();
131
+ unsubscribeClosed();
132
+ };
116
133
  }, []);
117
134
 
118
135
  // No advert ready to show yet
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ #if !TARGET_OS_MACCATALYST
19
+
20
+ #import <Foundation/Foundation.h>
21
+
22
+ #ifdef RCT_NEW_ARCH_ENABLED
23
+
24
+ #import <RNGoogleMobileAdsSpec/RNGoogleMobileAdsSpec.h>
25
+ @interface RNGoogleMobileAdsAppOpenModule : NSObject <NativeAppOpenModuleSpec>
26
+
27
+ #else
28
+
29
+ #import <React/RCTBridgeModule.h>
30
+ @interface RNGoogleMobileAdsAppOpenModule : NSObject <RCTBridgeModule>
31
+
32
+ #endif
33
+
34
+ @end
35
+
36
+ #endif
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ #if !TARGET_OS_MACCATALYST
19
+
20
+ #import "RNGoogleMobileAdsAppOpenModule.h"
21
+ #import <GoogleMobileAds/GoogleMobileAds.h>
22
+ #ifdef RCT_NEW_ARCH_ENABLED
23
+ #import "RNGoogleMobileAdsSpec.h"
24
+ #endif
25
+ #import "RNGoogleMobileAdsCommon.h"
26
+ #import "RNGoogleMobileAdsFullScreenAd.h"
27
+
28
+ @interface RNGoogleMobileAdsAppOpenAd : RNGoogleMobileAdsFullScreenAd
29
+
30
+ @end
31
+
32
+ @implementation RNGoogleMobileAdsAppOpenAd
33
+
34
+ - (NSString *)getAdEventName {
35
+ return GOOGLE_MOBILE_ADS_EVENT_APP_OPEN;
36
+ }
37
+
38
+ - (void)loadAd:(NSString *)adUnitId
39
+ adRequest:(GAMRequest *)adRequest
40
+ completionHandler:
41
+ (void (^)(GADAppOpenAd *_Nullable ad, NSError *_Nullable error))completionHandler {
42
+ [GADAppOpenAd loadWithAdUnitID:adUnitId request:adRequest completionHandler:completionHandler];
43
+ }
44
+
45
+ @end
46
+
47
+ @implementation RNGoogleMobileAdsAppOpenModule {
48
+ RNGoogleMobileAdsAppOpenAd *_ad;
49
+ }
50
+
51
+ RCT_EXPORT_MODULE();
52
+
53
+ - (dispatch_queue_t)methodQueue {
54
+ return dispatch_get_main_queue();
55
+ }
56
+
57
+ RCT_EXPORT_METHOD(appOpenLoad
58
+ : (double)requestId adUnitId
59
+ : (NSString *)adUnitId requestOptions
60
+ : (NSDictionary *)requestOptions) {
61
+ [_ad loadWithRequestId:requestId adUnitId:adUnitId adRequestOptions:requestOptions];
62
+ }
63
+
64
+ RCT_EXPORT_METHOD(appOpenShow
65
+ : (double)requestId adUnitId
66
+ : (NSString *)adUnitId showOptions
67
+ : (NSDictionary *)showOptions resolve
68
+ : (RCTPromiseResolveBlock)resolve reject
69
+ : (RCTPromiseRejectBlock)reject) {
70
+ [_ad showWithRequestId:requestId
71
+ adUnitId:adUnitId
72
+ showOptions:showOptions
73
+ resolve:resolve
74
+ reject:reject];
75
+ }
76
+
77
+ RCT_EXPORT_METHOD(invalidate) { [_ad invalidate]; }
78
+
79
+ #ifdef RCT_NEW_ARCH_ENABLED
80
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
81
+ (const facebook::react::ObjCTurboModule::InitParams &)params {
82
+ return std::make_shared<facebook::react::NativeAppOpenModuleSpecJSI>(params);
83
+ }
84
+ #endif
85
+
86
+ - (instancetype)init {
87
+ self = [super init];
88
+ if (self) {
89
+ _ad = [[RNGoogleMobileAdsAppOpenAd alloc] init];
90
+ }
91
+ return self;
92
+ }
93
+
94
+ - (void)dealloc {
95
+ [self invalidate];
96
+ }
97
+
98
+ @end
99
+
100
+ #endif
@@ -1,3 +1,5 @@
1
+ #if !TARGET_OS_MACCATALYST
2
+
1
3
  // This guard prevent this file to be compiled in the old architecture.
2
4
  #ifdef RCT_NEW_ARCH_ENABLED
3
5
  #import <GoogleMobileAds/GADAppEventDelegate.h>
@@ -28,3 +30,5 @@ NS_ASSUME_NONNULL_END
28
30
 
29
31
  #endif /* NativeComponentExampleComponentView_h */
30
32
  #endif /* RCT_NEW_ARCH_ENABLED */
33
+
34
+ #endif
@@ -1,3 +1,5 @@
1
+ #if !TARGET_OS_MACCATALYST
2
+
1
3
  // This guard prevent the code from being compiled in the old architecture
2
4
  #ifdef RCT_NEW_ARCH_ENABLED
3
5
  #import "RNGoogleMobileAdsBannerView.h"
@@ -236,11 +238,14 @@ using namespace facebook::react;
236
238
  }
237
239
  }
238
240
 
241
+ @end
242
+
239
243
  #pragma mark - RNGoogleMobileAdsBannerViewCls
240
244
 
241
245
  Class<RCTComponentViewProtocol> RNGoogleMobileAdsBannerViewCls(void) {
242
246
  return RNGoogleMobileAdsBannerView.class;
243
247
  }
244
248
 
245
- @end
246
249
  #endif
250
+
251
+ #endif
@@ -200,7 +200,9 @@ RCT_EXPORT_METHOD(reset) {
200
200
  RCT_EXPORT_METHOD(getConsentInfo
201
201
  : (RCTPromiseResolveBlock)resolve
202
202
  : (RCTPromiseRejectBlock)reject) {
203
+ #if !TARGET_OS_MACCATALYST
203
204
  resolve([self getConsentInformation]);
205
+ #endif
204
206
  }
205
207
 
206
208
  RCT_EXPORT_METHOD(getTCString : (RCTPromiseResolveBlock)resolve : (RCTPromiseRejectBlock)reject) {
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ #if !TARGET_OS_MACCATALYST
19
+
20
+ #import <Foundation/Foundation.h>
21
+ #import <GoogleMobileAds/GoogleMobileAds.h>
22
+ #import "RNGoogleMobileAdsFullScreenContentDelegate.h"
23
+ #import "RNSharedUtils.h"
24
+
25
+ @interface RNGoogleMobileAdsFullScreenAd : NSObject
26
+
27
+ @property(nonatomic, strong) NSMutableDictionary<NSNumber *, id<GADFullScreenPresentingAd>> *adMap;
28
+ @property(nonatomic, strong)
29
+ NSMutableDictionary<NSNumber *, RNGoogleMobileAdsFullScreenContentDelegate *> *delegateMap;
30
+
31
+ - (instancetype)init;
32
+ - (void)invalidate;
33
+ - (NSString *)getAdEventName;
34
+ - (void)loadAd:(NSString *)adUnitId
35
+ adRequest:(GAMRequest *)adRequest
36
+ completionHandler:(void (^)(id<GADFullScreenPresentingAd> ad, NSError *error))completionHandler;
37
+ - (void)sendAdEvent:(NSString *)type
38
+ requestId:(int)requestId
39
+ adUnitId:(NSString *)adUnitId
40
+ error:(NSDictionary *)error
41
+ data:(NSDictionary *)data;
42
+ - (void)loadWithRequestId:(int)requestId
43
+ adUnitId:(NSString *)adUnitId
44
+ adRequestOptions:(NSDictionary *)adRequestOptions;
45
+ - (void)showWithRequestId:(int)requestId
46
+ adUnitId:(NSString *)adUnitId
47
+ showOptions:(NSDictionary *)showOptions
48
+ resolve:(RCTPromiseResolveBlock)resolve
49
+ reject:(RCTPromiseRejectBlock)reject;
50
+
51
+ @end
52
+
53
+ #endif
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ #if !TARGET_OS_MACCATALYST
19
+
20
+ #import "RNGoogleMobileAdsFullScreenAd.h"
21
+ #import "RNGoogleMobileAdsCommon.h"
22
+
23
+ @implementation RNGoogleMobileAdsFullScreenAd
24
+
25
+ - (instancetype)init {
26
+ if (self = [super init]) {
27
+ _adMap = [NSMutableDictionary new];
28
+ _delegateMap = [NSMutableDictionary new];
29
+ }
30
+ return self;
31
+ }
32
+
33
+ - (void)dealloc {
34
+ [self invalidate];
35
+ }
36
+
37
+ - (void)invalidate {
38
+ [_adMap removeAllObjects];
39
+ [_delegateMap removeAllObjects];
40
+ }
41
+
42
+ - (NSString *)getAdEventName {
43
+ @throw [NSException exceptionWithName:@"MethodNotImplemented"
44
+ reason:@"Method `getAdEventName` must be overridden"
45
+ userInfo:nil];
46
+ }
47
+
48
+ - (void)loadAd:(NSString *)adUnitId
49
+ adRequest:(GAMRequest *)adRequest
50
+ completionHandler:
51
+ (void (^)(id<GADFullScreenPresentingAd> ad, NSError *error))completionHandler {
52
+ @throw [NSException exceptionWithName:@"MethodNotImplemented"
53
+ reason:@"Method `loadAd` must be overridden"
54
+ userInfo:nil];
55
+ }
56
+
57
+ - (void)sendAdEvent:(NSString *)type
58
+ requestId:(int)requestId
59
+ adUnitId:(NSString *)adUnitId
60
+ error:(NSDictionary *)error
61
+ data:(NSDictionary *)data {
62
+ [RNGoogleMobileAdsCommon sendAdEvent:[self getAdEventName]
63
+ requestId:@(requestId)
64
+ type:type
65
+ adUnitId:adUnitId
66
+ error:error
67
+ data:data];
68
+ }
69
+
70
+ - (void)loadWithRequestId:(int)requestId
71
+ adUnitId:(NSString *)adUnitId
72
+ adRequestOptions:(NSDictionary *)adRequestOptions {
73
+ GAMRequest *adRequest = [RNGoogleMobileAdsCommon buildAdRequest:adRequestOptions];
74
+ RNGoogleMobileAdsFullScreenContentDelegate *delegate =
75
+ [[RNGoogleMobileAdsFullScreenContentDelegate alloc] initWithAdEventName:[self getAdEventName]
76
+ requestId:requestId
77
+ adUnitId:adUnitId];
78
+
79
+ __weak __typeof(self) weakSelf = self;
80
+ [self loadAd:adUnitId
81
+ adRequest:adRequest
82
+ completionHandler:^(id<GADFullScreenPresentingAd> ad, NSError *error) {
83
+ if (error) {
84
+ NSDictionary *codeAndMessage =
85
+ [RNGoogleMobileAdsCommon getCodeAndMessageFromAdError:error];
86
+ [weakSelf sendAdEvent:GOOGLE_MOBILE_ADS_EVENT_ERROR
87
+ requestId:requestId
88
+ adUnitId:adUnitId
89
+ error:codeAndMessage
90
+ data:nil];
91
+ return;
92
+ }
93
+
94
+ NSString *eventType = GOOGLE_MOBILE_ADS_EVENT_LOADED;
95
+ NSDictionary *data = nil;
96
+
97
+ // Set up paid event handler
98
+ GADPaidEventHandler paidEventHandler = ^(GADAdValue *value) {
99
+ [weakSelf sendAdEvent:@"paid"
100
+ requestId:requestId
101
+ adUnitId:adUnitId
102
+ error:nil
103
+ data:@{
104
+ @"value" : value.value,
105
+ @"precision" : @(value.precision),
106
+ @"currency" : value.currencyCode
107
+ }];
108
+ };
109
+
110
+ if ([ad isKindOfClass:[GADRewardedAd class]]) {
111
+ [(GADRewardedAd *)ad setPaidEventHandler:paidEventHandler];
112
+ } else if ([ad isKindOfClass:[GADRewardedInterstitialAd class]]) {
113
+ [(GADRewardedInterstitialAd *)ad setPaidEventHandler:paidEventHandler];
114
+ } else if ([ad isKindOfClass:[GADInterstitialAd class]]) {
115
+ [(GADInterstitialAd *)ad setPaidEventHandler:paidEventHandler];
116
+ } else if ([ad isKindOfClass:[GADAppOpenAd class]]) {
117
+ [(GADAppOpenAd *)ad setPaidEventHandler:paidEventHandler];
118
+ }
119
+
120
+ if ([ad isKindOfClass:[GADRewardedAd class]] ||
121
+ [ad isKindOfClass:[GADRewardedInterstitialAd class]]) {
122
+ NSDictionary *serverSideVerificationOptions =
123
+ adRequestOptions[@"serverSideVerificationOptions"];
124
+ if (serverSideVerificationOptions) {
125
+ GADServerSideVerificationOptions *options =
126
+ [[GADServerSideVerificationOptions alloc] init];
127
+ options.userIdentifier = serverSideVerificationOptions[@"userId"];
128
+ options.customRewardString = serverSideVerificationOptions[@"customData"];
129
+
130
+ if ([ad isKindOfClass:[GADRewardedAd class]]) {
131
+ [(GADRewardedAd *)ad setServerSideVerificationOptions:options];
132
+ } else if ([ad isKindOfClass:[GADRewardedInterstitialAd class]]) {
133
+ [(GADRewardedInterstitialAd *)ad setServerSideVerificationOptions:options];
134
+ }
135
+ }
136
+
137
+ eventType = GOOGLE_MOBILE_ADS_EVENT_REWARDED_LOADED;
138
+ GADAdReward *adReward =
139
+ [(GADRewardedAd *)ad adReward] ?: [(GADRewardedInterstitialAd *)ad adReward];
140
+ data = @{@"type" : adReward.type, @"amount" : adReward.amount};
141
+ }
142
+
143
+ if ([ad isKindOfClass:[GAMInterstitialAd class]]) {
144
+ [(GAMInterstitialAd *)ad setAppEventDelegate:delegate];
145
+ }
146
+
147
+ ad.fullScreenContentDelegate = delegate;
148
+ weakSelf.adMap[@(requestId)] = ad;
149
+ weakSelf.delegateMap[@(requestId)] = delegate;
150
+
151
+ [weakSelf sendAdEvent:eventType requestId:requestId adUnitId:adUnitId error:nil data:data];
152
+ }];
153
+ }
154
+
155
+ - (void)showWithRequestId:(int)requestId
156
+ adUnitId:(NSString *)adUnitId
157
+ showOptions:(NSDictionary *)showOptions
158
+ resolve:(RCTPromiseResolveBlock)resolve
159
+ reject:(RCTPromiseRejectBlock)reject {
160
+ UIViewController *viewController = [RNGoogleMobileAdsCommon currentViewController];
161
+ if (!viewController) {
162
+ [RNSharedUtils
163
+ rejectPromiseWithUserInfo:reject
164
+ userInfo:@{
165
+ @"code" : @"nil-vc",
166
+ @"message" :
167
+ @"Ad attempted to show but the current View Controller was nil."
168
+ }];
169
+ return;
170
+ }
171
+
172
+ id<GADFullScreenPresentingAd> ad = self.adMap[@(requestId)];
173
+ if (!ad) {
174
+ [RNSharedUtils rejectPromiseWithUserInfo:reject
175
+ userInfo:@{
176
+ @"code" : @"not-ready",
177
+ @"message" : @"Ad attempted to show but was not ready."
178
+ }];
179
+ return;
180
+ }
181
+
182
+ if ([ad isKindOfClass:[GADAppOpenAd class]]) {
183
+ [(GADAppOpenAd *)ad presentFromRootViewController:viewController];
184
+ } else if ([ad isKindOfClass:[GADInterstitialAd class]]) {
185
+ [(GADInterstitialAd *)ad presentFromRootViewController:viewController];
186
+ } else if ([ad isKindOfClass:[GADRewardedAd class]]) {
187
+ [(GADRewardedAd *)ad presentFromRootViewController:viewController
188
+ userDidEarnRewardHandler:^{
189
+ NSDictionary *rewardData = @{
190
+ @"type" : [(GADRewardedAd *)ad adReward].type,
191
+ @"amount" : [(GADRewardedAd *)ad adReward].amount
192
+ };
193
+ [self sendAdEvent:GOOGLE_MOBILE_ADS_EVENT_REWARDED_EARNED_REWARD
194
+ requestId:requestId
195
+ adUnitId:adUnitId
196
+ error:nil
197
+ data:rewardData];
198
+ }];
199
+ } else if ([ad isKindOfClass:[GADRewardedInterstitialAd class]]) {
200
+ [(GADRewardedInterstitialAd *)ad
201
+ presentFromRootViewController:viewController
202
+ userDidEarnRewardHandler:^{
203
+ NSDictionary *rewardData = @{
204
+ @"type" : [(GADRewardedInterstitialAd *)ad adReward].type,
205
+ @"amount" : [(GADRewardedInterstitialAd *)ad adReward].amount
206
+ };
207
+ [self sendAdEvent:GOOGLE_MOBILE_ADS_EVENT_REWARDED_EARNED_REWARD
208
+ requestId:requestId
209
+ adUnitId:adUnitId
210
+ error:nil
211
+ data:rewardData];
212
+ }];
213
+ }
214
+
215
+ resolve(nil);
216
+ }
217
+
218
+ @end
219
+
220
+ #endif
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ #if !TARGET_OS_MACCATALYST
19
+
20
+ #import <Foundation/Foundation.h>
21
+ #import <GoogleMobileAds/GoogleMobileAds.h>
22
+
23
+ @interface RNGoogleMobileAdsFullScreenContentDelegate
24
+ : NSObject <GADFullScreenContentDelegate, GADAppEventDelegate>
25
+
26
+ @property(nonatomic, strong, readonly) NSString *adEventName;
27
+ @property(nonatomic, assign, readonly) int requestId;
28
+ @property(nonatomic, strong, readonly) NSString *adUnitId;
29
+
30
+ - (instancetype)initWithAdEventName:(NSString *)adEventName
31
+ requestId:(int)requestId
32
+ adUnitId:(NSString *)adUnitId;
33
+
34
+ @end
35
+
36
+ #endif