NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #555 most downloaded on pub.dev
A Flutter plugin for AppsFlyer SDK. Supports iOS and Android.
Last release 23 days ago
15 Sep 2026
Release timing varies
gaps range from 1 weeks to 3 months
Most releases are documented
notes for 50 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
133 releases · first in 2018
AppsFlyer Flutter Plugin v7.0.2
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk: ^7.0.2Then run:
flutter pub getRelease version 7.0.2. See CHANGELOG.md for details.
For issues and questions, please contact support@appsflyer.com
One column per quarter.
Migration to AppsFlyer SDK 7. This is a major release with intentional breaking changes. See doc/migration-guide.md for removed APIs, renames, lifecycle changes, and upgrade instructions.
doc/, with the
complete upgrade catalog in doc/migration-guide.md.BREAKING
3.24 templates Kotlin 1.7.10 and could not build the plugin at all. The
build now fails at configuration time with a message naming the version found
and the file to change, because the Kotlin Gradle Plugin version is declared by
the app and does not change when Flutter is upgraded.AppsflyerSdk(options) and AppsFlyerOptions with the shared
AppsFlyerSdk.instance singleton and explicit configuration methods.initSdk(...) with init(devKey:, appId:). appId is required on
iOS, optional on Android, and is not sent to the Android SDK.startSDK(...) with await start(). Initialization no longer sends
a session. Call registerSessionReadyListener(onReady) and call start()
once for each readiness event.registerConversionListener( onConversionDataSuccess:, onConversionDataFail:),
registerDeepLinkListener(onDeepLinking:), and
registerSessionReadyListener(onReady). Each callback is named after
the event it handles, so the same handler names apply across the AppsFlyer
plugins. Every callback except onReady is optional — pass only the ones you
need. The plugin holds one callback per
event and replaces it on re-registration, matching the native SDKs; no event
stream is exposed, so a single native event cannot fan out to several
handlers in the app. Registering and unregistering are all-or-nothing: when the
native call fails, the Dart callbacks are left exactly as they were.registerDeepLinkListener(onDeepLinking:) must be called before init().
Android decides once per install, while init() processes the launch intent,
whether to send the deferred deep-link resolution request, and skips it when no
listener is registered yet. The other listeners are still registered after
init().AppsFlyerException (int? code, String message). Non-numeric platform
codes leave code as null. MissingPluginException is not converted.
Failures from fire-and-forget calls are not reported.start, logEvent, and generateInviteLink expose awaitResponse where the
native SDK supports waiting for a completion callback. It defaults to false
for start and logEvent, and to true for invite-link generation.
validateAndLogInAppPurchase has no such flag: both platforms always wait for
the validation result.performOnDeepLinking() with
performDeepLinking(url, {shouldTriggerSession}).validateAndLogInAppPurchaseV2(...) with
validateAndLogInAppPurchase(AFPurchaseDetails, ...). Use
AFAndroidPurchaseDetails with a Play purchase token or
AFIOSPurchaseDetails with an App Store transaction ID.sendPushNotificationData(Map) shape with
platform-specific Android sendPushNotificationData(...) and iOS
handlePushNotification(pushPayload) APIs.setConsentDataV2(...) and the AppsFlyerConsent wrapper with the
flat setConsentData(...) API and its four SDK 7 consent fields.enableDebug, setDisableSKAdNetwork,
setDisableAppleAdsAttribution, setDisableIDFVCollection,
setUseReceiptValidationSandbox, and setUseUninstallSandbox.setUserFbLoginId now accepts an int; mediation values use
AFMediationNetwork; invite-link fields use referrerCustomerId and
userParams.onAppOpenAttribution, setUserEmails, EmailCryptType,
raw IMEI and Android ID setters, V1 purchase validation, setPushNotification,
enableUninstallTracking, waitForCustomerUserId, and
setCustomerIdAndLogSession.start().AppsFlyerException when called outside
its supported platform, instead of some logging a warning and returning a safe
default while others threw. The plugin no longer keeps its own table of which
platform implements what — calls are forwarded and the native layer
answers, so the surface stays correct as the native SDKs change. Code that
relied on an off-platform call being a silent no-op must guard it with
Platform.isAndroid / Platform.isIOS or catch the exception. The exception
code comes from the native layer, which reports 404 for an unimplemented
method on both platforms.getHostName() and getHostPrefix() now return non-nullable Future<String>
instead of Future<String?>; unexpected native null replies throw
AppsFlyerException instead of surfacing as null. Both are available on
Android and iOS — see Added below.isSessionReady, isStopped, and isPreInstalledApp no
longer coerce an unexpected native null to false; they throw
AppsFlyerException instead.setSharingFilterForPartners(null) and setSharingFilterForPartners([]) are
forwarded to the native layer instead of being ignored in Dart, and clear the
filter on Android and iOS alike.setConsentData accepts nullable consent fields: only isUserSubjectToGDPR is
required; the three consent booleans are optional and may be omitted or null
for non-GDPR users, matching native AppsFlyerConsent.collectDataFromLauncherActivity(), which collects the
open/web referrer from the launcher activity's intent. Call it before
start(). It requires an attached activity and otherwise fails with
AppsFlyerException (code 422).setInstallId() requires AppsFlyerAllowCustomInstallId=YES in iOS
Info.plist and must be called before init() on iOS. Android requires
APPSFLYER_ALLOW_CUSTOM_INSTALL_ID=true in AndroidManifest.xml and the call
must follow init().2.2.0 requires Google Play Billing Library 8.x.
The Flutter plugin does not add Billing Library; the app or its IAP plugin
must provide it. iOS Purchase Connector requires CocoaPods, while Core-only
apps can use Swift Package Manager.SingleInstallBroadcastReceiver and
MultipleInstallBroadcastReceiver manifest entries. The plugin already
includes Google Play Install Referrer 2.2.AppsflyerSdkPlugin.h, AppsFlyerAttribution.h,
AppsFlyerStreamHandler.h, FlutterAppDelegate+AppsFlyerStreamHandler.h).
The iOS bridge is Swift-only; host apps that imported those headers must
rely on automatic plugin registration or import
<appsflyer_sdk/appsflyer_sdk-Swift.h> instead. See
migration guide — iOS: Objective-C public headers removed.See the v6 → v7 migration guide for the complete replacement table.
Added
AppsFlyerSdk.instance, init(...),
registerSessionReadyListener(onReady), unregisterSessionReadyListener(),
isSessionReady(), and start() for the SDK 7 lifecycle.enableDebug(bool) toggle and Android-only
setLogLevel(AFLogLevel).OnConversionDataSuccess,
OnConversionDataFailure, OnDeepLinkReceived, OnSessionReady) and
AppsFlyerException.setUserEmail, setUserPhone,
setUserFirstName, and setUserLastName, plus integer
setUserFbLoginId and clearUserPii.performDeepLinking, setDeepLinkTimeout,
appendParametersToDeepLinkingURL, and iOS-only
setFacebookDeferredAppLink.AFPurchaseDetails interface with dedicated
AFAndroidPurchaseDetails and AFIOSPurchaseDetails implementations.logSession, setPreinstallAttribution, setAppId,
isPreInstalledApp, getAttributionId,
unregisterDeepLinkListener, and unregisterConversionListener APIs.
On Android, unregisterDeepLinkListener does not reliably stop subsequent
deep-link events; do not depend on it as an effective unsubscribe.isStopped, getHostName, and getHostPrefix on both platforms. On
iOS, getHostName and getHostPrefix return an empty string until setHost
is called.setDisableAppleAdsAttribution,
setDisableIDFVCollection, setShouldCollectDeviceName, and
setUseUninstallSandbox APIs.logInvite, logLocation, setInstallId, and awaitable
generateInviteLink support.Fixed
didReceivePurchaseRevenueValidationInfo called
JSONSerialization.data(withJSONObject:) under try?, which does not catch
the NSInvalidArgumentException that call raises, so an NSDate, an
NSData or a non-String key in the delegate's untyped dictionary aborted
the process. The helper now checks isValidJSONObject first and returns
nil, which surfaces as a reported parse failure — the callback fires with
no data and a log line — instead of a crash. Only affects apps that opted
into the Purchase Connector.enableDebug now controls the plugin's own diagnostics as well as native SDK
logging. The plugin printed through debugPrint, which Flutter does not
compile out of release builds, so those lines reached production logs whatever
the app had passed to enableDebug. Release builds are quiet by default and
print again after enableDebug(true); debug builds always print.workmanager
task, compute() — now throws a catchable AppsFlyerException naming the
cause. Platform channels are bound to the main isolate, and the underlying
StateError escaped through the event stream's subscribe callback rather than
the returned Future, so no try/catch around the call could intercept it
and the background isolate terminated mid-task. AppsFlyerSdk.instance is
also a per-isolate singleton, so a background isolate never sees the instance
you configured. See doc/getting-started.md.FormatException.toString() appends an
excerpt of the string it could not parse, so a truncated or malformed event put
raw attribution data — click and deep-link identifiers among it — into the host
app's release log. Stream errors are logged the same way, naming the platform
error code but not the message or details.fromJson casts were non-nullable, and the resulting error was raised inside a platform-message handler, so neither onResponse nor onFailure fired and the app could not catch it. BREAKING: every field of ProductPurchase, SubscriptionPurchase and the types it nests, ValidationFailureData, JVMThrowable and IosError is now nullable, matching the Google Play Developer API, which documents purchaseToken, productId, quantity, purchaseType and the obfuscated identifiers as conditionally present and omits any field left at its default value. success and the result maps stay non-nullable. A payload that still cannot be parsed is reported through onFailure with a message naming the callback and the error type — never the payload, which carries purchase and account identifiers. See doc/migration-guide.md.[AppsFlyer_PC_Debug] print logging that shipped in release builds; the callback handler now accepts both JSON-string and already-decoded Map payloads and logs (instead of throwing) on an unrecognized callback name.setSubscriptionValidationResultListener / setInAppValidationResultListener) never fired — the Dart callback-name constants used a # separator while the native side invokes the channel with :, so the handler's switch never matched. Aligned the Dart constants to :, so these result listeners now deliver.subscribeForDeepLink and registerConversionListener overwrite a single
reference, and deep links have no unsubscribe API), so a deep link or
conversion-data callback arriving after the Activity was destroyed — for
example a link tapped after leaving the app with the back button — was written
into the buffer of a plugin instance Dart could no longer reach. Buffering and
replay moved to a process-scoped relay, so those events are delivered to the
next subscriber in the order they were published.AppsFlyer Flutter Plugin v7.0.2+1
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk: ^7.0.2+1Then run:
flutter pub getRelease version 7.0.2+1. See CHANGELOG.md for details.
For issues and questions, please contact support@appsflyer.com
setImeiData, setOaidData, and setAndroidIdData (Android only)AppsFlyer Flutter Plugin - Release Candidate 7.0.2+1-rc1
This is a pre-release version for QA testing. Please do not use in production.
Please refer to CHANGELOG.md for detailed changes.
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk:
git:
url: https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin.git
ref: 7.0.2+1-rc1Run flutter pub get
Test the integration thoroughly
Report any issues to the development team
Note: This is a pre-release and should not be used in production applications.
AppsFlyer Flutter Plugin v7.0.2+2
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk: ^7.0.2+2Then run:
flutter pub getRelease version 7.0.2+2. See CHANGELOG.md for details.
For issues and questions, please contact support@appsflyer.com
$AppsFlyerStrictMode = true
in the app Podfile before pod install to link AppsFlyerRPC/Strict and
AppsFlyerFramework/Strict instead of the Main subspecs (fixes
#473).AppsFlyer Flutter Plugin - Release Candidate 7.0.2+2-rc1
This is a pre-release version for QA testing. Please do not use in production.
Please refer to CHANGELOG.md for detailed changes.
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk:
git:
url: https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin.git
ref: 7.0.2+2-rc1Run flutter pub get
Test the integration thoroughly
Report any issues to the development team
Note: This is a pre-release and should not be used in production applications.
AppsFlyer Flutter Plugin - Release Candidate 7.0.2-rc1
This is a pre-release version for QA testing. Please do not use in production.
Please refer to CHANGELOG.md for detailed changes.
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk:
git:
url: https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin.git
ref: 7.0.2-rc1Run flutter pub get
Test the integration thoroughly
Report any issues to the development team
Note: This is a pre-release and should not be used in production applications.
AppsFlyer Flutter Plugin v6.18.1
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk: ^6.18.1Then run:
flutter pub getRelease version 6.18.1. See CHANGELOG.md for details.
For issues and questions, please contact support@appsflyer.com
AppsFlyer Flutter Plugin - Release Candidate 6.18.1-rc2
This is a pre-release version for QA testing. Please do not use in production.
Please refer to CHANGELOG.md for detailed changes.
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk:
git:
url: https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin.git
ref: 6.18.1-rc2Run flutter pub get
Test the integration thoroughly
Report any issues to the development team
Note: This is a pre-release and should not be used in production applications.
AppsFlyer Flutter Plugin - Release Candidate 6.18.1-rc1
This is a pre-release version for QA testing. Please do not use in production.
Please refer to CHANGELOG.md for detailed changes.
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk:
git:
url: https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin.git
ref: 6.18.1-rc1Run flutter pub get
Test the integration thoroughly
Report any issues to the development team
Note: This is a pre-release and should not be used in production applications.
AppsFlyer Flutter Plugin v6.18.0
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk: ^6.18.0Then run:
flutter pub getRelease version 6.18.0. See CHANGELOG.md for details.
For issues and questions, please contact support@appsflyer.com
DeepLinkListener fires reliably when the app is resumed from a VIEW intent (forward new intents to AppsFlyerLib from the plugin's onNewIntentListener before the SDK's onResume auto-handler marks them af_consumed)ios/appsflyer_sdk/Package.swift), alongside continued full CocoaPods support — no behavior change for existing CocoaPods consumers. Purchase Connector remains CocoaPods-only for now, pending resolution of an upstream Flutter limitation (flutter/flutter#161182) that blocks conditionally-compiled plugin features under SPM.AppsFlyer Flutter Plugin - Release Candidate 6.18.0-rc1
This is a pre-release version for QA testing. Please do not use in production.
Please refer to CHANGELOG.md for detailed changes.
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk:
git:
url: https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin.git
ref: 6.18.0-rc1Run flutter pub get
Test the integration thoroughly
Report any issues to the development team
Note: This is a pre-release and should not be used in production applications.
AppsFlyer Flutter Plugin v6.17.9
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk: ^6.17.9Then run:
flutter pub getRelease version 6.17.9. See CHANGELOG.md for details.
For issues and questions, please contact support@appsflyer.com
FlutterSceneLifeCycleDelegate with compile-time guard for backward compatibilityscene:openURLContexts: for warm-start URI-scheme deep linksscene:willConnectToSession:options: for cold-start URI-scheme and Universal Linksscene:continueUserActivity: for Universal Links via UIScenegetViewController to use UIWindowScene lookup on iOS 13+ (replaces deprecated UIApplication.delegate.window)AppsFlyer Flutter Plugin v6.17.9+1
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk: ^6.17.9+1Then run:
flutter pub getRelease version 6.17.9+1. See CHANGELOG.md for details.
For issues and questions, please contact support@appsflyer.com
AppsFlyer Flutter Plugin - Release Candidate 6.17.9+1-rc1
This is a pre-release version for QA testing. Please do not use in production.
Please refer to CHANGELOG.md for detailed changes.
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk:
git:
url: https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin.git
ref: 6.17.9+1-rc1Run flutter pub get
Test the integration thoroughly
Report any issues to the development team
Note: This is a pre-release and should not be used in production applications.
AppsFlyer Flutter Plugin - Release Candidate 6.17.9-rc1
This is a pre-release version for QA testing. Please do not use in production.
Please refer to CHANGELOG.md for detailed changes.
Add to your pubspec.yaml:
dependencies:
appsflyer_sdk:
git:
url: https://github.com/AppsFlyerSDK/appsflyer-flutter-plugin.git
ref: 6.17.9-rc1Run flutter pub get
Test the integration thoroughly
Report any issues to the development team
Note: This is a pre-release and should not be used in production applications.
Deprecated validateAndLogInAppAndroidPurchase (V1) - use validateAndLogInAppPurchaseV2 instead
validateAndLogInAppAndroidPurchase (V1) - use validateAndLogInAppPurchaseV2 insteadvalidateAndLogInAppIosPurchase (V1) - use validateAndLogInAppPurchaseV2 insteadvalidateAndLogInAppPurchaseV2 with comprehensive NSError parsing (code, domain, userInfo)validateAndLogInAppPurchaseV2 APIPlatformException error handling examples for V2 APINothing published for this version
Added Flutter 3.27+ breaking change documentation for deep linking (must disable Flutter's built-in deep linking to avoid conflicts with AppsFlyer)
af object approach and OneLink URL approachsendPushNotificationData() on iOS when using addPushNotificationDeepLinkPath()effective_dart with flutter_lints in development dependenciesUpdate Android SDK version to 6.17.4
Updated to AppsFlyer SDK v6.17.5 for iOS
Updated to AppsFlyer SDK v6.17.3 for both Android and iOS
Android: Bug fix for users who expirienced NullPointerExceptions.
NullPointerExceptions.Bug fix for users who reported Locale issue on Android, fixed Locale issue by forcing toUpperCase(Locale.ENGLISH)
Nothing published for this version
setConsentData is now deprecated!
Nothing published for this version
Fixed NullPointerException issue on Android that some clients had.
Nothing published for this version
Implementation of the new logAdRevenue API for iOS and Android
Nothing published for this version
Fixed mapOptions issue with manualStart
Bump version to iOS v6.14.2 and Android v6.14.0
Nothing published for this version
- Hotfix for manualStart on iOS
Added new APIs such as anonymizeUser , performOnDeepLinking
anonymizeUser , performOnDeepLinkingstartSDK API, onSuccess and onError callbacksNothing published for this version
Added enableTCFDataCollection , setConsentData with AppsFlyerConsent class
- Update to iOS SDK to v6.13.1
Deprecated CreateOneLinkHttpTask updated to LinkGenerator
null pointer exception fix for android, push notification bug fix & ios sdk 6.11.2
update to Android SDK to v6.11.2
update to Android SDK to v6.11.1
Nothing published for this version
update to Android SDK to v6.9.3 & iOS SDK to v6.9.1
addPushNotificationDeepLinkPath APIsetCustomerIdAndLogSession API for android- update to android v6.8.2
The API enableLocationCollection has been removed.
enableLocationCollection has been removed.setDisableNetworkData has been added.Updated AppsFlyer Android SDK to v6.5.2
New APIs: getOutOfStore, setOutOfStore, setResolveDeepLinkURLs, setPartnerData
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
New API setSharingFilterForPartners.setSharingFilter & setSharingFilterForAllPartners APIs were deprecated.
setSharingFilterForPartners.setSharingFilter & setSharingFilterForAllPartners APIs were deprecated.Added nullable in deeplink object
Nothing published for this version
Updated AppsFlyer iOS SDK to v6.3.5
Added setCurrentDeviceLanguage API
Added setCurrentDeviceLanguage API
Removed streams from the plugin
Removed streams from the plugin
rollback to previous version
rollback to previous version
- fix JNI issue
Your coding agent can read these notes before it upgrades. Set up the MCP server →