react-native-google-mobile-ads 13.6.0 → 14.0.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.
- package/android/build.gradle +5 -3
- package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsBannerAdViewManager.java +4 -13
- package/app.plugin.js +1 -0
- package/babel.config.js +1 -11
- package/docs/displaying-ads.mdx +1 -2
- package/docs/european-user-consent.mdx +23 -2
- package/docs/index.mdx +76 -77
- package/ios_config.sh +10 -0
- package/jest.config.js +3 -2
- package/lib/commonjs/AdEventType.js +1 -2
- package/lib/commonjs/AdEventType.js.map +1 -1
- package/lib/commonjs/AdsConsent.js +2 -4
- package/lib/commonjs/AdsConsent.js.map +1 -1
- package/lib/commonjs/AdsConsentDebugGeography.js +1 -2
- package/lib/commonjs/AdsConsentDebugGeography.js.map +1 -1
- package/lib/commonjs/AdsConsentPrivacyOptionsRequirementStatus.js +1 -2
- package/lib/commonjs/AdsConsentPrivacyOptionsRequirementStatus.js.map +1 -1
- package/lib/commonjs/AdsConsentPurposes.js +1 -2
- package/lib/commonjs/AdsConsentPurposes.js.map +1 -1
- package/lib/commonjs/AdsConsentSpecialFeatures.js +1 -2
- package/lib/commonjs/AdsConsentSpecialFeatures.js.map +1 -1
- package/lib/commonjs/AdsConsentStatus.js +1 -2
- package/lib/commonjs/AdsConsentStatus.js.map +1 -1
- package/lib/commonjs/BannerAdSize.js +2 -4
- package/lib/commonjs/BannerAdSize.js.map +1 -1
- package/lib/commonjs/GAMAdEventType.js +1 -2
- package/lib/commonjs/GAMAdEventType.js.map +1 -1
- package/lib/commonjs/MaxAdContentRating.js +1 -2
- package/lib/commonjs/MaxAdContentRating.js.map +1 -1
- package/lib/commonjs/MobileAds.js +2 -3
- package/lib/commonjs/MobileAds.js.map +1 -1
- package/lib/commonjs/NativeGoogleMobileAdsModule.js +1 -2
- package/lib/commonjs/NativeGoogleMobileAdsModule.js.map +1 -1
- package/lib/commonjs/RewardedAdEventType.js +1 -2
- package/lib/commonjs/RewardedAdEventType.js.map +1 -1
- package/lib/commonjs/TestIds.js +1 -2
- package/lib/commonjs/TestIds.js.map +1 -1
- package/lib/commonjs/ads/AppOpenAd.js.map +1 -1
- package/lib/commonjs/ads/BannerAd.js +18 -18
- package/lib/commonjs/ads/BannerAd.js.map +1 -1
- package/lib/commonjs/ads/BaseAd.js +10 -12
- package/lib/commonjs/ads/BaseAd.js.map +1 -1
- package/lib/commonjs/ads/GAMBannerAd.js +18 -18
- package/lib/commonjs/ads/GAMBannerAd.js.map +1 -1
- package/lib/commonjs/ads/GAMInterstitialAd.js.map +1 -1
- package/lib/commonjs/ads/GoogleMobileAdsBannerViewNativeComponent.js +5 -5
- package/lib/commonjs/ads/GoogleMobileAdsBannerViewNativeComponent.js.map +1 -1
- package/lib/commonjs/ads/InterstitialAd.js.map +1 -1
- package/lib/commonjs/ads/MobileAd.js.map +1 -1
- package/lib/commonjs/ads/RewardedAd.js.map +1 -1
- package/lib/commonjs/ads/RewardedInterstitialAd.js.map +1 -1
- package/lib/commonjs/common/constants.js +1 -2
- package/lib/commonjs/common/constants.js.map +1 -1
- package/lib/commonjs/common/debounce.js +1 -4
- package/lib/commonjs/common/debounce.js.map +1 -1
- package/lib/commonjs/common/index.js.map +1 -1
- package/lib/commonjs/common/validate.js +1 -2
- package/lib/commonjs/common/validate.js.map +1 -1
- package/lib/commonjs/declarations.d.js.map +1 -1
- package/lib/commonjs/hooks/useAppOpenAd.js +2 -3
- package/lib/commonjs/hooks/useAppOpenAd.js.map +1 -1
- package/lib/commonjs/hooks/useForeground.js.map +1 -1
- package/lib/commonjs/hooks/useFullScreenAd.js +4 -5
- package/lib/commonjs/hooks/useFullScreenAd.js.map +1 -1
- package/lib/commonjs/hooks/useInterstitialAd.js +2 -3
- package/lib/commonjs/hooks/useInterstitialAd.js.map +1 -1
- package/lib/commonjs/hooks/useRewardedAd.js +2 -3
- package/lib/commonjs/hooks/useRewardedAd.js.map +1 -1
- package/lib/commonjs/hooks/useRewardedInterstitialAd.js +2 -3
- package/lib/commonjs/hooks/useRewardedInterstitialAd.js.map +1 -1
- package/lib/commonjs/index.js +3 -4
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/internal/GoogleMobileAdsNativeEventEmitter.js +8 -2
- package/lib/commonjs/internal/GoogleMobileAdsNativeEventEmitter.js.map +1 -1
- package/lib/commonjs/internal/NativeError.js.map +1 -1
- package/lib/commonjs/internal/SharedEventEmitter.js +2 -5
- package/lib/commonjs/internal/SharedEventEmitter.js.map +1 -1
- package/lib/commonjs/types/AdEventListener.js.map +1 -1
- package/lib/commonjs/types/AdEventsListener.js.map +1 -1
- package/lib/commonjs/types/AdShowOptions.js.map +1 -1
- package/lib/commonjs/types/AdStates.js.map +1 -1
- package/lib/commonjs/types/AdapterStatus.js +1 -2
- package/lib/commonjs/types/AdapterStatus.js.map +1 -1
- package/lib/commonjs/types/AdsConsent.interface.js.map +1 -1
- package/lib/commonjs/types/AppEvent.js.map +1 -1
- package/lib/commonjs/types/BannerAdProps.js.map +1 -1
- package/lib/commonjs/types/MobileAd.interface.js.map +1 -1
- package/lib/commonjs/types/MobileAdsModule.interface.js.map +1 -1
- package/lib/commonjs/types/PaidEventListener.js.map +1 -1
- package/lib/commonjs/types/RequestConfiguration.js.map +1 -1
- package/lib/commonjs/types/RequestOptions.js.map +1 -1
- package/lib/commonjs/types/RewardedAdReward.js.map +1 -1
- package/lib/commonjs/types/index.js.map +1 -1
- package/lib/commonjs/validateAdRequestConfiguration.js.map +1 -1
- package/lib/commonjs/validateAdRequestOptions.js +1 -2
- package/lib/commonjs/validateAdRequestOptions.js.map +1 -1
- package/lib/commonjs/validateAdShowOptions.js.map +1 -1
- package/lib/commonjs/version.js +1 -2
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/AdEventType.js.map +1 -1
- package/lib/module/AdsConsent.js +1 -2
- package/lib/module/AdsConsent.js.map +1 -1
- package/lib/module/AdsConsentDebugGeography.js.map +1 -1
- package/lib/module/AdsConsentPrivacyOptionsRequirementStatus.js.map +1 -1
- package/lib/module/AdsConsentPurposes.js.map +1 -1
- package/lib/module/AdsConsentSpecialFeatures.js.map +1 -1
- package/lib/module/AdsConsentStatus.js.map +1 -1
- package/lib/module/BannerAdSize.js.map +1 -1
- package/lib/module/GAMAdEventType.js.map +1 -1
- package/lib/module/MaxAdContentRating.js.map +1 -1
- package/lib/module/MobileAds.js.map +1 -1
- package/lib/module/NativeGoogleMobileAdsModule.js.map +1 -1
- package/lib/module/RewardedAdEventType.js.map +1 -1
- package/lib/module/TestIds.js.map +1 -1
- package/lib/module/ads/AppOpenAd.js.map +1 -1
- package/lib/module/ads/BannerAd.js +1 -1
- package/lib/module/ads/BannerAd.js.map +1 -1
- package/lib/module/ads/BaseAd.js +7 -8
- package/lib/module/ads/BaseAd.js.map +1 -1
- package/lib/module/ads/GAMBannerAd.js +1 -1
- package/lib/module/ads/GAMBannerAd.js.map +1 -1
- package/lib/module/ads/GAMInterstitialAd.js.map +1 -1
- package/lib/module/ads/GoogleMobileAdsBannerViewNativeComponent.js +2 -0
- package/lib/module/ads/GoogleMobileAdsBannerViewNativeComponent.js.map +1 -1
- package/lib/module/ads/InterstitialAd.js.map +1 -1
- package/lib/module/ads/MobileAd.js.map +1 -1
- package/lib/module/ads/RewardedAd.js.map +1 -1
- package/lib/module/ads/RewardedInterstitialAd.js.map +1 -1
- package/lib/module/common/constants.js.map +1 -1
- package/lib/module/common/debounce.js +1 -4
- package/lib/module/common/debounce.js.map +1 -1
- package/lib/module/common/index.js.map +1 -1
- package/lib/module/common/validate.js +1 -2
- package/lib/module/common/validate.js.map +1 -1
- package/lib/module/declarations.d.js.map +1 -1
- package/lib/module/hooks/useAppOpenAd.js +1 -2
- package/lib/module/hooks/useAppOpenAd.js.map +1 -1
- package/lib/module/hooks/useForeground.js.map +1 -1
- package/lib/module/hooks/useFullScreenAd.js +4 -5
- package/lib/module/hooks/useFullScreenAd.js.map +1 -1
- package/lib/module/hooks/useInterstitialAd.js +1 -2
- package/lib/module/hooks/useInterstitialAd.js.map +1 -1
- package/lib/module/hooks/useRewardedAd.js +1 -2
- package/lib/module/hooks/useRewardedAd.js.map +1 -1
- package/lib/module/hooks/useRewardedInterstitialAd.js +1 -2
- package/lib/module/hooks/useRewardedInterstitialAd.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/internal/GoogleMobileAdsNativeEventEmitter.js +7 -0
- package/lib/module/internal/GoogleMobileAdsNativeEventEmitter.js.map +1 -1
- package/lib/module/internal/NativeError.js.map +1 -1
- package/lib/module/internal/SharedEventEmitter.js +2 -3
- package/lib/module/internal/SharedEventEmitter.js.map +1 -1
- package/lib/module/types/AdEventListener.js.map +1 -1
- package/lib/module/types/AdEventsListener.js.map +1 -1
- package/lib/module/types/AdShowOptions.js.map +1 -1
- package/lib/module/types/AdStates.js.map +1 -1
- package/lib/module/types/AdapterStatus.js.map +1 -1
- package/lib/module/types/AdsConsent.interface.js.map +1 -1
- package/lib/module/types/AppEvent.js.map +1 -1
- package/lib/module/types/BannerAdProps.js.map +1 -1
- package/lib/module/types/MobileAd.interface.js.map +1 -1
- package/lib/module/types/MobileAdsModule.interface.js.map +1 -1
- package/lib/module/types/PaidEventListener.js.map +1 -1
- package/lib/module/types/RequestConfiguration.js.map +1 -1
- package/lib/module/types/RequestOptions.js.map +1 -1
- package/lib/module/types/RewardedAdReward.js.map +1 -1
- package/lib/module/types/index.js.map +1 -1
- package/lib/module/validateAdRequestConfiguration.js.map +1 -1
- package/lib/module/validateAdRequestOptions.js +1 -2
- package/lib/module/validateAdRequestOptions.js.map +1 -1
- package/lib/module/validateAdShowOptions.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/ads/BannerAd.d.ts +1 -1
- package/lib/typescript/ads/GAMBannerAd.d.ts +1 -1
- package/lib/typescript/ads/GAMInterstitialAd.d.ts.map +1 -1
- package/lib/typescript/ads/GoogleMobileAdsBannerViewNativeComponent.d.ts +2 -2
- package/lib/typescript/ads/GoogleMobileAdsBannerViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/ads/MobileAd.d.ts +3 -3
- package/lib/typescript/ads/MobileAd.d.ts.map +1 -1
- package/lib/typescript/common/debounce.d.ts +1 -1
- package/lib/typescript/common/debounce.d.ts.map +1 -1
- package/lib/typescript/common/validate.d.ts +4 -4
- package/lib/typescript/common/validate.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/internal/GoogleMobileAdsNativeEventEmitter.d.ts.map +1 -1
- package/lib/typescript/internal/SharedEventEmitter.d.ts +1 -1
- package/lib/typescript/internal/SharedEventEmitter.d.ts.map +1 -1
- package/lib/typescript/types/AdEventListener.d.ts +2 -2
- package/lib/typescript/types/AdEventListener.d.ts.map +1 -1
- package/lib/typescript/types/AdEventsListener.d.ts +1 -1
- package/lib/typescript/types/AdEventsListener.d.ts.map +1 -1
- package/lib/typescript/types/AdapterStatus.d.ts +1 -1
- package/lib/typescript/types/AdapterStatus.d.ts.map +1 -1
- package/lib/typescript/types/BannerAdProps.d.ts +1 -1
- package/lib/typescript/types/BannerAdProps.d.ts.map +1 -1
- package/lib/typescript/types/PaidEventListener.d.ts +2 -2
- package/lib/typescript/types/PaidEventListener.d.ts.map +1 -1
- package/lib/typescript/types/RequestOptions.d.ts +1 -1
- package/lib/typescript/types/RequestOptions.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/package.json +24 -7
- package/plugin/__tests__/__snapshots__/plugin.test.ts.snap +140 -0
- package/plugin/__tests__/fixtures/app-without-params.json +11 -0
- package/plugin/__tests__/fixtures/app.json +24 -0
- package/plugin/__tests__/fixtures/package.json +19 -0
- package/plugin/__tests__/plugin.test.ts +96 -0
- package/plugin/build/index.d.ts +12 -0
- package/plugin/build/index.js +101 -0
- package/plugin/jest.config.js +1 -0
- package/plugin/src/index.ts +194 -0
- package/plugin/tsconfig.json +9 -0
- package/src/ads/BaseAd.tsx +3 -3
- package/src/ads/GoogleMobileAdsBannerViewNativeComponent.ts +2 -0
- package/src/internal/GoogleMobileAdsNativeEventEmitter.ts +7 -0
- package/src/internal/SharedEventEmitter.ts +2 -4
- package/src/types/BannerAdProps.ts +1 -1
- package/src/version.ts +1 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "example",
|
|
3
|
+
"slug": "example",
|
|
4
|
+
"android": {
|
|
5
|
+
"package": "com.example"
|
|
6
|
+
},
|
|
7
|
+
"ios": {
|
|
8
|
+
"bundleIdentifier": "com.example"
|
|
9
|
+
},
|
|
10
|
+
"plugins": [
|
|
11
|
+
[
|
|
12
|
+
"../../build",
|
|
13
|
+
{
|
|
14
|
+
"androidAppId": "TestAppId",
|
|
15
|
+
"iosAppId": "TestIosId",
|
|
16
|
+
"delayAppMeasurementInit": true,
|
|
17
|
+
"optimizeInitialization": true,
|
|
18
|
+
"optimizeAdLoading": true,
|
|
19
|
+
"skAdNetworkItems": ["TestSkAdNetworkItem1", "TestSkAdNetworkItem2"],
|
|
20
|
+
"userTrackingUsageDescription": "TestUserTrackingUsageDescription"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "example",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"scripts": {
|
|
5
|
+
"start": "expo start --dev-client",
|
|
6
|
+
"android": "expo run:android",
|
|
7
|
+
"ios": "expo run:ios"
|
|
8
|
+
},
|
|
9
|
+
"devDependencies": {
|
|
10
|
+
"@babel/core": "^7.12.9"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"expo": "~47.0.14",
|
|
14
|
+
"expo-splash-screen": "~0.17.5",
|
|
15
|
+
"expo-status-bar": "~1.4.2",
|
|
16
|
+
"react": "18.1.0",
|
|
17
|
+
"react-native": "0.70.8"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
import util from 'util';
|
|
5
|
+
|
|
6
|
+
const execAsync = util.promisify(exec);
|
|
7
|
+
|
|
8
|
+
describe('Expo Config Plugin Tests', () => {
|
|
9
|
+
const fixturesPath = path.join(__dirname, 'fixtures');
|
|
10
|
+
const testAppPath = path.join(__dirname, 'build');
|
|
11
|
+
const infoPlistPath = path.join(testAppPath, 'ios', 'example', 'Info.plist');
|
|
12
|
+
const androidManifestPath = path.join(
|
|
13
|
+
testAppPath,
|
|
14
|
+
'android',
|
|
15
|
+
'app',
|
|
16
|
+
'src',
|
|
17
|
+
'main',
|
|
18
|
+
'AndroidManifest.xml',
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
beforeEach(async () => {
|
|
22
|
+
await fs.rm(testAppPath, { recursive: true, force: true });
|
|
23
|
+
await fs.mkdir(testAppPath);
|
|
24
|
+
await fs.copyFile(path.join(fixturesPath, 'app.json'), path.join(testAppPath, 'app.json'));
|
|
25
|
+
await fs.copyFile(
|
|
26
|
+
path.join(fixturesPath, 'package.json'),
|
|
27
|
+
path.join(testAppPath, 'package.json'),
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('Technically requires no parameters', async () => {
|
|
32
|
+
await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('Warns about missing androidAppId', async () => {
|
|
36
|
+
await fs.copyFile(
|
|
37
|
+
path.join(fixturesPath, 'app-without-params.json'),
|
|
38
|
+
path.join(testAppPath, 'app.json'),
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const { stderr } = await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
|
|
42
|
+
expect(stderr).toMatch(/No 'androidAppId' was provided/);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('Warns about missing iosAppId', async () => {
|
|
46
|
+
await fs.copyFile(
|
|
47
|
+
path.join(fixturesPath, 'app-without-params.json'),
|
|
48
|
+
path.join(testAppPath, 'app.json'),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const { stderr } = await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
|
|
52
|
+
expect(stderr).toMatch(/No 'iosAppId' was provided/);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('Optimizes initialization on Android by default', async () => {
|
|
56
|
+
await fs.copyFile(
|
|
57
|
+
path.join(fixturesPath, 'app-without-params.json'),
|
|
58
|
+
path.join(testAppPath, 'app.json'),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
|
|
62
|
+
|
|
63
|
+
const androidManifest = await fs.readFile(androidManifestPath, 'utf8');
|
|
64
|
+
expect(androidManifest).toContain(
|
|
65
|
+
'<meta-data android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION" android:value="true" tools:replace="android:value"/>',
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('Optimizes ad loading on Android by default', async () => {
|
|
70
|
+
await fs.copyFile(
|
|
71
|
+
path.join(fixturesPath, 'app-without-params.json'),
|
|
72
|
+
path.join(testAppPath, 'app.json'),
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
|
|
76
|
+
|
|
77
|
+
const androidManifest = await fs.readFile(androidManifestPath, 'utf8');
|
|
78
|
+
expect(androidManifest).toContain(
|
|
79
|
+
'<meta-data android:name="com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING" android:value="true" tools:replace="android:value"/>',
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('Should modify AndroidManifest.xml', async () => {
|
|
84
|
+
await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
|
|
85
|
+
|
|
86
|
+
const androidManifest = await fs.readFile(androidManifestPath, 'utf8');
|
|
87
|
+
expect(androidManifest).toMatchSnapshot();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('Should modify Info.plist', async () => {
|
|
91
|
+
await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
|
|
92
|
+
|
|
93
|
+
const infoPlist = await fs.readFile(infoPlistPath, 'utf8');
|
|
94
|
+
expect(infoPlist).toMatchSnapshot();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ConfigPlugin } from '@expo/config-plugins';
|
|
2
|
+
type PluginParameters = {
|
|
3
|
+
androidAppId?: string;
|
|
4
|
+
iosAppId?: string;
|
|
5
|
+
delayAppMeasurementInit?: boolean;
|
|
6
|
+
optimizeInitialization?: boolean;
|
|
7
|
+
optimizeAdLoading?: boolean;
|
|
8
|
+
skAdNetworkItems?: string[];
|
|
9
|
+
userTrackingUsageDescription?: string;
|
|
10
|
+
};
|
|
11
|
+
declare const withReactNativeGoogleMobileAds: ConfigPlugin<PluginParameters>;
|
|
12
|
+
export default withReactNativeGoogleMobileAds;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config_plugins_1 = require("@expo/config-plugins");
|
|
4
|
+
function addReplacingMainApplicationMetaDataItem(manifest, itemName, itemValue) {
|
|
5
|
+
config_plugins_1.AndroidConfig.Manifest.ensureToolsAvailable(manifest);
|
|
6
|
+
const newItem = {
|
|
7
|
+
$: {
|
|
8
|
+
'android:name': itemName,
|
|
9
|
+
'android:value': itemValue,
|
|
10
|
+
'tools:replace': 'android:value',
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
const mainApplication = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(manifest);
|
|
14
|
+
mainApplication['meta-data'] = mainApplication['meta-data'] ?? [];
|
|
15
|
+
mainApplication['meta-data'].push(newItem);
|
|
16
|
+
return manifest;
|
|
17
|
+
}
|
|
18
|
+
const withAndroidAppId = (config, androidAppId) => {
|
|
19
|
+
if (androidAppId === undefined)
|
|
20
|
+
return config;
|
|
21
|
+
return (0, config_plugins_1.withAndroidManifest)(config, config => {
|
|
22
|
+
addReplacingMainApplicationMetaDataItem(config.modResults, 'com.google.android.gms.ads.APPLICATION_ID', androidAppId);
|
|
23
|
+
return config;
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
const withAndroidAppMeasurementInitDelayed = (config, delayAppMeasurementInit) => {
|
|
27
|
+
if (delayAppMeasurementInit === undefined)
|
|
28
|
+
return config;
|
|
29
|
+
return (0, config_plugins_1.withAndroidManifest)(config, config => {
|
|
30
|
+
addReplacingMainApplicationMetaDataItem(config.modResults, 'com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT', delayAppMeasurementInit.toString());
|
|
31
|
+
return config;
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
const withAndroidInitializationOptimized = (config, optimizeInitialization = true) => {
|
|
35
|
+
return (0, config_plugins_1.withAndroidManifest)(config, config => {
|
|
36
|
+
addReplacingMainApplicationMetaDataItem(config.modResults, 'com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION', optimizeInitialization.toString());
|
|
37
|
+
return config;
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const withAndroidAdLoadingOptimized = (config, optimizeAdLoading = true) => {
|
|
41
|
+
return (0, config_plugins_1.withAndroidManifest)(config, config => {
|
|
42
|
+
addReplacingMainApplicationMetaDataItem(config.modResults, 'com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING', optimizeAdLoading.toString());
|
|
43
|
+
return config;
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const withIosAppId = (config, iosAppId) => {
|
|
47
|
+
if (iosAppId === undefined)
|
|
48
|
+
return config;
|
|
49
|
+
return (0, config_plugins_1.withInfoPlist)(config, config => {
|
|
50
|
+
config.modResults.GADApplicationIdentifier = iosAppId;
|
|
51
|
+
return config;
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
const withIosAppMeasurementInitDelayed = (config, delayAppMeasurementInit = false) => {
|
|
55
|
+
return (0, config_plugins_1.withInfoPlist)(config, config => {
|
|
56
|
+
config.modResults.GADDelayAppMeasurementInit = delayAppMeasurementInit;
|
|
57
|
+
return config;
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const withIosSkAdNetworkItems = (config, skAdNetworkItems) => {
|
|
61
|
+
if (skAdNetworkItems === undefined)
|
|
62
|
+
return config;
|
|
63
|
+
return (0, config_plugins_1.withInfoPlist)(config, config => {
|
|
64
|
+
config.modResults.SKAdNetworkItems = config.modResults.SKAdNetworkItems ?? [];
|
|
65
|
+
const existingIdentifiers = config.modResults.SKAdNetworkItems.map((item) => item.SKAdNetworkIdentifier);
|
|
66
|
+
const missingIdentifiers = skAdNetworkItems.filter(skAdNetworkItem => !existingIdentifiers.includes(skAdNetworkItem));
|
|
67
|
+
config.modResults.SKAdNetworkItems.push(...missingIdentifiers.map(identifier => ({
|
|
68
|
+
SKAdNetworkIdentifier: identifier,
|
|
69
|
+
})));
|
|
70
|
+
return config;
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
const withIosUserTrackingUsageDescription = (config, userTrackingUsageDescription) => {
|
|
74
|
+
if (userTrackingUsageDescription === undefined)
|
|
75
|
+
return config;
|
|
76
|
+
return (0, config_plugins_1.withInfoPlist)(config, config => {
|
|
77
|
+
config.modResults.NSUserTrackingUsageDescription = userTrackingUsageDescription;
|
|
78
|
+
return config;
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
const withReactNativeGoogleMobileAds = (config, { androidAppId, delayAppMeasurementInit, optimizeInitialization, optimizeAdLoading, iosAppId, skAdNetworkItems, userTrackingUsageDescription, } = {}) => {
|
|
82
|
+
if (androidAppId === undefined) {
|
|
83
|
+
console.warn("No 'androidAppId' was provided. The native Google Mobile Ads SDK will crash on Android without it.");
|
|
84
|
+
}
|
|
85
|
+
if (iosAppId === undefined) {
|
|
86
|
+
console.warn("No 'iosAppId' was provided. The native Google Mobile Ads SDK will crash on iOS without it.");
|
|
87
|
+
}
|
|
88
|
+
return (0, config_plugins_1.withPlugins)(config, [
|
|
89
|
+
// Android
|
|
90
|
+
[withAndroidAppId, androidAppId],
|
|
91
|
+
[withAndroidAppMeasurementInitDelayed, delayAppMeasurementInit],
|
|
92
|
+
[withAndroidInitializationOptimized, optimizeInitialization],
|
|
93
|
+
[withAndroidAdLoadingOptimized, optimizeAdLoading],
|
|
94
|
+
// iOS
|
|
95
|
+
[withIosAppId, iosAppId],
|
|
96
|
+
[withIosAppMeasurementInitDelayed, delayAppMeasurementInit],
|
|
97
|
+
[withIosSkAdNetworkItems, skAdNetworkItems],
|
|
98
|
+
[withIosUserTrackingUsageDescription, userTrackingUsageDescription],
|
|
99
|
+
]);
|
|
100
|
+
};
|
|
101
|
+
exports.default = withReactNativeGoogleMobileAds;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require("expo-module-scripts/jest-preset-plugin");
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AndroidConfig,
|
|
3
|
+
ConfigPlugin,
|
|
4
|
+
withAndroidManifest,
|
|
5
|
+
withPlugins,
|
|
6
|
+
withInfoPlist,
|
|
7
|
+
} from '@expo/config-plugins';
|
|
8
|
+
|
|
9
|
+
type PluginParameters = {
|
|
10
|
+
androidAppId?: string;
|
|
11
|
+
iosAppId?: string;
|
|
12
|
+
delayAppMeasurementInit?: boolean;
|
|
13
|
+
optimizeInitialization?: boolean;
|
|
14
|
+
optimizeAdLoading?: boolean;
|
|
15
|
+
skAdNetworkItems?: string[];
|
|
16
|
+
userTrackingUsageDescription?: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
function addReplacingMainApplicationMetaDataItem(
|
|
20
|
+
manifest: AndroidConfig.Manifest.AndroidManifest,
|
|
21
|
+
itemName: string,
|
|
22
|
+
itemValue: string,
|
|
23
|
+
): AndroidConfig.Manifest.AndroidManifest {
|
|
24
|
+
AndroidConfig.Manifest.ensureToolsAvailable(manifest);
|
|
25
|
+
|
|
26
|
+
const newItem = {
|
|
27
|
+
$: {
|
|
28
|
+
'android:name': itemName,
|
|
29
|
+
'android:value': itemValue,
|
|
30
|
+
'tools:replace': 'android:value',
|
|
31
|
+
},
|
|
32
|
+
} as AndroidConfig.Manifest.ManifestMetaData;
|
|
33
|
+
|
|
34
|
+
const mainApplication = AndroidConfig.Manifest.getMainApplicationOrThrow(manifest);
|
|
35
|
+
mainApplication['meta-data'] = mainApplication['meta-data'] ?? [];
|
|
36
|
+
mainApplication['meta-data'].push(newItem);
|
|
37
|
+
|
|
38
|
+
return manifest;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const withAndroidAppId: ConfigPlugin<PluginParameters['androidAppId']> = (config, androidAppId) => {
|
|
42
|
+
if (androidAppId === undefined) return config;
|
|
43
|
+
|
|
44
|
+
return withAndroidManifest(config, config => {
|
|
45
|
+
addReplacingMainApplicationMetaDataItem(
|
|
46
|
+
config.modResults,
|
|
47
|
+
'com.google.android.gms.ads.APPLICATION_ID',
|
|
48
|
+
androidAppId,
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
return config;
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const withAndroidAppMeasurementInitDelayed: ConfigPlugin<
|
|
56
|
+
PluginParameters['delayAppMeasurementInit']
|
|
57
|
+
> = (config, delayAppMeasurementInit) => {
|
|
58
|
+
if (delayAppMeasurementInit === undefined) return config;
|
|
59
|
+
|
|
60
|
+
return withAndroidManifest(config, config => {
|
|
61
|
+
addReplacingMainApplicationMetaDataItem(
|
|
62
|
+
config.modResults,
|
|
63
|
+
'com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT',
|
|
64
|
+
delayAppMeasurementInit.toString(),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
return config;
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const withAndroidInitializationOptimized: ConfigPlugin<
|
|
72
|
+
PluginParameters['optimizeInitialization']
|
|
73
|
+
> = (config, optimizeInitialization = true) => {
|
|
74
|
+
return withAndroidManifest(config, config => {
|
|
75
|
+
addReplacingMainApplicationMetaDataItem(
|
|
76
|
+
config.modResults,
|
|
77
|
+
'com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION',
|
|
78
|
+
optimizeInitialization.toString(),
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return config;
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const withAndroidAdLoadingOptimized: ConfigPlugin<PluginParameters['optimizeAdLoading']> = (
|
|
86
|
+
config,
|
|
87
|
+
optimizeAdLoading = true,
|
|
88
|
+
) => {
|
|
89
|
+
return withAndroidManifest(config, config => {
|
|
90
|
+
addReplacingMainApplicationMetaDataItem(
|
|
91
|
+
config.modResults,
|
|
92
|
+
'com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING',
|
|
93
|
+
optimizeAdLoading.toString(),
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
return config;
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const withIosAppId: ConfigPlugin<PluginParameters['iosAppId']> = (config, iosAppId) => {
|
|
101
|
+
if (iosAppId === undefined) return config;
|
|
102
|
+
|
|
103
|
+
return withInfoPlist(config, config => {
|
|
104
|
+
config.modResults.GADApplicationIdentifier = iosAppId;
|
|
105
|
+
return config;
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const withIosAppMeasurementInitDelayed: ConfigPlugin<
|
|
110
|
+
PluginParameters['delayAppMeasurementInit']
|
|
111
|
+
> = (config, delayAppMeasurementInit = false) => {
|
|
112
|
+
return withInfoPlist(config, config => {
|
|
113
|
+
config.modResults.GADDelayAppMeasurementInit = delayAppMeasurementInit;
|
|
114
|
+
return config;
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const withIosSkAdNetworkItems: ConfigPlugin<PluginParameters['skAdNetworkItems']> = (
|
|
119
|
+
config,
|
|
120
|
+
skAdNetworkItems,
|
|
121
|
+
) => {
|
|
122
|
+
if (skAdNetworkItems === undefined) return config;
|
|
123
|
+
|
|
124
|
+
return withInfoPlist(config, config => {
|
|
125
|
+
config.modResults.SKAdNetworkItems = config.modResults.SKAdNetworkItems ?? [];
|
|
126
|
+
|
|
127
|
+
const existingIdentifiers = config.modResults.SKAdNetworkItems.map(
|
|
128
|
+
(item: { SKAdNetworkIdentifier: string }) => item.SKAdNetworkIdentifier,
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
const missingIdentifiers = skAdNetworkItems.filter(
|
|
132
|
+
skAdNetworkItem => !existingIdentifiers.includes(skAdNetworkItem),
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
config.modResults.SKAdNetworkItems.push(
|
|
136
|
+
...missingIdentifiers.map(identifier => ({
|
|
137
|
+
SKAdNetworkIdentifier: identifier,
|
|
138
|
+
})),
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
return config;
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const withIosUserTrackingUsageDescription: ConfigPlugin<
|
|
146
|
+
PluginParameters['userTrackingUsageDescription']
|
|
147
|
+
> = (config, userTrackingUsageDescription) => {
|
|
148
|
+
if (userTrackingUsageDescription === undefined) return config;
|
|
149
|
+
|
|
150
|
+
return withInfoPlist(config, config => {
|
|
151
|
+
config.modResults.NSUserTrackingUsageDescription = userTrackingUsageDescription;
|
|
152
|
+
return config;
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const withReactNativeGoogleMobileAds: ConfigPlugin<PluginParameters> = (
|
|
157
|
+
config,
|
|
158
|
+
{
|
|
159
|
+
androidAppId,
|
|
160
|
+
delayAppMeasurementInit,
|
|
161
|
+
optimizeInitialization,
|
|
162
|
+
optimizeAdLoading,
|
|
163
|
+
iosAppId,
|
|
164
|
+
skAdNetworkItems,
|
|
165
|
+
userTrackingUsageDescription,
|
|
166
|
+
} = {},
|
|
167
|
+
) => {
|
|
168
|
+
if (androidAppId === undefined) {
|
|
169
|
+
console.warn(
|
|
170
|
+
"No 'androidAppId' was provided. The native Google Mobile Ads SDK will crash on Android without it.",
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (iosAppId === undefined) {
|
|
175
|
+
console.warn(
|
|
176
|
+
"No 'iosAppId' was provided. The native Google Mobile Ads SDK will crash on iOS without it.",
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return withPlugins(config, [
|
|
181
|
+
// Android
|
|
182
|
+
[withAndroidAppId, androidAppId],
|
|
183
|
+
[withAndroidAppMeasurementInitDelayed, delayAppMeasurementInit],
|
|
184
|
+
[withAndroidInitializationOptimized, optimizeInitialization],
|
|
185
|
+
[withAndroidAdLoadingOptimized, optimizeAdLoading],
|
|
186
|
+
// iOS
|
|
187
|
+
[withIosAppId, iosAppId],
|
|
188
|
+
[withIosAppMeasurementInitDelayed, delayAppMeasurementInit],
|
|
189
|
+
[withIosSkAdNetworkItems, skAdNetworkItems],
|
|
190
|
+
[withIosUserTrackingUsageDescription, userTrackingUsageDescription],
|
|
191
|
+
]);
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
export default withReactNativeGoogleMobileAds;
|
package/src/ads/BaseAd.tsx
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import React, { useState, useEffect } from 'react';
|
|
20
|
-
import { NativeSyntheticEvent, Platform } from 'react-native';
|
|
20
|
+
import { DimensionValue, NativeSyntheticEvent, Platform } from 'react-native';
|
|
21
21
|
import { isFunction } from '../common';
|
|
22
22
|
import { RevenuePrecisions } from '../common/constants';
|
|
23
23
|
import { NativeError } from '../internal/NativeError';
|
|
@@ -34,7 +34,7 @@ export const BaseAd = React.forwardRef<
|
|
|
34
34
|
React.ElementRef<typeof GoogleMobileAdsBannerView>,
|
|
35
35
|
GAMBannerAdProps
|
|
36
36
|
>(({ unitId, sizes, requestOptions, manualImpressionsEnabled, ...props }, ref) => {
|
|
37
|
-
const [dimensions, setDimensions] = useState<(number |
|
|
37
|
+
const [dimensions, setDimensions] = useState<(number | DimensionValue)[]>([0, 0]);
|
|
38
38
|
|
|
39
39
|
const debouncedSetDimensions = debounce(setDimensions, 100);
|
|
40
40
|
|
|
@@ -157,7 +157,7 @@ export const BaseAd = React.forwardRef<
|
|
|
157
157
|
|
|
158
158
|
const style = sizes.includes(GAMBannerAdSize.FLUID)
|
|
159
159
|
? {
|
|
160
|
-
width: '100%',
|
|
160
|
+
width: '100%' as DimensionValue,
|
|
161
161
|
height: dimensions[1],
|
|
162
162
|
}
|
|
163
163
|
: {
|
|
@@ -32,6 +32,8 @@ interface NativeCommands {
|
|
|
32
32
|
load: (viewRef: React.ElementRef<ComponentType>) => void;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
// SyntaxError "'Commands' is a reserved export and may only be used to export the result of codegenNativeCommands"
|
|
36
|
+
// @ts-ignore -- migration to react-native 0.73+
|
|
35
37
|
export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
|
|
36
38
|
supportedCommands: ['recordManualImpression', 'load'],
|
|
37
39
|
});
|
|
@@ -52,8 +52,11 @@ class GANativeEventEmitter extends NativeEventEmitter {
|
|
|
52
52
|
const originalRemove = subscription.remove;
|
|
53
53
|
const newRemove = () => {
|
|
54
54
|
RNAppModule.eventsRemoveListener(eventType, false);
|
|
55
|
+
// This is for RN <= 0.64 - 65 and greater no longer have removeSubscription
|
|
56
|
+
// @ts-expect-error - "Property 'removeSubscription' does not exist on type 'NativeEventEmitter"
|
|
55
57
|
if (super.removeSubscription != null) {
|
|
56
58
|
// This is for RN <= 0.64 - 65 and greater no longer have removeSubscription
|
|
59
|
+
// @ts-expect-error - "Property 'removeSubscription' does not exist on type 'NativeEventEmitter"
|
|
57
60
|
super.removeSubscription(subscription);
|
|
58
61
|
} else if (originalRemove != null) {
|
|
59
62
|
// This is for RN >= 0.65
|
|
@@ -72,7 +75,11 @@ class GANativeEventEmitter extends NativeEventEmitter {
|
|
|
72
75
|
// This is likely no longer ever called, but it is here for backwards compatibility with RN <= 0.64
|
|
73
76
|
removeSubscription(subscription: EmitterSubscription) {
|
|
74
77
|
RNAppModule.eventsRemoveListener(subscription.eventType.replace('rnapp_', ''), false);
|
|
78
|
+
// This is for RN <= 0.64 - 65 and greater no longer have removeSubscription
|
|
79
|
+
// @ts-expect-error - "Property 'removeSubscription' does not exist on type 'NativeEventEmitter"
|
|
75
80
|
if (super.removeSubscription != null) {
|
|
81
|
+
// This is for RN <= 0.64 - 65 and greater no longer have removeSubscription
|
|
82
|
+
// @ts-expect-error - "Property 'removeSubscription' does not exist on type 'NativeEventEmitter"
|
|
76
83
|
super.removeSubscription(subscription);
|
|
77
84
|
}
|
|
78
85
|
}
|
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
*
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
import Emitter from 'react-native/Libraries/vendor/emitter/EventEmitter';
|
|
20
|
-
import { EventEmitter } from 'react-native';
|
|
18
|
+
import EventEmitter from 'react-native/Libraries/vendor/emitter/EventEmitter';
|
|
21
19
|
|
|
22
|
-
export const SharedEventEmitter: EventEmitter = new
|
|
20
|
+
export const SharedEventEmitter: EventEmitter = new EventEmitter();
|
|
@@ -123,7 +123,7 @@ export interface GAMBannerAdProps extends Omit<BannerAdProps, 'size'> {
|
|
|
123
123
|
*
|
|
124
124
|
* Inventory must be available for the banner sizes specified, otherwise a no-fill error will be sent to `onAdFailedToLoad`.
|
|
125
125
|
*/
|
|
126
|
-
sizes: typeof GAMBannerAdSize[keyof typeof GAMBannerAdSize][] | string[];
|
|
126
|
+
sizes: (typeof GAMBannerAdSize)[keyof typeof GAMBannerAdSize][] | string[];
|
|
127
127
|
|
|
128
128
|
/**
|
|
129
129
|
* Whether to enable the manual impression counting.
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Generated by genversion.
|
|
2
|
-
export const version = '
|
|
2
|
+
export const version = '14.0.0';
|