appodeal / Appodeal-Flutter-Plugin

Official Flutter Plugin that adds Appodeal SDK support to your Flutter application.
https://pub.dev/packages/stack_appodeal_flutter
Apache License 2.0
18 stars 3 forks source link
android appodeal dart flutter ios koltin sdk swift

Appodeal Flutter

Official Appodeal Flutter Plugin for your Flutter application.

Appodeal SDK 3.3.1

Table of Contents

Installation

Add the dependency to the pubspec.yaml file in your project:

dependencies:
  stack_appodeal_flutter: 3.3.1

Install the plugin by running the command below in the terminal:

$ flutter pub get

iOS

[!IMPORTANT]

  • iOS 12.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 14.3 or higher.
  1. Go to ios/ folder and open Podfile
  2. Add Appodeal adapters. Add pods into ./ios/Podfile:
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.1'
  pod 'APDAmazonAdapter', '3.3.1.0'
  pod 'APDAppLovinAdapter', '3.3.1.0'
  pod 'APDAppLovinMAXAdapter', '3.3.1.0'
  pod 'APDBidMachineAdapter', '3.3.1.0'
  pod 'APDBidonAdapter', '3.3.1.0'
  pod 'APDBigoAdsAdapter', '3.3.1.0'
  pod 'APDDTExchangeAdapter', '3.3.1.0'
  pod 'APDGoogleAdMobAdapter', '3.3.1.0'
  pod 'APDIABAdapter', '3.3.1.0'
  pod 'APDInMobiAdapter', '3.3.1.0'
  pod 'APDIronSourceAdapter', '3.3.1.0'
  pod 'APDMetaAudienceNetworkAdapter', '3.3.1.0'
  pod 'APDMintegralAdapter', '3.3.1.0'
  pod 'APDMyTargetAdapter', '3.3.1.0'
  pod 'APDPangleAdapter', '3.3.1.0'
  pod 'APDSentryAdapter', '3.3.1.0'
  pod 'APDUnityAdapter', '3.3.1.0'
  pod 'APDVungleAdapter', '3.3.1.0'
  pod 'APDYandexAdapter', '3.3.1.0'
  pod 'AmazonPublisherServicesSDK', '4.9.2'
  pod 'AppLovinMediationAmazonAdMarketplaceAdapter'
  pod 'AppLovinMediationBidMachineAdapter'
  pod 'AppLovinMediationFacebookAdapter'
  pod 'AppLovinMediationFyberAdapter'
  pod 'AppLovinMediationGoogleAdManagerAdapter'
  pod 'AppLovinMediationGoogleAdapter'
  pod 'AppLovinMediationInMobiAdapter'
  pod 'AppLovinMediationIronSourceAdapter'
  pod 'AppLovinMediationMintegralAdapter', '7.6.1.0.0'
  pod 'AppLovinMediationMyTargetAdapter', '5.20.1.1'
  pod 'AppLovinMediationUnityAdsAdapter'
  pod 'AppLovinMediationVungleAdapter', '7.3.0.0'
  pod 'AppLovinMediationYandexAdapter', '5.2.1.0'
  pod 'BidMachineAmazonAdapter', '2.6.0.1'
  pod 'BidMachineMetaAudienceAdapter', '2.6.0.0'
  pod 'BidMachineMintegralAdapter', '2.6.0.0'
  pod 'BidMachineMyTargetAdapter', '2.6.0.0'
  pod 'BidMachinePangleAdapter', '2.6.0.0'
  pod 'BidMachineVungleAdapter', '2.6.0.0'
  pod 'BidonAdapterAmazon', '0.4.8.0'
  pod 'BidonAdapterAppLovin', '0.4.8.0'
  pod 'BidonAdapterBidMachine', '0.4.8.0'
  pod 'BidonAdapterBigoAds', '0.4.8.0'
  pod 'BidonAdapterDTExchange', '0.4.8.0'
  pod 'BidonAdapterGoogleAdManager', '0.4.8.0'
  pod 'BidonAdapterGoogleMobileAds', '0.4.8.0'
  pod 'BidonAdapterInMobi', '0.4.8.0'
  pod 'BidonAdapterMetaAudienceNetwork', '0.4.8.0'
  pod 'BidonAdapterMintegral', '0.4.8.0'
  pod 'BidonAdapterUnityAds', '0.4.8.0'
  pod 'BidonAdapterVungle', '0.4.8.0'
  pod 'myTrackerSDK', '3.1.7'
end

target 'Runner' do
  use_frameworks!
  use_modular_headers!
  appodeal

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

You can change following implementation to use custom mediation setup. See docs.

Note: Appodeal requires to use use_frameworks!. You need to remove Flipper dependency from Podfile and AppDelegate.

  1. Call pod install
  2. Open .xcworkspace
  3. 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.

There 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:

There is App Transport Security settings in Info.plist format ``` xml NSAppTransportSecurity NSAllowsArbitraryLoads ```
Other feature usage descriptions

