https://github.com/appodeal/appodeal-flutter-plugin
Official Flutter Plugin that adds Appodeal SDK support to your Flutter application.
https://github.com/appodeal/appodeal-flutter-plugin
android appodeal dart flutter ios koltin sdk swift
Last synced: 6 months ago
JSON representation
Official Flutter Plugin that adds Appodeal SDK support to your Flutter application.
- Host: GitHub
- URL: https://github.com/appodeal/appodeal-flutter-plugin
- Owner: appodeal
- License: apache-2.0
- Created: 2021-07-26T08:09:44.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2024-10-21T13:26:24.000Z (8 months ago)
- Last Synced: 2024-11-18T04:41:36.090Z (7 months ago)
- Topics: android, appodeal, dart, flutter, ios, koltin, sdk, swift
- Language: Dart
- Homepage: https://pub.dev/packages/stack_appodeal_flutter
- Size: 840 KB
- Stars: 21
- Watchers: 10
- Forks: 3
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Appodeal Flutter
Official Appodeal Flutter Plugin for your Flutter application.
## Appodeal SDK 3.3.3.1
- **Google CMP and TCF v2 Support**
- To enhance the relevance of ads for your users and comply with regulations like GDPR and CCPA,
explicit user consent is required for collecting personal data.
- We recommend using the Stack Consent Manager, built on Google User Messaging Platform (UMP),
as a ready-made solution to obtain user consent.
- Follow this [instruction](https://docs.appodeal.com/advanced/google-cmp-and-tcfv2-support) to
configure Google UMP and set up a consent form.
- If you have questions about Stack Consent Manager and Google UMP, please contact our support team.- **AdMob Bidding Support**
- Download our newest version of AdMob Sync tool from this [page](https://amsa-updates.appodeal.com/) and perform a sync.
- Read more about AdMob Sync in our [guide](https://docs.appodeal.com/networks-setup/admob-sync).- **Already included ready-made consent solution**
- Starting from Appodeal SDK 3.0, during the **first initialization**, a ready-made consent window will be shown if the user is in regions
covered by GDPR and CCPA. [See more about this behavior](#step-2-appodeal-consent-solution)- **Support Monetization + UA + Analytics data services**
- Get insights and find out if your active UA campaigns bring you revenue or make you lose money.
- Track your metrics with Firebase Keywords. Analyze how product A/B test (via Firebase remote config) affects both
your product and monetization. [See more about services](#services)## Table of Contents
- [Installation](#installation)
- [iOS](#ios)
- [Android](#android)
- [Admob configuration](#admob-configuration)
- [Services](#services)
- [Adjust](#adjust)
- [AppsFlyer](#appsflyer)
- [Firebase](#firebase)
- [Meta](#meta)
- [Tracking In-App Purchases](#tracking-in-app-purchases)
- [Event tracking](#event-tracking)
- [Usage](#usage)
- [Initialisation](#initialisation)
- [Callbacks](#callbacks)
- [Presentation](#presentation)
- [Ad View](#ad-view)
- [Privacy Policy and Consent](#privacy-policy-and-consent)
- [Step 1: Update Privacy Policy](#step-1-update-privacy-policy)
- [Step 2: Appodeal Consent Solution](#step-2-appodeal-consent-solution)
- [App-ads.txt](#app-adstxt)
- [App Tracking Transparency](#app-tracking-transparency)
- [Changelog](CHANGELOG.md)## Installation
Add the dependency to the `pubspec.yaml` file in your project:
```yaml
dependencies:
stack_appodeal_flutter: 3.3.3+1
```Install the plugin by running the command below in the terminal:
```
$ flutter pub get
```#### iOS
> [!IMPORTANT]
> - iOS 13.0 or higher. You still can integrate Appodeal SDK into a project with a lower value of minimum iOS version. However, on devices that don't support iOS 12.0+ our SDK will just be disabled.
> - Appodeal SDK is compatible with both ARC and non-ARC projects.
> - Use Xcode 15.3 or higher.1. Go to `ios/` folder and open *Podfile*
2. Add Appodeal adapters. Add pods into `./ios/Podfile`:```ruby
source 'https://cdn.cocoapods.org'
source 'https://github.com/appodeal/CocoaPods.git'
source 'https://github.com/bidon-io/CocoaPods_Specs.git'platform :ios, '13.0'
use_frameworks!
def appodeal
pod 'Appodeal', '3.3.3'
pod 'APDAmazonAdapter', '3.3.3.0'
pod 'APDAppLovinAdapter', '3.3.3.0'
pod 'APDAppLovinMAXAdapter', '3.3.3.0'
pod 'APDBidMachineAdapter', '3.3.3.0'
pod 'APDBidonAdapter', '3.3.3.0'
pod 'APDBigoAdsAdapter', '3.3.3.0'
pod 'APDDTExchangeAdapter', '3.3.3.0'
pod 'APDGoogleAdMobAdapter', '3.3.3.0'
pod 'APDIABAdapter', '3.3.3.0'
pod 'APDInMobiAdapter', '3.3.3.0'
pod 'APDIronSourceAdapter', '3.3.3.0'
pod 'APDMetaAudienceNetworkAdapter', '3.3.3.0'
pod 'APDMintegralAdapter', '3.3.3.0'
pod 'APDMyTargetAdapter', '3.3.3.0'
pod 'APDPangleAdapter', '3.3.3.0'
pod 'APDSentryAdapter', '3.3.3.0'
pod 'APDUnityAdapter', '3.3.3.0'
pod 'APDVungleAdapter', '3.3.3.0'
pod 'APDYandexAdapter', '3.3.3.0'
pod 'AmazonPublisherServicesSDK', '4.9.7'
pod 'AppLovinMediationAmazonAdMarketplaceAdapter', '4.9.7.0'
pod 'AppLovinMediationBidMachineAdapter', '3.0.1.0.0'
pod 'AppLovinMediationFacebookAdapter', '6.15.2.1'
pod 'AppLovinMediationFyberAdapter', '8.3.2.1'
pod 'AppLovinMediationGoogleAdManagerAdapter', '11.9.0.1'
pod 'AppLovinMediationGoogleAdapter', '11.9.0.1'
pod 'AppLovinMediationInMobiAdapter', '10.7.5.1'
pod 'AppLovinMediationIronSourceAdapter', '8.3.0.0.2'
pod 'AppLovinMediationMintegralAdapter', '7.7.2.0.1'
pod 'AppLovinMediationMyTargetAdapter', '5.21.8.0'
pod 'AppLovinMediationUnityAdsAdapter', '4.12.2.1'
pod 'AppLovinMediationVungleAdapter', '7.4.1.1'
pod 'AppLovinMediationYandexAdapter', '5.2.1.0'
pod 'BidMachineAmazonAdapter', '3.0.1.0'
pod 'BidMachineMetaAudienceAdapter', '3.0.1.0'
pod 'BidMachineMintegralAdapter', '3.0.1.0'
pod 'BidMachineMyTargetAdapter', '3.0.1.1'
pod 'BidMachinePangleAdapter', '3.0.1.0'
pod 'BidMachineVungleAdapter', '3.0.1.0'
pod 'BidonAdapterAppLovin', '0.6.1.0'
pod 'BidonAdapterBidMachine', '0.6.1.0'
pod 'BidonAdapterBigoAds', '0.6.1.0'
pod 'BidonAdapterDTExchange', '0.6.1.0'
pod 'BidonAdapterGoogleAdManager', '0.6.1.0'
pod 'BidonAdapterGoogleMobileAds', '0.6.1.0'
pod 'BidonAdapterInMobi', '0.6.1.0'
pod 'BidonAdapterMetaAudienceNetwork', '0.6.1.0'
pod 'BidonAdapterMintegral', '0.6.1.0'
pod 'BidonAdapterUnityAds', '0.6.1.0'
pod 'BidonAdapterVungle', '0.6.1.0'
endtarget 'Runner' do
use_frameworks!
use_modular_headers!
appodealflutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
```You can change following implementation to use custom mediation setup.
See [docs](https://docs.appodeal.com/en/ios/get-started#getstarted-Step1.ImportSDK).> Note: Appodeal requires to use `use_frameworks!`. You need to remove Flipper dependency from Podfile and AppDelegate.
3. Call `pod install`
4. Open `.xcworkspace`
5. Configfure `info.plist`.##### SKAdNetworkIds
Ad networks used in Appodeal mediation support conversion tracking using Apple's `SKAdNetwork`,
which means ad networks are able to attribute an app install even when IDFA is unavailable. To
enable this functionality, you will need to update the `SKAdNetworkItems` key with an additional
dictionary in your `Info.plist`.- Select **Info.plist** in the Project navigator in Xcode
- Right-click on **Info.plist** file → Open as → Source Code
- Copy the **SKAdNetworkItems** from below and paste it into your **Info.plist** fileThere is SKAdNetworks IDs in Info.plist format
```xml
SKAdNetworkItems
SKAdNetworkIdentifier
22mmun2rn5.skadnetwork
SKAdNetworkIdentifier
238da6jt44.skadnetwork
SKAdNetworkIdentifier
24t9a8vw3c.skadnetwork
SKAdNetworkIdentifier
24zw6aqk47.skadnetwork
SKAdNetworkIdentifier
252b5q8x7y.skadnetwork
SKAdNetworkIdentifier
275upjj5gd.skadnetwork
SKAdNetworkIdentifier
294l99pt4k.skadnetwork
SKAdNetworkIdentifier
2fnua5tdw4.skadnetwork
SKAdNetworkIdentifier
2q884k2j68.skadnetwork
SKAdNetworkIdentifier
2rq3zucswp.skadnetwork
SKAdNetworkIdentifier
2tdux39lx8.skadnetwork
SKAdNetworkIdentifier
2u9pt9hc89.skadnetwork
SKAdNetworkIdentifier
32z4fx6l9h.skadnetwork
SKAdNetworkIdentifier
33r6p7g8nc.skadnetwork
SKAdNetworkIdentifier
3cgn6rq224.skadnetwork
SKAdNetworkIdentifier
3l6bd9hu43.skadnetwork
SKAdNetworkIdentifier
3qcr597p9d.skadnetwork
SKAdNetworkIdentifier
3qy4746246.skadnetwork
SKAdNetworkIdentifier
3rd42ekr43.skadnetwork
SKAdNetworkIdentifier
3sh42y64q3.skadnetwork
SKAdNetworkIdentifier
424m5254lk.skadnetwork
SKAdNetworkIdentifier
4468km3ulz.skadnetwork
SKAdNetworkIdentifier
44jx6755aq.skadnetwork
SKAdNetworkIdentifier
44n7hlldy6.skadnetwork
SKAdNetworkIdentifier
47vhws6wlr.skadnetwork
SKAdNetworkIdentifier
488r3q3dtq.skadnetwork
SKAdNetworkIdentifier
4dzt52r2t5.skadnetwork
SKAdNetworkIdentifier
4fzdc2evr5.skadnetwork
SKAdNetworkIdentifier
4mn522wn87.skadnetwork
SKAdNetworkIdentifier
4pfyvq9l8r.skadnetwork
SKAdNetworkIdentifier
4w7y6s5ca2.skadnetwork
SKAdNetworkIdentifier
523jb4fst2.skadnetwork
SKAdNetworkIdentifier
52fl2v3hgk.skadnetwork
SKAdNetworkIdentifier
54nzkqm89y.skadnetwork
SKAdNetworkIdentifier
55644vm79v.skadnetwork
SKAdNetworkIdentifier
577p5t736z.skadnetwork
SKAdNetworkIdentifier
578prtvx9j.skadnetwork
SKAdNetworkIdentifier
5a6flpkh64.skadnetwork
SKAdNetworkIdentifier
5ghnmfs3dh.skadnetwork
SKAdNetworkIdentifier
5l3tpt7t6e.skadnetwork
SKAdNetworkIdentifier
5lm9lj6jb7.skadnetwork
SKAdNetworkIdentifier
5mv394q32t.skadnetwork
SKAdNetworkIdentifier
5tjdwbrq8w.skadnetwork
SKAdNetworkIdentifier
627r9wr2y5.skadnetwork
SKAdNetworkIdentifier
633vhxswh4.skadnetwork
SKAdNetworkIdentifier
67369282zy.skadnetwork
SKAdNetworkIdentifier
6964rsfnh4.skadnetwork
SKAdNetworkIdentifier
6g9af3uyq4.skadnetwork
SKAdNetworkIdentifier
6p4ks3rnbw.skadnetwork
SKAdNetworkIdentifier
6qx585k4p6.skadnetwork
SKAdNetworkIdentifier
6rd35atwn8.skadnetwork
SKAdNetworkIdentifier
6v7lgmsu45.skadnetwork
SKAdNetworkIdentifier
6xzpu9s2p8.skadnetwork
SKAdNetworkIdentifier
6yxyv74ff7.skadnetwork
SKAdNetworkIdentifier
737z793b9f.skadnetwork
SKAdNetworkIdentifier
74b6s63p6l.skadnetwork
SKAdNetworkIdentifier
7953jerfzd.skadnetwork
SKAdNetworkIdentifier
79pbpufp6p.skadnetwork
SKAdNetworkIdentifier
79w64w269u.skadnetwork
SKAdNetworkIdentifier
7bxrt786m8.skadnetwork
SKAdNetworkIdentifier
7fbxrn65az.skadnetwork
SKAdNetworkIdentifier
7fmhfwg9en.skadnetwork
SKAdNetworkIdentifier
7k3cvf297u.skadnetwork
SKAdNetworkIdentifier
7rz58n8ntl.skadnetwork
SKAdNetworkIdentifier
7tnzynbdc7.skadnetwork
SKAdNetworkIdentifier
7ug5zh24hu.skadnetwork
SKAdNetworkIdentifier
84993kbrcf.skadnetwork
SKAdNetworkIdentifier
866k9ut3g3.skadnetwork
SKAdNetworkIdentifier
88k8774x49.skadnetwork
SKAdNetworkIdentifier
899vrgt9g8.skadnetwork
SKAdNetworkIdentifier
89z7zv988g.skadnetwork
SKAdNetworkIdentifier
8c4e2ghe7u.skadnetwork
SKAdNetworkIdentifier
8m87ys6875.skadnetwork
SKAdNetworkIdentifier
8qiegk9qfv.skadnetwork
SKAdNetworkIdentifier
8r8llnkz5a.skadnetwork
SKAdNetworkIdentifier
8s468mfl3y.skadnetwork
SKAdNetworkIdentifier
8w3np9l82g.skadnetwork
SKAdNetworkIdentifier
97r2b46745.skadnetwork
SKAdNetworkIdentifier
9b89h5y424.skadnetwork
SKAdNetworkIdentifier
9g2aggbj52.skadnetwork
SKAdNetworkIdentifier
9nlqeag3gk.skadnetwork
SKAdNetworkIdentifier
9rd848q2bz.skadnetwork
SKAdNetworkIdentifier
9t245vhmpl.skadnetwork
SKAdNetworkIdentifier
9vvzujtq5s.skadnetwork
SKAdNetworkIdentifier
9wsyqb3ku7.skadnetwork
SKAdNetworkIdentifier
9yg77x724h.skadnetwork
SKAdNetworkIdentifier
a2p9lx4jpn.skadnetwork
SKAdNetworkIdentifier
a7xqa6mtl2.skadnetwork
SKAdNetworkIdentifier
a8cz6cu7e5.skadnetwork
SKAdNetworkIdentifier
au67k4efj4.skadnetwork
SKAdNetworkIdentifier
av6w8kgt66.skadnetwork
SKAdNetworkIdentifier
axh5283zss.skadnetwork
SKAdNetworkIdentifier
b55w3d8y8z.skadnetwork
SKAdNetworkIdentifier
b9bk5wbcq9.skadnetwork
SKAdNetworkIdentifier
bvpn9ufa9b.skadnetwork
SKAdNetworkIdentifier
bxvub5ada5.skadnetwork
SKAdNetworkIdentifier
c3frkrj4fj.skadnetwork
SKAdNetworkIdentifier
c6k4g5qg8m.skadnetwork
SKAdNetworkIdentifier
c7g47wypnu.skadnetwork
SKAdNetworkIdentifier
cad8qz2s3j.skadnetwork
SKAdNetworkIdentifier
ce8ybjwass.skadnetwork
SKAdNetworkIdentifier
cg4yq2srnc.skadnetwork
SKAdNetworkIdentifier
cj5566h2ga.skadnetwork
SKAdNetworkIdentifier
cp8zw746q7.skadnetwork
SKAdNetworkIdentifier
cs644xg564.skadnetwork
SKAdNetworkIdentifier
cstr6suwn9.skadnetwork
SKAdNetworkIdentifier
d7g9azk84q.skadnetwork
SKAdNetworkIdentifier
dbu4b84rxf.skadnetwork
SKAdNetworkIdentifier
dd3a75yxkv.skadnetwork
SKAdNetworkIdentifier
dkc879ngq3.skadnetwork
SKAdNetworkIdentifier
dmv22haz9p.skadnetwork
SKAdNetworkIdentifier
dn942472g5.skadnetwork
SKAdNetworkIdentifier
dr774724x4.skadnetwork
SKAdNetworkIdentifier
dt3cjx1a9i.skadnetwork
SKAdNetworkIdentifier
dticjx1a9i.skadnetwork
SKAdNetworkIdentifier
dzg6xy7pwj.skadnetwork
SKAdNetworkIdentifier
e5fvkxwrpn.skadnetwork
SKAdNetworkIdentifier
ecpz2srf59.skadnetwork
SKAdNetworkIdentifier
eh6m2bh4zr.skadnetwork
SKAdNetworkIdentifier
ejvt5qm6ak.skadnetwork
SKAdNetworkIdentifier
eqhxz8m8av.skadnetwork
SKAdNetworkIdentifier
f38h382jlk.skadnetwork
SKAdNetworkIdentifier
f73kdq92p3.skadnetwork
SKAdNetworkIdentifier
f7s53z58qe.skadnetwork
SKAdNetworkIdentifier
feyaarzu9v.skadnetwork
SKAdNetworkIdentifier
fkak3gfpt6.skadnetwork
SKAdNetworkIdentifier
fz2k2k5tej.skadnetwork
SKAdNetworkIdentifier
g28c52eehv.skadnetwork
SKAdNetworkIdentifier
g2y4y55b64.skadnetwork
SKAdNetworkIdentifier
g69uk9uh2b.skadnetwork
SKAdNetworkIdentifier
g6gcrrvk4p.skadnetwork
SKAdNetworkIdentifier
gfat3222tu.skadnetwork
SKAdNetworkIdentifier
ggvn48r87g.skadnetwork
SKAdNetworkIdentifier
glqzh8vgby.skadnetwork
SKAdNetworkIdentifier
gta8lk7p23.skadnetwork
SKAdNetworkIdentifier
gta9lk7p23.skadnetwork
SKAdNetworkIdentifier
gvmwg8q7h5.skadnetwork
SKAdNetworkIdentifier
h5jmj969g5.skadnetwork
SKAdNetworkIdentifier
h65wbv5k3f.skadnetwork
SKAdNetworkIdentifier
h8vml93bkz.skadnetwork
SKAdNetworkIdentifier
hb56zgv37p.skadnetwork
SKAdNetworkIdentifier
hdw39hrw9y.skadnetwork
SKAdNetworkIdentifier
hjevpa356n.skadnetwork
SKAdNetworkIdentifier
hs6bdukanm.skadnetwork
SKAdNetworkIdentifier
jb7bn6koa5.skadnetwork
SKAdNetworkIdentifier
jk2fsx2rgz.skadnetwork
SKAdNetworkIdentifier
k674qkevps.skadnetwork
SKAdNetworkIdentifier
k6y4y55b64.skadnetwork
SKAdNetworkIdentifier
kbd757ywx3.skadnetwork
SKAdNetworkIdentifier
kbmxgpxpgc.skadnetwork
SKAdNetworkIdentifier
klf5c3l5u5.skadnetwork
SKAdNetworkIdentifier
krvm3zuq6h.skadnetwork
SKAdNetworkIdentifier
l6nv3x923s.skadnetwork
SKAdNetworkIdentifier
l93v5h6a4m.skadnetwork
SKAdNetworkIdentifier
ln5gz23vtd.skadnetwork
SKAdNetworkIdentifier
lr83yxwka7.skadnetwork
SKAdNetworkIdentifier
ludvb6z3bs.skadnetwork
SKAdNetworkIdentifier
m297p6643m.skadnetwork
SKAdNetworkIdentifier
m5mvw97r93.skadnetwork
SKAdNetworkIdentifier
m8dbw4sv7c.skadnetwork
SKAdNetworkIdentifier
mj797d8u6f.skadnetwork
SKAdNetworkIdentifier
mlmmfzh3r3.skadnetwork
SKAdNetworkIdentifier
mls7yz5dvl.skadnetwork
SKAdNetworkIdentifier
mp6xlyr22a.skadnetwork
SKAdNetworkIdentifier
mqn7fxpca7.skadnetwork
SKAdNetworkIdentifier
mtkv5xtk9e.skadnetwork
SKAdNetworkIdentifier
n38lu8286q.skadnetwork
SKAdNetworkIdentifier
n66cz3y3bx.skadnetwork
SKAdNetworkIdentifier
n6fk4nfna4.skadnetwork
SKAdNetworkIdentifier
n9x2a789qt.skadnetwork
SKAdNetworkIdentifier
nfqy3847ph.skadnetwork
SKAdNetworkIdentifier
nrt9jy4kw9.skadnetwork
SKAdNetworkIdentifier
nu4557a4je.skadnetwork
SKAdNetworkIdentifier
nzq8sh4pbs.skadnetwork
SKAdNetworkIdentifier
p78axxw29g.skadnetwork
SKAdNetworkIdentifier
pd25vrrwzn.skadnetwork
SKAdNetworkIdentifier
ppxm28t8ap.skadnetwork
SKAdNetworkIdentifier
prcb7njmu6.skadnetwork
SKAdNetworkIdentifier
pu4na253f3.skadnetwork
SKAdNetworkIdentifier
pwa73g5rt2.skadnetwork
SKAdNetworkIdentifier
pwdxu55a5a.skadnetwork
SKAdNetworkIdentifier
qlbq5gtkt8.skadnetwork
SKAdNetworkIdentifier
qqp299437r.skadnetwork
SKAdNetworkIdentifier
qu637u8glc.skadnetwork
SKAdNetworkIdentifier
r26jy69rpl.skadnetwork
SKAdNetworkIdentifier
r45fhb6rf7.skadnetwork
SKAdNetworkIdentifier
r8lj5b58b5.skadnetwork
SKAdNetworkIdentifier
rvh3l7un93.skadnetwork
SKAdNetworkIdentifier
rx5hdcabgc.skadnetwork
SKAdNetworkIdentifier
s39g8k73mm.skadnetwork
SKAdNetworkIdentifier
s69wq72ugq.skadnetwork
SKAdNetworkIdentifier
sczv5946wb.skadnetwork
SKAdNetworkIdentifier
su67r6k2v3.skadnetwork
SKAdNetworkIdentifier
t38b2kh725.skadnetwork
SKAdNetworkIdentifier
t3b3f7n3x8.skadnetwork
SKAdNetworkIdentifier
t6d3zquu66.skadnetwork
SKAdNetworkIdentifier
t7ky8fmwkd.skadnetwork
SKAdNetworkIdentifier
tl55sbb4fm.skadnetwork
SKAdNetworkIdentifier
tmhh9296z4.skadnetwork
SKAdNetworkIdentifier
tvvz7th9br.skadnetwork
SKAdNetworkIdentifier
u679fj5vs4.skadnetwork
SKAdNetworkIdentifier
uw77j35x4d.skadnetwork
SKAdNetworkIdentifier
uzqba5354d.skadnetwork
SKAdNetworkIdentifier
v4nxqhlyqp.skadnetwork
SKAdNetworkIdentifier
v72qych5uu.skadnetwork
SKAdNetworkIdentifier
v7896pgt74.skadnetwork
SKAdNetworkIdentifier
v79kvwwj4g.skadnetwork
SKAdNetworkIdentifier
v9wttpbfk9.skadnetwork
SKAdNetworkIdentifier
vc83br9sjg.skadnetwork
SKAdNetworkIdentifier
vcra2ehyfk.skadnetwork
SKAdNetworkIdentifier
vhf287vqwu.skadnetwork
SKAdNetworkIdentifier
vutu7akeur.skadnetwork
SKAdNetworkIdentifier
w28pnjg2k4.skadnetwork
SKAdNetworkIdentifier
w9q455wk68.skadnetwork
SKAdNetworkIdentifier
wg4vff78zm.skadnetwork
SKAdNetworkIdentifier
wzmmz9fp6w.skadnetwork
SKAdNetworkIdentifier
x2jnk7ly8j.skadnetwork
SKAdNetworkIdentifier
x44k69ngh6.skadnetwork
SKAdNetworkIdentifier
x5854y7y24.skadnetwork
SKAdNetworkIdentifier
x5l83yy675.skadnetwork
SKAdNetworkIdentifier
x8jxxk4ff5.skadnetwork
SKAdNetworkIdentifier
x8uqf25wch.skadnetwork
SKAdNetworkIdentifier
xga6mpmplv.skadnetwork
SKAdNetworkIdentifier
xmn954pzmp.skadnetwork
SKAdNetworkIdentifier
xx9sdjej2w.skadnetwork
SKAdNetworkIdentifier
xy9t38ct57.skadnetwork
SKAdNetworkIdentifier
y45688jllp.skadnetwork
SKAdNetworkIdentifier
y5ghdn5j9k.skadnetwork
SKAdNetworkIdentifier
y755zyxw56.skadnetwork
SKAdNetworkIdentifier
yclnxrl5pm.skadnetwork
SKAdNetworkIdentifier
ydx93a7ass.skadnetwork
SKAdNetworkIdentifier
yrqqpx2mcb.skadnetwork
SKAdNetworkIdentifier
z24wtl6j62.skadnetwork
SKAdNetworkIdentifier
z4gj7hsk7h.skadnetwork
SKAdNetworkIdentifier
z5b3gh5ugf.skadnetwork
SKAdNetworkIdentifier
z959bm4gru.skadnetwork
SKAdNetworkIdentifier
zh3b7bxvad.skadnetwork
SKAdNetworkIdentifier
zmvfpc5aq8.skadnetwork
SKAdNetworkIdentifier
zq492l623r.skadnetwork
```
##### App Transport Security
In order to serve ads, the SDK requires you to allow arbitrary loads. Set up the following keys
in `Info.plist` of your app:- Go to your **Info.plist** file, then press Add+ anywhere in the first column of the key list.
- Add **App Transport Security Settings** key and set its type to **Dictionary** in the second
column.
- Press **Add+** at the end of the name **App Transport Security Settings** key and choose **Allow
Arbitrary loads**. Set its type to **Boolean** and its value to **Yes**.There is App Transport Security settings in Info.plist format
``` xml
NSAppTransportSecurityNSAllowsArbitraryLoads
```
##### Other feature usage descriptions
To improve ad performance the following entries should be added:
- **NSUserTrackingUsageDescription** - Starting from iOS 14, using IDFA requires permission from the user. The following
entry must be added in order to improve ad performance.
- **NSLocationWhenInUseUsageDescription** - Entry is required if your application allows Appodeal SDK to use location
data.
- **NSCalendarsUsageDescription** - Recommended by some ad networks.There is Other feature usage descriptions settings in Info.plist format
``` xml
NSUserTrackingUsageDescription
needs your advertising identifier to provide personalised advertising experience tailored to you
NSLocationWhenInUseUsageDescription
needs your location for analytics and advertising purposes
NSCalendarsUsageDescription
needs your calendar to provide personalised advertising experience tailored to you
```6. Build your project
#### Android
> [!IMPORTANT]
> - Android API level 21 (Android OS 5.0) or higher.1. Add Appodeal adapters.
Add dependencies into `build.gradle` (module: app)
``` groovy
dependencies {
// ... other project dependencies
implementation ('com.appodeal.ads:sdk:3.3.3.0') {
exclude group: 'com.appodeal.ads.sdk.services', module: 'adjust'
exclude group: 'com.appodeal.ads.sdk.services', module: 'appsflyer'
exclude group: 'com.appodeal.ads.sdk.services', module: 'firebase'
exclude group: 'com.appodeal.ads.sdk.services', module: 'facebook_analytics'
}
...
}
```Add repository into `build.gradle` (module: project)
``` groovy
allprojects {
repositories {
...
jcenter()
maven { url "https://artifactory.appodeal.com/appodeal" }
...
}
}
```> Note: You can change following implementation to use custom mediation setup.
> See [Docs](https://docs.appodeal.com/en/android/get-started#getstarted-ImportSDK).2. Network security configuration
Add the Network Security Configuration file to your AndroidManifest.xml:
``` xml
```
In your *network_security_config.xml* file, add `base-config` that sets `cleartextTrafficPermitted` to `true` :
``` xml
127.0.0.1
```
3. Build your project
#### Admob configuration
> [!WARNING]
> Admob Bidding is now available since Appodeal SDK 3.2.0.\
> Don't forget to download our newest version of Admob Sync tool from this page and perform sync.\
> You can read more about Admob Sync in
> our [guide](https://docs.appodeal.com/networks-setup/admob-sync).- **How to add Admob Ad Network to your project:**
Add your AdMob app id to `meta-data` tag:
```xml
```Add your AdMob app id to `Info.plist`.
Use the key *GADApplicationIdentifier* with the value being your AdMob app ID:```xml
GADApplicationIdentifier
YOUR_ADMOB_APP_ID
```- **How to remove Admob Ad Network from your project:**
Change next dependencies into `build.gradle` (module: app)
```groovy
dependencies {
...
// ... other project dependencies
implementation('com.appodeal.ads:sdk:3.3.3.0') {
// ad networks
exclude group: "com.appodeal.ads.sdk.networks", module: "admob"
exclude group: "org.bidon", module: "admob-adapter"
exclude group: "org.bidon", module: "gam-adapter"
exclude group: "com.applovin.mediation", module: "google-adapter"
exclude group: "com.applovin.mediation", module: "google-ad-manager-adapter"
// services
exclude group: 'com.appodeal.ads.sdk.services', module: 'adjust'
exclude group: 'com.appodeal.ads.sdk.services', module: 'appsflyer'
exclude group: 'com.appodeal.ads.sdk.services', module: 'firebase'
exclude group: 'com.appodeal.ads.sdk.services', module: 'facebook_analytics'
}
...
}
```Remove next pods from `Podfile`:
```ruby
pod 'APDGoogleAdMobAdapter', '3.3.3.0'
pod 'BidonAdapterGoogleAdManager', '0.6.1.0'
pod 'BidonAdapterGoogleMobileAds', '0.6.1.0'
pod 'AppLovinMediationGoogleAdManagerAdapter', '11.9.0.1'
pod 'AppLovinMediationGoogleAdapter', '11.9.0.1'
```## Services
Please, read iOS and Android docs at [wiki](https://docs.appodeal.com/) to get deeper understanding how
Appodeal SDK Services works.#### Adjust
Add dependencies into build.gradle (module: app)
```groovy
dependencies {
// ... other project dependencies
implementation 'com.appodeal.ads.sdk.services:adjust:3.3.3.0'
}
```Add dependencies into _Podfile_
```ruby
def appodeal
// ... other project pods
pod 'APDAdjustAdapter', '3.3.3.0'
end
```#### AppsFlyer
Add dependencies into build.gradle (module: app)
```groovy
dependencies {
// ... other project dependencies
implementation 'com.appodeal.ads.sdk.services:appsflyer:3.3.3.0'
}
```Add dependencies into _Podfile_
```ruby
def appodeal
// ... other project pods
pod 'APDAppsFlyerAdapter', '3.3.3.0'
end
```#### Firebase
Add dependencies into build.gradle (module: app)
```groovy
dependencies {
// ... other project dependencies
implementation 'com.appodeal.ads.sdk.services:firebase:3.3.3.0'
}
```Add dependencies into _Podfile_
```ruby
def appodeal
// ... other project pods
pod 'APDFirebaseAdapter', '3.3.3.0'
end
```#### Meta
Add dependencies into build.gradle (module: app)
```groovy
dependencies {
// ... other project dependencies
implementation 'com.appodeal.ads.sdk.services:facebook_analytics:3.3.3.0'
}
```Add dependencies into _Podfile_
```ruby
def appodeal
// ... other project pods
pod 'APDFacebookAdapter', '3.3.3.0'
end
```##### Tracking In-App Purchases
> Note: In-App purchase tracking will work only with connection with Adjust/Appsflyer.
It's possible to track in-app purchase information and send info to Appodeal servers for analytics. It allows to group
users by the fact of purchasing in-apps. This will help you to adjust the ads for such users or simply turn it off, if
needed. To make this setting work correctly, please submit the purchase info via the Appodeal SDK.* For App Store:
```dart
final purchase = AppodealAppStorePurchase.nonConsumable(
orderId: orderId,
price: price,
currency: currency,
transactionId: transactionId,
additionalParameters: {});
Appodeal.validateInAppPurchase(
purchase: purchase,
onInAppPurchaseValidateSuccess: (purchase, errors) {},
onInAppPurchaseValidateFail: (purchase, errors) {});
```| Parameter | Description | Usage |
|----------------------|--------------------------------------------------------|---------------------------|
| orderId | Product purchased unique order id for the transaction. | Adjust/AppsFlyer |
| price | In-app event revenue. | Adjust/AppsFlyer/Appodeal |
| currency | In-app event currency. | Adjust/AppsFlyer/Appodeal |
| transactionId | Product purchased transaction id. | Adjust/AppsFlyer |
| additionalParameters | Additional parameters of the in-app event. | |* For Play Store:
```dart
final purchase = AppodealPlayStorePurchase.inapp(
orderId: orderId,
price: price,
currency: currency,
additionalParameters: {})
..sku = sku
..publicKey = publicKey
..signature = signature
..purchaseData = purchaseData
..purchaseToken = purchaseToken
..purchaseTimestamp = purchaseTimestamp
..developerPayload = developerPayload
Appodeal.validateInAppPurchase(
purchase: purchase,
onInAppPurchaseValidateSuccess: (purchase, errors) {},
onInAppPurchaseValidateFail: (purchase, errors) {});
```| Parameter | Description | Usage |
|----------------------|--------------------------------------------------------------------------------------------------------------------|---------------------------|
| purchaseType | Purchase type. Must be InAppPurchase.Type.InApp or InAppPurchase.Type.Subs | Adjust/AppsFlyer |
| publicKey | [Public key from Google Developer Console.](https://support.google.com/googleplay/android-developer/answer/186113) | AppsFlyer |
| signature | Transaction signature (returned from Google API when the purchase is completed). | Adjust/AppsFlyer |
| purchaseData | Product purchased in JSON format (returned from Google API when the purchase is completed). | AppsFlyer |
| purchaseToken | Product purchased token (returned from Google API when the purchase is completed). | Adjust |
| purchaseTimestamp | Product purchased timestamp (returned from Google API when the purchase is completed). | Adjust |
| developerPayload | Product purchased developer payload (returned from Google API when the purchase is completed). | Adjust ||
| orderId | Product purchased unique order id for the transaction (returned from Google API when the purchase is completed). | Adjust |
| sku | Stock keeping unit id. | Adjust |
| price | In-app event revenue. | Adjust/AppsFlyer/Appodeal |
| currency | In-app event currency. | Adjust/AppsFlyer/Appodeal |
| additionalParameters | Additional parameters of the in-app event. | |##### Event tracking
Appodeal SDK allows you to send events to analytic services such as Firebase, AppsFlyer, Adjust and Meta using a single
method:```dart
Appodeal.logEvent("example_event_name", {
"example_param_1": "example_param_value_1",
"example_param_2": 123
});
```## Usage
Please, read iOS and Android docs at [wiki](https://docs.appodeal.com/) to get deeper understanding how
Appodeal SDK works.### Initialisation
1. Initialise Appodeal at application launch. To initialize Appodeal SDK use this following method:
```dart
Appodeal.initialize(
appKey: "YOUR_APPODEAL_APP_KEY",
adTypes: [
AppodealAdType.Interstitial,
AppodealAdType.RewardedVideo,
AppodealAdType.Banner,
AppodealAdType.MREC
],
onInitializationFinished: (errors) => {});
```> Note: Make sure to replace "YOUR_APPODEAL_APP_KEY" with the actual app key.
Use the type codes below to set the preferred ad format:
- `AppodealAdType.Interstitial` for interstitial.
- `AppodealAdType.RewardedVideo` for rewarded videos.
- `AppodealAdType.Banner` for banners.
- `AppodealAdType.MREC` for 300*250 banners.2. Configure SDK
* General configuration
> Call this method before initilisation
``` dart
// Set ad auto caching enabled or disabled
// By default autocache is enabled for all ad types
Appodeal.setAutoCache(AppodealAdType.Interstitial, false); //default - true// Set testing mode
Appodeal.setTesting(false); //default - false// Set Appodeal SDK logging level
Appodeal.setLogLevel(Appodeal.LogLevelVerbose); //default - Appodeal.LogLevelNone// Enable or disable child direct threatment
Appodeal.setChildDirectedTreatment(false); //default - false// Disable network for specific ad type
Appodeal.disableNetwork("admob");
Appodeal.disableNetwork("admob", AppodealAdType.Interstitial);
```* Segments and targeting.
``` dart
// Set segment filter
Appodeal.setCustomFilter("levels_played", "levelsPlayed");// Set extras
Appodeal.setExtraData("attribuition_id", "some value");
```* Banner specific
``` dart
// Enable or disable tablet banners.
// SUPORTED ONLY FOR NON-VIEW DISPLAYING
// THIS METHOD DOES NOT WORK CORRECTLY FOR BANNER VIEW BECAUSE BANNER VIEW DOES NOT SUPPORT TABLET FORMAT
Appodeal.setTabletBanners(false); //default - false// Enable or disable smart banners.
// SUPORTED ONLY FOR NON-VIEW DISPLAYING
// iOS smart banners are supported only for applications where autorotation is disabled
Appodeal.setSmartBanners(false); //default - false// Enable or disable banner refresh animation
Appodeal.setBannerAnimation(true); //default - true
```* Android specific
``` dart
// Mute calls if calls muted on Android
Appodeal.muteVideosIfCallsMuted(bool); //default - false// Enable or disable banner auto resume screen.
// SUPORTED ONLY FOR NON-VIEW DISPLAYING
Appodeal.setAdViewAutoResume(true); //default - true
```* Ad revenue information
```dart
// If you want to get revenue information you can use request callback.
// Called every time when SDK receives a revenue information for an ad.
Appodeal.setAdRevenueCallbacks(onAdRevenueReceive: (adRevenue) => {});
```### Callbacks
Set callbacks listener to get track of ad lifecycle events.
1. Banner
```dart
Appodeal.setBannerCallbacks(
onBannerLoaded: (isPrecache) => {},
onBannerFailedToLoad: () => {},
onBannerShown: () => {},
onBannerShowFailed: () => {},
onBannerClicked: () => {},
onBannerExpired: () => {});
```2. MREC
```dart
Appodeal.setMrecCallbacks(
onMrecLoaded: (isPrecache) => {},
onMrecFailedToLoad: () => {},
onMrecShown: () => {},
onMrecShowFailed: () => {},
onMrecClicked: () => {},
onMrecExpired: () => {});
```3. Interstitial
```dart
Appodeal.setInterstitialCallbacks(
onInterstitialLoaded: (isPrecache) => {},
onInterstitialFailedToLoad: () => {},
onInterstitialShown: () => {},
onInterstitialShowFailed: () => {},
onInterstitialClicked: () => {},
onInterstitialClosed: () => {},
onInterstitialExpired: () => {});
```4. Rewarded video
```dart
Appodeal.setRewardedVideoCallbacks(
onRewardedVideoLoaded: (isPrecache) => {},
onRewardedVideoFailedToLoad: () => {},
onRewardedVideoShown: () => {},
onRewardedVideoShowFailed: () => {},
onRewardedVideoFinished: (amount, reward) => {},
onRewardedVideoClosed: (isFinished) => {},
onRewardedVideoExpired: () => {},
onRewardedVideoClicked: () => {});
```### Presentation
> Note: All presentation specific methods are available only after SDK initialisation
1. Caching
If you disable autocache you should call `cache` method before trying to show any ad
``` dart
Appodeal.cache(AppodealAdType.Interstitial);
```2. Check that ad is loaded and can be shown
``` dart
// Check that interstitial
var isCanShow = await Appodeal.canShow(AppodealAdType.Interstitial);
// Check that interstitial is loaded
var isLoaded = await Appodeal.isLoaded(AppodealAdType.Interstitial);
```3. Show advertising
``` dart
// Show interstitial
Appodeal.show(AppodealAdType.Interstitial);// Show banner
Appodeal.show(AppodealAdType.BannerBottom); // Display banner at the bottom of the screen
Appodeal.show(AppodealAdType.BannerTop); // Display banner at the top of the screen
Appodeal.show(AppodealAdType.BannerLeft); // Display banner at the left of the screen
Appodeal.show(AppodealAdType.BannerRight); // Display banner at the right of the screen// Show interstitial for specific pacement
Appodeal.show(AppodealAdType.Interstitial, “placementName”);
```4. Hide
You can hide banner/MREC ad after it was shown. Call `hide` method with another ad types won't affect anything
``` dart
Appodeal.hide(AppodealAdType.BannerTop); //AppodealAdType.MREC
```5. Destroy
To free memory from hidden banner/MREC call the code below:
```dart
Appodeal.destroy(AppodealAdType.Banner); //AppodealAdType.MREC
```## Ad View
**Display banner/MREC ad view at a custom position**
> Note: Ad View presentation support only fixed banners size - `320x50` and `300x250`.
To display a Banner view add widget:
```dart
child: AppodealBanner(adSize: AppodealBannerSize.BANNER, placement: "default");
```To display a MREC view add widget:
```dart
child: AppodealBanner(adSize: AppodealBannerSize.MEDIUM_RECTANGLE, placement: "default");
```## Privacy Policy and Consent
> Note: Keep in mind that it’s best to contact qualified legal professionals, if you haven’t done so already, to get
> more information and be well-prepared for compliance.The General Data Protection Regulation, better known as GDPR, took effect on May 25, 2018. It’s a set of rules designed
to give EU citizens more control over their personal data. Any businesses established in the EU or with users based in
Europe are required to comply with GDPR or risk facing heavy fines. The California Consumer Privacy Act (CCPA) went into
effect on January 1, 2020. **We have put together some resources below to help publishers understand better the steps
they need to take to be GDPR compliant.**> Note: You can learn more about GDPR and CCPA and their.
> differences [here](https://iapp.org/resources/article/ccpa-and-gdpr-comparison-chart/).### Step 1: Update Privacy Policy
**1.1 Make sure your privacy policy includes information about advertising ID collection.**
Don’t forget to add information about IP address and advertising ID collection, as well
as [the link to Appodeal’s privacy policy](https://www.appodeal.com/privacy-policy) to your app’s privacy policy in
Google Play and App Store.To speed up the process, you could
use [privacy policy generators](https://app-privacy-policy-generator.firebaseapp.com/) —just insert advertising ID, IP
address, and location (if you collect a user’ location) in the "Personally Identifiable Information you collect" field (
in line with other information about your app)
and [the link to Appodeal’s privacy policy](https://www.appodeal.com/privacy-policy) in "Link to the privacy policy of
third party service providers used by the app".**1.2 Add a privacy policy to your mobile app.**
You must add your explicit privacy policies in two places: your app’s Store Listing page and within your app.You can find detailed instructions on adding your privacy policy to your app on legal service websites. For example,
Iubenda, the solution tailored to legal compliance, provides
a [comprehensive guide](https://www.iubenda.com/blog/privacy-policy-for-android-app/) on including a privacy policy in
your app.Make sure that your privacy policy website has an SSL-certificate—this point might seem to be obvious, but it’s still
essential.Here’s are two useful resources that you can utilize while working on your app compliance:
[Privacy, Security and Deception regulations (by Google Play)](https://play.google.com/intl/en-GB_ALL/about/privacy-security-deception/user-data/)
[Recommendations on Developing a Meaningful Privacy Policy (by Attorney General California Department of Justice)](https://oag.ca.gov/sites/all/files/agweb/pdfs/cybersecurity/making_your_privacy_practices_public.pdf)> Note: Please note that although we’re always eager to back you up with valuable information, we’re not authorized to
> provide any legal advice. It’s important to address your questions to lawyers who work specifically in this area.### Step 2: Appodeal Consent Solution
In order for Appodeal and our ad providers to deliver ads that are more relevant to your users, as a
mobile app publisher, you need to collect explicit user consent in the regions covered by GDPR and
CCPA.To get consent for collecting personal data of your users, we suggest you use a ready-made
solution - Stack Consent Manager based on Google User Messaging Platform (UMP).> [!IMPORTANT]
> STARTING FROM APPODEAL SDK 3.0, STACK CONSENT MANAGER IS INCLUDED BY DEFAULT.
> Consent will be requested automatically on SDK initialization, and consent form will be shown if it is necessary without any additional calls.**If you wish, you can manage and update consent manually using Stack Consent Manager calls.**
- Force Present Consent Form
```dart
// Load consent window
Appodeal.ConsentForm.load(
appKey: exampleAppodealKey,
onConsentFormLoadSuccess: (status) {},
onConsentFormLoadFailure: (error) {},
);// Show consent window
Appodeal.ConsentForm.show(
onConsentFormDismissed: (error) {},
);
```- Force Present Consent Form only when consent is required
```dart
Appodeal.ConsentForm.loadAndShowIfRequired(
appKey: exampleAppodealKey,
onConsentFormDismissed: (error) {},
);
```- Revoke Consent
```dart
Appodeal.ConsentForm.revoke();
```## App-ads.txt
The app-ads.txt file is a text file which provides a mechanism for publishers to declare their authorized digital sellers.
You can find detailed information [here](https://docs.appodeal.com/advanced/app-ads).
## App Tracking Transparency
Starting in iOS 14.5, IDFA will be unavailable until an app calls the App Tracking Transparency
framework to present the app-tracking authorization request to the end-user. If an app does not
present this request, the IDFA will automatically be zeroed out, which may lead to a significant
loss in ad revenue.You can read more about App Tracking Transparency in our [guide](https://docs.appodeal.com/ios/next/data-protection/app-tracking-transparency).
To display the App Tracking Transparency authorization request for accessing the IDFA, update your
`Info.plist` to add the *NSUserTrackingUsageDescription* key with a custom message describing the usage.```
NSUserTrackingUsageDescription
This identifier will be used to deliver personalized ads to you.
```