{"id":23080825,"url":"https://github.com/appodeal/appodeal-flutter-plugin","last_synced_at":"2025-08-15T22:31:29.545Z","repository":{"id":39570101,"uuid":"389557917","full_name":"appodeal/Appodeal-Flutter-Plugin","owner":"appodeal","description":"Official Flutter Plugin that adds Appodeal SDK support to your Flutter application.","archived":false,"fork":false,"pushed_at":"2024-10-21T13:26:24.000Z","size":860,"stargazers_count":21,"open_issues_count":7,"forks_count":3,"subscribers_count":10,"default_branch":"main","last_synced_at":"2024-11-18T04:41:36.090Z","etag":null,"topics":["android","appodeal","dart","flutter","ios","koltin","sdk","swift"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/stack_appodeal_flutter","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appodeal.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-26T08:09:44.000Z","updated_at":"2024-11-03T04:44:15.000Z","dependencies_parsed_at":"2023-09-27T17:12:09.122Z","dependency_job_id":"25e12d05-aee2-4b78-886d-48eb3668b1d9","html_url":"https://github.com/appodeal/Appodeal-Flutter-Plugin","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appodeal%2FAppodeal-Flutter-Plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appodeal%2FAppodeal-Flutter-Plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appodeal%2FAppodeal-Flutter-Plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appodeal%2FAppodeal-Flutter-Plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appodeal","download_url":"https://codeload.github.com/appodeal/Appodeal-Flutter-Plugin/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":229964389,"owners_count":18152034,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","appodeal","dart","flutter","ios","koltin","sdk","swift"],"created_at":"2024-12-16T13:16:43.079Z","updated_at":"2025-08-15T22:31:29.528Z","avatar_url":"https://github.com/appodeal.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Appodeal Flutter\n\nOfficial Appodeal Flutter Plugin for your Flutter application.\n\n## Appodeal SDK 3.8.1\n\n- **Google CMP and TCF v2 Support**\n  - To enhance the relevance of ads for your users and comply with regulations like GDPR and CCPA,\n    explicit user consent is required for collecting personal data.\n  - We recommend using the Stack Consent Manager, built on Google User Messaging Platform (UMP),\n    as a ready-made solution to obtain user consent.\n  - Follow this [instruction](https://docs.appodeal.com/advanced/google-cmp-and-tcfv2-support) to\n    configure Google UMP and set up a consent form.\n  - If you have questions about Stack Consent Manager and Google UMP, please contact our support team.\n\n- **AdMob Bidding Support**\n  - Download our newest version of AdMob Sync tool from this [page](https://amsa-updates.appodeal.com/) and perform a sync.\n  - Read more about AdMob Sync in our [guide](https://docs.appodeal.com/networks-setup/admob-sync).\n\n- **Already included ready-made consent solution**\n  - Starting from Appodeal SDK 3.0, during the **first initialization**, a ready-made consent window will be shown if the user is in regions\n    covered by GDPR and CCPA. [See more about this behavior](#step-2-appodeal-consent-solution)\n\n- **Support Monetization + UA + Analytics data services**\n  - Get insights and find out if your active UA campaigns bring you revenue or make you lose money.\n  - Track your metrics with Firebase Keywords. Analyze how product A/B test (via Firebase remote config) affects both\n    your product and monetization. [See more about services](#services)\n\n## Table of Contents\n\n- [Installation](#installation)\n    - [iOS](#ios)\n    - [Android](#android)\n    - [Admob configuration](#admob-configuration)\n- [Services](#services)\n    - [Adjust](#adjust)\n    - [AppsFlyer](#appsflyer)\n    - [Firebase](#firebase)\n    - [Meta](#meta)\n    - [Tracking In-App Purchases](#tracking-in-app-purchases)\n    - [Event tracking](#event-tracking)\n- [Usage](#usage)\n    - [Initialisation](#initialisation)\n    - [Callbacks](#callbacks)\n    - [Presentation](#presentation)\n    - [Ad View](#ad-view)\n- [Privacy Policy and Consent](#privacy-policy-and-consent)\n    - [Step 1: Update Privacy Policy](#step-1-update-privacy-policy)\n    - [Step 2: Appodeal Consent Solution](#step-2-appodeal-consent-solution)\n- [App-ads.txt](#app-adstxt)\n- [App Tracking Transparency](#app-tracking-transparency)\n- [Changelog](CHANGELOG.md)\n\n## Installation\n\nAdd the dependency to the `pubspec.yaml` file in your project:\n\n```yaml\ndependencies:\n  stack_appodeal_flutter: 3.8.1\n```\n\nInstall the plugin by running the command below in the terminal:\n\n```\n$ flutter pub get\n```\n\n#### iOS\n\n\u003e [!IMPORTANT]\n\u003e - 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.\n\u003e - Appodeal SDK is compatible with both ARC and non-ARC projects.\n\u003e - Use Xcode 15.3 or higher.\n\n1. Go to `ios/` folder and open *Podfile*\n2. Add Appodeal adapters. Add pods into `./ios/Podfile`:\n\n```ruby\nsource 'https://cdn.cocoapods.org'\nsource 'https://github.com/appodeal/CocoaPods.git'\nsource 'https://github.com/bidon-io/CocoaPods_Specs.git'\n\nplatform :ios, '13.0'\n\nuse_frameworks!\n\ndef appodeal\n   pod 'Appodeal', '3.8.1'\n   pod 'APDAmazonAdapter', '3.8.1.0'\n   pod 'APDAppLovinAdapter', '3.8.1.0'\n   pod 'APDAppLovinMAXAdapter', '3.8.1.0'\n   pod 'APDBidMachineAdapter', '3.8.1.0'\n   pod 'APDBidonAdapter', '3.8.1.0'\n   pod 'APDBigoAdsAdapter', '3.8.1.0'\n   pod 'APDDTExchangeAdapter', '3.8.1.0'\n   pod 'APDGoogleAdMobAdapter', '3.8.1.0'\n   pod 'APDIABAdapter', '3.8.1.0'\n   pod 'APDInMobiAdapter', '3.8.1.0'\n   pod 'APDIronSourceAdapter', '3.8.1.0'\n   pod 'APDLevelPlayAdapter', '3.8.1.0'\n   pod 'APDMetaAudienceNetworkAdapter', '3.8.1.0'\n   pod 'APDMintegralAdapter', '3.8.1.0'\n   pod 'APDMyTargetAdapter', '3.8.1.0'\n   pod 'APDPangleAdapter', '3.8.1.0'\n   pod 'APDSentryAdapter', '3.8.1.0'\n   pod 'APDSmaatoAdapter', '3.8.1.0'\n   pod 'APDUnityAdapter', '3.8.1.0'\n   pod 'APDVungleAdapter', '3.8.1.0'\n   pod 'APDYandexAdapter', '3.8.1.0'\n   pod 'AppLovinMediationAmazonAdMarketplaceAdapter', '5.2.0.0'\n   pod 'AppLovinMediationBidMachineAdapter', '3.3.0.0.2'\n   pod 'AppLovinMediationBidonAdapter', '0.9.0.0'\n   pod 'AppLovinMediationBigoAdsAdapter', '4.7.0.2'\n   pod 'AppLovinMediationByteDanceAdapter', '7.1.1.1.0'\n   pod 'AppLovinMediationFacebookAdapter', '6.17.1.0'\n   pod 'AppLovinMediationFyberAdapter', '8.3.7.0'\n   pod 'AppLovinMediationGoogleAdManagerAdapter', '12.4.0.1'\n   pod 'AppLovinMediationGoogleAdapter', '12.4.0.1'\n   pod 'AppLovinMediationInMobiAdapter', '10.8.3.1'\n   pod 'AppLovinMediationIronSourceAdapter', '8.10.0.0.0'\n   pod 'AppLovinMediationMintegralAdapter', '7.7.7.0.0'\n   pod 'AppLovinMediationMobileFuseAdapter', '1.9.0.0'\n   pod 'AppLovinMediationMolocoAdapter', '3.9.1.1'\n   pod 'AppLovinMediationMyTargetAdapter', '5.32.1.0'\n   pod 'AppLovinMediationOguryPresageAdapter', '5.0.2.0'\n   pod 'AppLovinMediationPubMaticAdapter', '4.7.0.2'\n   pod 'AppLovinMediationSmaatoAdapter', '22.9.3.1'\n   pod 'AppLovinMediationUnityAdsAdapter', '4.14.2.0'\n   pod 'AppLovinMediationVerveAdapter', '3.2.0.0'\n   pod 'AppLovinMediationVungleAdapter', '7.5.1.4'\n   pod 'AppLovinMediationYandexAdapter', '5.2.1.0'\n   pod 'BidMachineAmazonAdapter', '3.3.0.0'\n   pod 'BidMachineMetaAudienceAdapter', '3.3.0.0'\n   pod 'BidMachineMintegralAdapter', '3.3.0.0'\n   pod 'BidMachineMyTargetAdapter', '3.3.0.1'\n   pod 'BidMachinePangleAdapter', '3.3.0.0'\n   pod 'BidMachineVungleAdapter', '3.3.0.3'\n   pod 'BidonAdapterAmazon', '0.9.0.0'\n   pod 'BidonAdapterBidMachine', '0.9.0.0'\n   pod 'BidonAdapterBigoAds', '0.9.0.0'\n   pod 'BidonAdapterDTExchange', '0.9.0.0'\n   pod 'BidonAdapterInMobi', '0.9.0.0'\n   pod 'BidonAdapterIronSource', '0.9.0.0'\n   pod 'BidonAdapterMetaAudienceNetwork', '0.9.0.0'\n   pod 'BidonAdapterMintegral', '0.9.0.0'\n   pod 'BidonAdapterMobileFuse', '0.9.0.0'\n   pod 'BidonAdapterMyTarget', '0.9.0.0'\n   pod 'BidonAdapterUnityAds', '0.9.0.0'\n   pod 'BidonAdapterVungle', '0.9.0.0'\n   pod 'BidonAdapterYandex', '0.9.0.0'\n   pod 'ISBidonCustomAdapter', '0.9.0.0'\n   pod 'IronSourceAPSAdapter', '4.3.20.1'\n   pod 'IronSourceAdMobAdapter', '4.3.65.0'\n   pod 'IronSourceAppLovinAdapter', '4.3.54.0'\n   pod 'IronSourceBidMachineAdapter', '4.3.17.1'\n   pod 'IronSourceBigoAdapter', '4.3.5.0'\n   pod 'IronSourceFacebookAdapter', '4.3.49.0'\n   pod 'IronSourceFyberAdapter', '4.3.43.1'\n   pod 'IronSourceInMobiAdapter', '4.3.29.1'\n   pod 'IronSourceMintegralAdapter', '4.3.34.0'\n   pod 'IronSourceMobileFuseAdapter', '4.3.6.0'\n   pod 'IronSourceMolocoAdapter', '4.3.19.0'\n   pod 'IronSourceMyTargetAdapter', '4.3.5.0'\n   pod 'IronSourceOguryAdapter', '4.3.3.1'\n   pod 'IronSourcePangleAdapter', '4.3.44.0'\n   pod 'IronSourceSmaatoAdapter', '4.3.17.1'\n   pod 'IronSourceUnityAdsAdapter', '4.3.51.0'\n   pod 'IronSourceVerveAdapter', '4.3.5.0'\n   pod 'IronSourceVungleAdapter', '4.3.45.1'\nend\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n  appodeal\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\nend\n```\n\nYou can change following implementation to use custom mediation setup.\nSee [docs](https://docs.appodeal.com/en/ios/get-started#getstarted-Step1.ImportSDK).\n\n\u003e Note: Appodeal requires to use `use_frameworks!`. You need to remove Flipper dependency from Podfile and AppDelegate.\n\n3. Call `pod install`\n4. Open `.xcworkspace`\n5. Configfure `info.plist`.\n\n##### SKAdNetworkIds\n\nAd networks used in Appodeal mediation support conversion tracking using Apple's `SKAdNetwork`,\nwhich means ad networks are able to attribute an app install even when IDFA is unavailable. To\nenable this functionality, you will need to update the `SKAdNetworkItems` key with an additional\ndictionary in your `Info.plist`.\n\n- Select **Info.plist** in the Project navigator in Xcode\n- Right-click on **Info.plist** file → Open as → Source Code\n- Add *SKAdNetworkIds* according to [doc](https://docs.appodeal.com/ios/get-started#add-skadnetworkids)\n\n##### App Transport Security\n\nIn order to serve ads, the SDK requires you to allow arbitrary loads. Set up the following keys\nin `Info.plist` of your app:\n\n- Go to your **Info.plist** file, then press Add+ anywhere in the first column of the key list.\n- Add **App Transport Security Settings** key and set its type to **Dictionary** in the second\n  column.\n- Press **Add+** at the end of the name **App Transport Security Settings** key and choose **Allow\n  Arbitrary loads**. Set its type to **Boolean** and its value to **Yes**.\n\n\u003cdetails\u003e\n  \u003csummary\u003eThere is App Transport Security settings in Info.plist format\u003c/summary\u003e\n\n``` xml\n\u003ckey\u003eNSAppTransportSecurity\u003c/key\u003e\n\u003cdict\u003e\n  \u003ckey\u003eNSAllowsArbitraryLoads\u003c/key\u003e\n  \u003ctrue/\u003e\n\u003c/dict\u003e\n```\n\n\u003c/details\u003e\n\n##### Other feature usage descriptions\n\nTo improve ad performance the following entries should be added:\n\n- **NSUserTrackingUsageDescription** - Starting from iOS 14, using IDFA requires permission from the user. The following\n  entry must be added in order to improve ad performance.\n- **NSLocationWhenInUseUsageDescription** - Entry is required if your application allows Appodeal SDK to use location\n  data.\n- **NSCalendarsUsageDescription** - Recommended by some ad networks.\n\n\u003cdetails\u003e\n  \u003csummary\u003eThere is Other feature usage descriptions settings in Info.plist format\u003c/summary\u003e\n\n``` xml\n\u003ckey\u003eNSUserTrackingUsageDescription\u003c/key\u003e\n\u003cstring\u003e\u003cApp Name\u003e needs your advertising identifier to provide personalised advertising experience tailored to you\u003c/string\u003e\n\u003ckey\u003eNSLocationWhenInUseUsageDescription\u003c/key\u003e\n\u003cstring\u003e\u003cApp Name\u003e needs your location for analytics and advertising purposes\u003c/string\u003e\n\u003ckey\u003eNSCalendarsUsageDescription\u003c/key\u003e\n\u003cstring\u003e\u003cApp Name\u003e needs your calendar to provide personalised advertising experience tailored to you\u003c/string\u003e\n```\n\n\u003c/details\u003e\n\n6. Build your project\n\n#### Android\n\n\u003e [!IMPORTANT]\n\u003e - Android API level 23 (Android OS 6.0) or higher.\n\n1. Add Appodeal adapters.\n\nAdd dependencies into `build.gradle` (module: app)\n\n``` groovy\ndependencies {\n    // ... other project dependencies\n    implementation ('com.appodeal.ads:sdk:3.8.1.0') {\n        exclude group: 'com.appodeal.ads.sdk.services', module: 'adjust'\n        exclude group: 'com.appodeal.ads.sdk.services', module: 'appsflyer'\n        exclude group: 'com.appodeal.ads.sdk.services', module: 'firebase'\n        exclude group: 'com.appodeal.ads.sdk.services', module: 'facebook_analytics'\n    }\n    ...\n}\n```\n\nAdd repository into `build.gradle` (module: project)\n\n``` groovy\nallprojects {\n    repositories {\n        ...\n        jcenter()\n        maven { url \"https://artifactory.appodeal.com/appodeal\" }\n        ...\n    }\n}\n```\n\n\u003e Note: You can change following implementation to use custom mediation setup.\n\u003e See [Docs](https://docs.appodeal.com/en/android/get-started#getstarted-ImportSDK).\n\n2. Build your project\n\n#### Admob configuration\n\n\u003e [!WARNING]  \n\u003e Admob Bidding is now available since Appodeal SDK 3.2.0.\\\n\u003e Don't forget to download our newest version of Admob Sync tool from this page and perform sync.\\\n\u003e You can read more about Admob Sync in\n\u003e our [guide](https://docs.appodeal.com/networks-setup/admob-sync).\n\n- **How to add Admob Ad Network to your project:**\n\n  Add your AdMob app id to `meta-data` tag:\n\n  ```xml\n  \u003cmanifest\u003e\n      \u003capplication\u003e\n          \u003c!-- Add your AdMob App ID --\u003e\n          \u003cmeta-data\n              android:name=\"com.google.android.gms.ads.APPLICATION_ID\"\n              android:value=\"ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy\"/\u003e\n      \u003c/application\u003e\n  \u003c/manifest\u003e\n  ```\n\n  Add your AdMob app id to `Info.plist`.\n  Use the key *GADApplicationIdentifier* with the value being your AdMob app ID:\n\n  ```xml\n  \u003ckey\u003eGADApplicationIdentifier\u003c/key\u003e \n  \u003cstring\u003eYOUR_ADMOB_APP_ID\u003c/string\u003e\n  ```\n\n- **How to remove Admob Ad Network from your project:**\n\n  Change next dependencies into `build.gradle` (module: app)\n\n  ```groovy\n  dependencies {\n      ...\n      // ... other project dependencies\n      implementation('com.appodeal.ads:sdk:3.8.1.0') {\n          // ad networks\n          exclude group: \"com.appodeal.ads.sdk.networks\", module: \"admob\"\n          exclude group: \"com.applovin.mediation\", module: \"google-adapter\"\n          exclude group: \"com.applovin.mediation\", module: \"google-ad-manager-adapter\"\n          exclude group: \"com.unity3d.ads-mediation\", module: \"admob-adapter\"\n          // services\n          exclude group: 'com.appodeal.ads.sdk.services', module: 'adjust'\n          exclude group: 'com.appodeal.ads.sdk.services', module: 'appsflyer'\n          exclude group: 'com.appodeal.ads.sdk.services', module: 'firebase'\n          exclude group: 'com.appodeal.ads.sdk.services', module: 'facebook_analytics'\n      }\n      ...\n  }\n  ```\n\n  Remove next pods from `Podfile`:\n\n  ```ruby\n  pod 'APDGoogleAdMobAdapter', '3.8.1.0'\n  pod 'AppLovinMediationGoogleAdManagerAdapter', '12.4.0.1'\n  pod 'AppLovinMediationGoogleAdapter', '12.4.0.1'\n  pod 'IronSourceAdMobAdapter', '4.3.65.0'\n  ```\n\n## Services\n\nPlease, read iOS and Android docs at [wiki](https://docs.appodeal.com/) to get deeper understanding how\nAppodeal SDK Services works.\n\n#### Adjust\n\nAdd dependencies into build.gradle (module: app)\n\n```groovy\ndependencies {\n    // ... other project dependencies\n    implementation 'com.appodeal.ads.sdk.services:adjust:3.8.1.0'\n}\n```\n\nAdd dependencies into _Podfile_\n\n```ruby\ndef appodeal\n  // ... other project pods\n  pod 'APDAdjustAdapter', '3.8.1.0'\nend\n```\n\n#### AppsFlyer\n\nAdd dependencies into build.gradle (module: app)\n\n```groovy\ndependencies {\n    // ... other project dependencies\n  implementation 'com.appodeal.ads.sdk.services:appsflyer:3.8.1.0'\n}\n```\n\nAdd dependencies into _Podfile_\n\n```ruby\ndef appodeal\n  // ... other project pods\n  pod 'APDAppsFlyerAdapter', '3.8.1.0'\nend\n```\n\n#### Firebase\n\nAdd dependencies into build.gradle (module: app)\n\n```groovy\ndependencies {\n    // ... other project dependencies\n    implementation 'com.appodeal.ads.sdk.services:firebase:3.8.1.0'\n}\n```\n\nAdd dependencies into _Podfile_\n\n```ruby\ndef appodeal\n  // ... other project pods\n  pod 'APDFirebaseAdapter', '3.8.1.0'\nend\n```\n\n#### Meta\n\nAdd dependencies into build.gradle (module: app)\n\n```groovy\ndependencies {\n    // ... other project dependencies\n    implementation 'com.appodeal.ads.sdk.services:facebook_analytics:3.8.1.0'\n}\n```\n\nAdd dependencies into _Podfile_\n\n```ruby\ndef appodeal\n  // ... other project pods\n  pod 'APDFacebookAdapter', '3.8.1.0'\nend\n```\n\n##### Tracking In-App Purchases\n\n\u003e Note: In-App purchase tracking will work only with connection with Adjust/Appsflyer.\n\nIt's possible to track in-app purchase information and send info to Appodeal servers for analytics. It allows to group\nusers by the fact of purchasing in-apps. This will help you to adjust the ads for such users or simply turn it off, if\nneeded. To make this setting work correctly, please submit the purchase info via the Appodeal SDK.\n\n* For App Store:\n\n```dart\nfinal purchase = AppodealAppStorePurchase.nonConsumable(\n    orderId: orderId,\n    price: price,\n    currency: currency,\n    transactionId: transactionId,\n    additionalParameters: {});\n    \nAppodeal.validateInAppPurchase(\n    purchase: purchase,\n    onInAppPurchaseValidateSuccess: (purchase, errors) {},\n    onInAppPurchaseValidateFail: (purchase, errors) {});\n```\n\n| Parameter            | Description                                            | Usage                     |\n|----------------------|--------------------------------------------------------|---------------------------|\n| orderId              | Product purchased unique order id for the transaction. | Adjust/AppsFlyer          |\n| price                | In-app event revenue.                                  | Adjust/AppsFlyer/Appodeal |\n| currency             | In-app event currency.                                 | Adjust/AppsFlyer/Appodeal |\n| transactionId        | Product purchased transaction id.                      | Adjust/AppsFlyer          |\n| additionalParameters | Additional parameters of the in-app event.             |                           |\n\n* For Play Store:\n\n```dart\nfinal purchase = AppodealPlayStorePurchase.inapp(\n    orderId: orderId,\n    price: price,\n    currency: currency,\n    additionalParameters: {})\n  ..sku = sku\n  ..publicKey = publicKey\n  ..signature = signature\n  ..purchaseData = purchaseData\n  ..purchaseToken = purchaseToken\n  ..purchaseTimestamp = purchaseTimestamp\n  ..developerPayload = developerPayload\n  \nAppodeal.validateInAppPurchase(\n    purchase: purchase,\n    onInAppPurchaseValidateSuccess: (purchase, errors) {},\n    onInAppPurchaseValidateFail: (purchase, errors) {});\n```\n\n| Parameter            | Description                                                                                                        | Usage                     |\n|----------------------|--------------------------------------------------------------------------------------------------------------------|---------------------------|\n| purchaseType         | Purchase type. Must be InAppPurchase.Type.InApp or InAppPurchase.Type.Subs                                         | Adjust/AppsFlyer          |\n| publicKey            | [Public key from Google Developer Console.](https://support.google.com/googleplay/android-developer/answer/186113) | AppsFlyer                 |\n| signature            | Transaction signature (returned from Google API when the purchase is completed).                                   | Adjust/AppsFlyer          |\n| purchaseData         | Product purchased in JSON format (returned from Google API when the purchase is completed).                        | AppsFlyer                 |\n| purchaseToken        | Product purchased token (returned from Google API when the purchase is completed).                                 | Adjust                    |\n| purchaseTimestamp    | Product purchased timestamp (returned from Google API when the purchase is completed).                             | Adjust                    |\n| developerPayload     | Product purchased developer payload (returned from Google API when the purchase is completed).                     | Adjust                    ||\n| orderId              | Product purchased unique order id for the transaction (returned from Google API when the purchase is completed).   | Adjust                    |\n| sku                  | Stock keeping unit id.                                                                                             | Adjust                    |\n| price                | In-app event revenue.                                                                                              | Adjust/AppsFlyer/Appodeal |\n| currency             | In-app event currency.                                                                                             | Adjust/AppsFlyer/Appodeal |\n| additionalParameters | Additional parameters of the in-app event.                                                                         |                           |\n\n##### Event tracking\n\nAppodeal SDK allows you to send events to all analytic services such as Firebase, AppsFlyer, Adjust \nand Meta using a single method:\n\n```dart\nAppodeal.logEvent(\"example_event_name\", {\n  \"example_param_1\": \"example_param_value_1\",\n  \"example_param_2\": 123\n});\n```\n\nUse this method for send event for a specific service:\n\n```dart\nAppodeal.logEvent(\"example_event_name\", { \n  \"example_param_1\": \"example_param_value_1\",\n  \"example_param_2\": 123 \n  },\n  AppodealServices.APPSFLYER\n);\n```\n\nYou can use one or more of these values to select the service to send the event to:\n- `AppodealServices.ADJUST` - for Adjust service;\n- `AppodealServices.APPSFLYER` - for Appsflyer service;\n- `AppodealServices.FACEBOOK` - for Facebook service;\n- `AppodealServices.FIREBASE` - for Firebase service;\n- `AppodealServices.ALL` - for ALl services;\n\nor you may combine these values, for example, to sent event to Appsflyer and Firebase services:\n- `AppodealServices.APPSFLYER | AppodealServices.FIREBASE`\n\n## Usage\n\nPlease, read iOS and Android docs at [wiki](https://docs.appodeal.com/) to get deeper understanding how\nAppodeal SDK works.\n\n### Initialisation\n\n1. Initialise Appodeal at application launch. To initialize Appodeal SDK use this following method:\n\n```dart\nAppodeal.initialize(\n    appKey: \"YOUR_APPODEAL_APP_KEY\",\n    adTypes: [\n      AppodealAdType.Interstitial,\n      AppodealAdType.RewardedVideo,\n      AppodealAdType.Banner,\n      AppodealAdType.MREC\n    ],\n    onInitializationFinished: (errors) =\u003e {});\n```\n\n\u003e Note: Make sure to replace \"YOUR_APPODEAL_APP_KEY\" with the actual app key.\n\nUse the type codes below to set the preferred ad format:\n\n- `AppodealAdType.Interstitial` for interstitial.\n- `AppodealAdType.RewardedVideo` for rewarded videos.\n- `AppodealAdType.Banner` for banners.\n- `AppodealAdType.MREC` for 300*250 banners.\n\n2. Configure SDK\n\n* General configuration\n\n\u003e Call this method before initilisation\n\n``` dart\n// Set ad auto caching enabled or disabled\n// By default autocache is enabled for all ad types\nAppodeal.setAutoCache(AppodealAdType.Interstitial, false); //default - true\n\n// Set testing mode\nAppodeal.setTesting(false); //default - false\n\n// Set Appodeal SDK logging level\nAppodeal.setLogLevel(Appodeal.LogLevelVerbose); //default - Appodeal.LogLevelNone\n\n// Enable or disable child direct threatment\nAppodeal.setChildDirectedTreatment(false); //default - false\n\n// Disable network for specific ad type\nAppodeal.disableNetwork(\"admob\");\nAppodeal.disableNetwork(\"admob\", AppodealAdType.Interstitial);\n```\n\n* Segments and targeting.\n\n``` dart\n// Set segment filter\nAppodeal.setCustomFilter(\"levels_played\", \"levelsPlayed\");\n\n// Set extras\nAppodeal.setExtraData(\"attribuition_id\", \"some value\");\n```\n\n* Banner specific\n\n``` dart\n// Enable or disable tablet banners.\n// SUPORTED ONLY FOR NON-VIEW DISPLAYING\n// THIS METHOD DOES NOT WORK CORRECTLY FOR BANNER VIEW BECAUSE BANNER VIEW DOES NOT SUPPORT TABLET FORMAT\nAppodeal.setTabletBanners(false); //default - false\n\n// Enable or disable smart banners. \n// SUPORTED ONLY FOR NON-VIEW DISPLAYING\n// iOS smart banners are supported only for applications where autorotation is disabled\nAppodeal.setSmartBanners(false); //default - false\n\n// Enable or disable banner refresh animation\nAppodeal.setBannerAnimation(true); //default - true\n```\n\n* Android specific\n\n``` dart\n// Mute calls if calls muted on Android\nAppodeal.muteVideosIfCallsMuted(bool); //default - false\n\n// Enable or disable banner auto resume screen. \n// SUPORTED ONLY FOR NON-VIEW DISPLAYING\nAppodeal.setAdViewAutoResume(true); //default - true\n```\n\n* Ad revenue information\n\n```dart\n// If you want to get revenue information you can use request callback.\n// Called every time when SDK receives a revenue information for an ad.\nAppodeal.setAdRevenueCallbacks(onAdRevenueReceive: (adRevenue) =\u003e {});\n```\n\n### Callbacks\n\nSet callbacks listener to get track of ad lifecycle events.\n\n1. Banner\n\n```dart\nAppodeal.setBannerCallbacks(\n        onBannerLoaded: (isPrecache) =\u003e {},\n        onBannerFailedToLoad: () =\u003e {},\n        onBannerShown: () =\u003e {},\n        onBannerShowFailed: () =\u003e {},\n        onBannerClicked: () =\u003e {},\n        onBannerExpired: () =\u003e {});\n```\n\n2. MREC\n\n```dart\nAppodeal.setMrecCallbacks(\n        onMrecLoaded: (isPrecache) =\u003e {},\n        onMrecFailedToLoad: () =\u003e {},\n        onMrecShown: () =\u003e {},\n        onMrecShowFailed: () =\u003e {},\n        onMrecClicked: () =\u003e {},\n        onMrecExpired: () =\u003e {});\n```\n\n3. Interstitial\n\n```dart\nAppodeal.setInterstitialCallbacks(\n        onInterstitialLoaded: (isPrecache) =\u003e {},\n        onInterstitialFailedToLoad: () =\u003e {},\n        onInterstitialShown: () =\u003e {},\n        onInterstitialShowFailed: () =\u003e {},\n        onInterstitialClicked: () =\u003e {},\n        onInterstitialClosed: () =\u003e {},\n        onInterstitialExpired: () =\u003e {});\n```\n\n4. Rewarded video\n\n```dart\nAppodeal.setRewardedVideoCallbacks(\n        onRewardedVideoLoaded: (isPrecache) =\u003e {},\n        onRewardedVideoFailedToLoad: () =\u003e {},\n        onRewardedVideoShown: () =\u003e {},\n        onRewardedVideoShowFailed: () =\u003e {},\n        onRewardedVideoFinished: (amount, reward) =\u003e {},\n        onRewardedVideoClosed: (isFinished) =\u003e {},\n        onRewardedVideoExpired: () =\u003e {},\n        onRewardedVideoClicked: () =\u003e {});\n```\n\n### Presentation\n\n\u003e Note: All presentation specific methods are available only after SDK initialisation\n\n1. Caching\n\nIf you disable autocache you should call `cache` method before trying to show any ad\n\n``` dart\nAppodeal.cache(AppodealAdType.Interstitial);\n```\n\n2. Check that ad is loaded and can be shown\n\n``` dart\n// Check that interstitial\nvar isCanShow = await Appodeal.canShow(AppodealAdType.Interstitial);\n// Check that interstitial is loaded\nvar isLoaded = await Appodeal.isLoaded(AppodealAdType.Interstitial);\n```\n\n3. Show advertising\n\n``` dart\n// Show interstitial\nAppodeal.show(AppodealAdType.Interstitial);\n\n// Show banner\nAppodeal.show(AppodealAdType.BannerBottom); // Display banner at the bottom of the screen\nAppodeal.show(AppodealAdType.BannerTop); // Display banner at the top of the screen\nAppodeal.show(AppodealAdType.BannerLeft); // Display banner at the left of the screen\nAppodeal.show(AppodealAdType.BannerRight); // Display banner at the right of the screen\n\n// Show interstitial for specific pacement\nAppodeal.show(AppodealAdType.Interstitial, “placementName”);\n```\n\n4. Hide\n\nYou can hide banner/MREC ad after it was shown. Call `hide` method with another ad types won't affect anything\n\n``` dart\nAppodeal.hide(AppodealAdType.BannerTop); //AppodealAdType.MREC\n```\n\n5. Destroy\n\nTo free memory from hidden banner/MREC call the code below:\n\n```dart\nAppodeal.destroy(AppodealAdType.Banner); //AppodealAdType.MREC\n```\n\n## Ad View\n\n**Display banner/MREC ad view at a custom position**\n\n\u003e Note: Ad View presentation support only fixed banners size - `320x50` and `300x250`.\n\nTo display a Banner view add widget:\n\n```dart\nchild: AppodealBanner(adSize: AppodealBannerSize.BANNER, placement: \"default\");\n```\n\nTo display a MREC view add widget:\n\n```dart\nchild: AppodealBanner(adSize: AppodealBannerSize.MEDIUM_RECTANGLE, placement: \"default\");\n```\n\n## Privacy Policy and Consent\n\n\u003e Note: Keep in mind that it’s best to contact qualified legal professionals, if you haven’t done so already, to get\n\u003e more information and be well-prepared for compliance.\n\nThe General Data Protection Regulation, better known as GDPR, took effect on May 25, 2018. It’s a set of rules designed\nto give EU citizens more control over their personal data. Any businesses established in the EU or with users based in\nEurope are required to comply with GDPR or risk facing heavy fines. The California Consumer Privacy Act (CCPA) went into\neffect on January 1, 2020. **We have put together some resources below to help publishers understand better the steps\nthey need to take to be GDPR compliant.**\n\n\u003e Note: You can learn more about GDPR and CCPA and their.\n\u003e differences [here](https://iapp.org/resources/article/ccpa-and-gdpr-comparison-chart/).\n\n### Step 1: Update Privacy Policy\n\n**1.1 Make sure your privacy policy includes information about advertising ID collection.**\nDon’t forget to add information about IP address and advertising ID collection, as well\nas [the link to Appodeal’s privacy policy](https://www.appodeal.com/privacy-policy) to your app’s privacy policy in\nGoogle Play and App Store.\n\nTo speed up the process, you could\nuse [privacy policy generators](https://app-privacy-policy-generator.firebaseapp.com/) —just insert advertising ID, IP\naddress, and location (if you collect a user’ location) in the \"Personally Identifiable Information you collect\" field (\nin line with other information about your app)\nand [the link to Appodeal’s privacy policy](https://www.appodeal.com/privacy-policy) in \"Link to the privacy policy of\nthird party service providers used by the app\".\n\n**1.2 Add a privacy policy to your mobile app.**\nYou must add your explicit privacy policies in two places: your app’s Store Listing page and within your app.\n\nYou can find detailed instructions on adding your privacy policy to your app on legal service websites. For example,\nIubenda, the solution tailored to legal compliance, provides\na [comprehensive guide](https://www.iubenda.com/blog/privacy-policy-for-android-app/) on including a privacy policy in\nyour app.\n\nMake sure that your privacy policy website has an SSL-certificate—this point might seem to be obvious, but it’s still\nessential.\n\nHere’s are two useful resources that you can utilize while working on your app compliance:\n[Privacy, Security and Deception regulations (by Google Play)](https://play.google.com/intl/en-GB_ALL/about/privacy-security-deception/user-data/)\n[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)\n\n\u003e Note: Please note that although we’re always eager to back you up with valuable information, we’re not authorized to\n\u003e provide any legal advice. It’s important to address your questions to lawyers who work specifically in this area.\n\n### Step 2: Appodeal Consent Solution\n\nIn order for Appodeal and our ad providers to deliver ads that are more relevant to your users, as a\nmobile app publisher, you need to collect explicit user consent in the regions covered by GDPR and\nCCPA.\n\nTo get consent for collecting personal data of your users, we suggest you use a ready-made\nsolution - Stack Consent Manager based on Google User Messaging Platform (UMP).\n\n\u003e [!IMPORTANT]\n\u003e STARTING FROM APPODEAL SDK 3.0, STACK CONSENT MANAGER IS INCLUDED BY DEFAULT.\n\u003e Consent will be requested automatically on SDK initialization, and consent form will be shown if it is necessary without any additional calls.\n\n**If you wish, you can manage and update consent manually using Stack Consent Manager calls.**\n\n- Force Present Consent Form\n\n```dart\n// Load consent window\nAppodeal.ConsentForm.load(\n  appKey: exampleAppodealKey,\n  onConsentFormLoadSuccess: (status) {},\n  onConsentFormLoadFailure: (error) {},\n);\n\n// Show consent window\nAppodeal.ConsentForm.show(\n  onConsentFormDismissed: (error) {},\n);\n```\n\n- Force Present Consent Form only when consent is required\n\n```dart\nAppodeal.ConsentForm.loadAndShowIfRequired(\n  appKey: exampleAppodealKey,\n  onConsentFormDismissed: (error) {},\n);\n```\n\n- Revoke Consent\n\n```dart\nAppodeal.ConsentForm.revoke();\n```\n\n\n## App-ads.txt\n\nThe app-ads.txt file is a text file which provides a mechanism for publishers to declare their authorized digital sellers.\n\nYou can find detailed information [here](https://docs.appodeal.com/advanced/app-ads).\n\n## App Tracking Transparency\n\nStarting in iOS 14.5, IDFA will be unavailable until an app calls the App Tracking Transparency\nframework to present the app-tracking authorization request to the end-user. If an app does not\npresent this request, the IDFA will automatically be zeroed out, which may lead to a significant\nloss in ad revenue.\n\nYou can read more about App Tracking Transparency in our [guide](https://docs.appodeal.com/ios/next/data-protection/app-tracking-transparency).\n\nTo display the App Tracking Transparency authorization request for accessing the IDFA, update your\n`Info.plist` to add the *NSUserTrackingUsageDescription* key with a custom message describing the usage.\n\n```\n\u003ckey\u003eNSUserTrackingUsageDescription\u003c/key\u003e\n\u003cstring\u003eThis identifier will be used to deliver personalized ads to you.\u003c/string\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappodeal%2Fappodeal-flutter-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappodeal%2Fappodeal-flutter-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappodeal%2Fappodeal-flutter-plugin/lists"}