To improve ad performance the following entries should be added:

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 ```
  1. 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)

dependencies {
    // ... other project dependencies
    implementation ('com.appodeal.ads:sdk:3.3.1.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)

allprojects {
    repositories {
        ...
        jcenter()
        maven { url "https://artifactory.appodeal.com/appodeal" }
        ...
    }
}

Note: You can change following implementation to use custom mediation setup. See Docs.

  1. Network security configuration

Add the Network Security Configuration file to your AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config">
    </application>
</manifest>

In your network_security_config.xml file, add base-config that sets cleartextTrafficPermitted to true :

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="https://github.com/appodeal/Appodeal-Flutter-Plugin/raw/main/system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">127.0.0.1</domain>
    </domain-config>
</network-security-config>
  1. 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.

Services

Please, read iOS and Android docs at wiki to get deeper understanding how Appodeal SDK Services works.

Adjust

Add dependencies into build.gradle (module: app)

dependencies {
    // ... other project dependencies
    implementation 'com.appodeal.ads.sdk.services:adjust:3.3.1.0'
}

Add dependencies into Podfile

def appodeal
  // ... other project pods
  pod 'APDAdjustAdapter', '3.3.1.0'
end

AppsFlyer

Add dependencies into build.gradle (module: app)

dependencies {
    // ... other project dependencies
  implementation 'com.appodeal.ads.sdk.services:appsflyer:3.3.1.0'
}

Add dependencies into Podfile

def appodeal
  // ... other project pods
  pod 'APDAppsFlyerAdapter', '3.3.1.0'
end

Firebase

Add dependencies into build.gradle (module: app)

dependencies {
    // ... other project dependencies
    implementation 'com.appodeal.ads.sdk.services:firebase:3.3.1.0'
}

Add dependencies into Podfile

def appodeal
  // ... other project pods
  pod 'APDFirebaseAdapter', '3.3.1.0'
end

Meta

Add dependencies into build.gradle (module: app)

dependencies {
    // ... other project dependencies
    implementation 'com.appodeal.ads.sdk.services:facebook_analytics:3.3.1.0'
}

Add dependencies into Podfile

def appodeal
  // ... other project pods
  pod 'APDFacebookAdapter', '3.3.1.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.

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.
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. 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:

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 to get deeper understanding how Appodeal SDK works.

Initialisation

  1. Initialise Appodeal at application launch. To initialize Appodeal SDK use this following method:
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:

  1. Configure SDK

Call this method before initilisation

// 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);
// Set segment filter
Appodeal.setCustomFilter("levels_played", "levelsPlayed");

// Set extras
Appodeal.setExtraData("attribuition_id", "some value");
// 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
// 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
// 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
Appodeal.setBannerCallbacks(
        onBannerLoaded: (isPrecache) => {},
        onBannerFailedToLoad: () => {},
        onBannerShown: () => {},
        onBannerShowFailed: () => {},
        onBannerClicked: () => {},
        onBannerExpired: () => {});
  1. MREC
Appodeal.setMrecCallbacks(
        onMrecLoaded: (isPrecache) => {},
        onMrecFailedToLoad: () => {},
        onMrecShown: () => {},
        onMrecShowFailed: () => {},
        onMrecClicked: () => {},
        onMrecExpired: () => {});
  1. Interstitial
Appodeal.setInterstitialCallbacks(
        onInterstitialLoaded: (isPrecache) => {},
        onInterstitialFailedToLoad: () => {},
        onInterstitialShown: () => {},
        onInterstitialShowFailed: () => {},
        onInterstitialClicked: () => {},
        onInterstitialClosed: () => {},
        onInterstitialExpired: () => {});
  1. Rewarded video
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

Appodeal.cache(AppodealAdType.Interstitial);
  1. Check that ad is loaded and can be shown
// Check that interstitial
var isCanShow = await Appodeal.canShow(AppodealAdType.Interstitial);
// Check that interstitial is loaded
var isLoaded = await Appodeal.isLoaded(AppodealAdType.Interstitial);
  1. Show advertising
// 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”);
  1. Hide

You can hide banner/MREC ad after it was shown. Call hide method with another ad types won't affect anything

Appodeal.hide(AppodealAdType.BannerTop); //AppodealAdType.MREC
  1. Destroy

To free memory from hidden banner/MREC call the code below:

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:

child: AppodealBanner(adSize: AppodealBannerSize.BANNER, placement: "default");

To display a MREC view add widget:

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.

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 to your app’s privacy policy in Google Play and App Store.

To speed up the process, you could use privacy policy generators —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 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 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) Recommendations on Developing a Meaningful Privacy Policy (by Attorney General California Department of Justice)

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.

// Load consent window
Appodeal.ConsentForm.load(
  appKey: exampleAppodealKey,
  onConsentFormLoadSuccess: (status) {},
  onConsentFormLoadFailure: (error) {},
);

// Show consent window
Appodeal.ConsentForm.show(
  onConsentFormDismissed: (error) {},
);
Appodeal.ConsentForm.loadAndShowIfRequired(
  appKey: exampleAppodealKey,
  onConsentFormDismissed: (error) {},
);
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.

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.

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.

<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to deliver personalized ads to you.</string>