base on Flutter Plugin for AppsFlyer SDK <img src="https://massets.appsflyer.com/wp-content/uploads/2018/06/20092440/static-ziv_1TP.png" width="400" >
# appsflyer-flutter-plugin
[](https://pub.dartlang.org/packages/appsflyer_sdk)

🛠 In order for us to provide optimal support, we would kindly ask you to submit any issues to
[email protected]
> *When submitting an issue please specify your AppsFlyer sign-up (account) email , your app ID , production steps, logs, code snippets and any additional relevant information.*
### <a id="plugin-build-for"> This plugin is built for
- Android AppsFlyer SDK **v6.16.2**
- iOS AppsFlyer SDK **v6.16.2**
## <a id="breaking-changes"> ❗❗ Breaking changes when updating to v6.x.x❗❗
If you have used one of the removed/changed APIs, please check the integration guide for the updated instructions.
- From version `6.11.2`, the `setPushNotification` will not work in iOS. [Please use our new API `sendPushNotificationData` when receiving a notification on flutter side](/doc/API.md#sendPushNotificationData).
- From version `6.8.0`, the `enableLocationCollection` has been removed from the plugin.
- From version `6.4.0`, UDL (Unified deep link) now as a dedicated class with getters for handling the deeplink result.
[Check the full UDL guide](https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin/blob/master/doc/Guides.md#-3-unified-deep-linking).
`setSharingFilter` & `setSharingFilterForAllPartners` APIs are deprecated.
Instead use the [new API `setSharingFilterForPartners`](https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin/blob/RD-69098/update6.4.0%26more/doc/API.md#setSharingFilterForPartners).
- From version `6.3.5+2`, Remove stream from the plugin (no change is needed if you use callbacks for handling deeplink).
- From version `6.2.3+2`, Flutter 2 is supported, including null safety.
`6.2.4-flutterv1` will use iOS SDK 6.2.4 with Flutter V1.
- From version `6.0.0`, we have renamed the following APIs:
|Before v6 | v6 |
|-------------------------------|-----------------------------|
| trackEvent | logEvent |
| stopTracking | stop |
| validateAndTrackInAppPurchase | validateAndLogInAppPurchase |
- From version `6.1.2+4`, we have renamed the following APIs:
|Before v6.1.2+4 | v6.1.2+4 |
|-------------------------------|-----------------------------|
| validateAndLogInAppPurchase | validateAndLogInAppIosPurchase/validateAndLogInAppAndroidPurchase |
### Important notice
- Switch `ConversionData` and `OnAppOpenAttribution` to be based on callbacks instead of streams from plugin version `6.0.5+2`.
## AD_ID permission for Android
In v6.8.0 of the AppsFlyer SDK, we added the normal permission `com.google.android.gms.permission.AD_ID` to the SDK's AndroidManifest,
to allow the SDK to collect the Android Advertising ID on apps targeting API 33.
If your app is targeting children, you need to revoke this permission to comply with Google's Data policy.
You can read more about it [here](https://dev.appsflyer.com/hc/docs/install-android-sdk#the-ad_id-permission).
## 📖 Guides
- [Adding the SDK to your project](/doc/Installation.md)
- [Initializing the SDK](/doc/BasicIntegration.md)
- [In-app Events](/doc/InAppEvents.md)
- [Deep Linking](/doc/DeepLink.md)
- [Advanced APIs](/doc/AdvancedAPI.md)
- [Testing the integration](/doc/Testing.md)
- [APIs](/doc/API.md)
- [Sample App](/example)
", Assign "at most 3 tags" to the expected json: {"id":"12851","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"