Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
- Updated iOS SDK from 6.17.9 to 6.18.0
- Updated iOS Purchase Connector from 6.17.9 to 6.18.0
- Fixed Android warm-app deep link consumption race so `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`)
- Added Swift Package Manager (SPM) support for the Core iOS integration (`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](https://github.com/flutter/flutter/issues/161182)) that blocks conditionally-compiled plugin features under SPM.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good release note. The ticket also asks for the user-facing guides though, and doc/Installation.md and doc/PurchaseConnector.md still say nothing about SPM or that Purchase Connector needs CocoaPods.
Can we add that so PC users don't just hit a MissingPluginException with no explanation?


## 6.17.9

Expand Down
7 changes: 7 additions & 0 deletions doc/Installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ flutter pub add appsflyer_sdk

This will download the AppsFlyer flutter plugin to your project, you may observe the changes in your `pubspec.yaml` file.

---
## iOS: Swift Package Manager (SPM) support

Starting with v6.18.0, the plugin's **Core** integration supports Swift Package Manager on iOS, alongside continued full CocoaPods support. If your app has SPM enabled (the default on Flutter 3.44+, or via `flutter config --enable-swift-package-manager` on Flutter 3.24+), no extra setup is needed — Flutter's tooling picks up the plugin's `Package.swift` automatically.

**Purchase Connector is CocoaPods-only.** If your app uses the [Purchase Connector](PurchaseConnector.md), it must stay on CocoaPods for now — there is no SPM opt-in path for it yet, pending resolution of an upstream Flutter limitation ([flutter/flutter#161182](https://github.com/flutter/flutter/issues/161182)). Apps that need both SPM (for Core) and Purchase Connector (via CocoaPods) can use both simultaneously; Flutter's tooling handles this automatically as long as your `Podfile` still exists.

---
## Huawei Referrer
Huawei Referrer is supported in SDK v6.14.0 and above.
Expand Down
2 changes: 2 additions & 0 deletions doc/PurchaseConnector.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ appsflyer.enable_purchase_connector=true
```
Once you set these properties, the Purchase Validation feature will be integrated into your project and you can utilize its functionality in your app.

> ⚠️ **iOS + Swift Package Manager**: Purchase Connector requires **CocoaPods** — there is no Swift Package Manager opt-in path for it. This is a temporary limitation pending an upstream Flutter fix ([flutter/flutter#161182](https://github.com/flutter/flutter/issues/161182)). If your app has adopted SPM for the Core integration (see [Installation.md](Installation.md#ios-swift-package-manager-spm-support)), keep your `Podfile` in place and set `$AppsFlyerPurchaseConnector = true` there as above — Flutter's tooling will use SPM for Core and CocoaPods for Purchase Connector at the same time. If you skip the Podfile entirely (SPM-only), calling any Purchase Connector API will silently fail with a `MissingPluginException` — see the next section.

### What Happens if You Use Dart Files Without Opting In?

The Dart files for the Purchase Validation feature are always included in the plugin. If you try to use these Dart APIs without opting into the feature, the APIs will not have effect because the corresponding native code necessary for them to function will not be included in your project.
Expand Down
6 changes: 3 additions & 3 deletions internal-docs/features/F-001-sdk-initialization.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ AppsflyerSdk.initSdk({registerConversionDataCallback, registerOnAppOpenAttributi
→ Android: AppsflyerSdkPlugin.onMethodCall("initSdk") → initSdk(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().init(afDevKey, gcdListener, mContext)
→ instance.start(activity) [only if isManualStartMode == false]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("initSdk") → initSdkWithCall:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("initSdk") → initSdkWithCall:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ [AppsFlyerLib shared].appsFlyerDevKey / .appleAppID / .isDebug = ...
→ [[AppsFlyerLib shared] start] [only if manualStart == NO]
```
Expand All @@ -45,8 +45,8 @@ AppsflyerSdk.initSdk({registerConversionDataCallback, registerOnAppOpenAttributi
| `lib/src/appsflyer_constants.dart` | String keys shared across Dart/native (`AF_DEV_KEY`, `AF_APP_Id`, `AF_MANUAL_START`, `AF_GCD`, `AF_UDL`, `PLUGIN_VERSION`) |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `initSdk(call, result)` — native Android init, conditional auto-start |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsFlyerConstants.java` | Native Android mirror of the Dart string keys |
| `ios/Classes/AppsflyerSdkPlugin.m` | `initSdkWithCall:result:` — native iOS init, conditional auto-start |
| `ios/Classes/AppsflyerSdkPlugin.h` | `#define` string keys (`afDevKey`, `afAppId`, `afManualStart`, …) and `kAppsFlyerPluginVersion` |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `initSdkWithCall:result:` — native iOS init, conditional auto-start |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/include/appsflyer_sdk/AppsflyerSdkPlugin.h` | `#define` string keys (`afDevKey`, `afAppId`, `afManualStart`, …) and `kAppsFlyerPluginVersion` |

---

Expand Down
4 changes: 2 additions & 2 deletions internal-docs/features/F-002-sdk-start.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ AppsflyerSdk.startSDK({onSuccess, onError}) [li
→ Android: AppsflyerSdkPlugin.startSDKwithHandler(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().start(activity, null, AppsFlyerRequestListener)
→ onSuccess()/onError() → mMethodChannel.invokeMethod("onSuccess"|"onError")
→ iOS: AppsflyerSdkPlugin.startSDKwithHandler:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.startSDKwithHandler:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ [[AppsFlyerLib shared] startWithCompletionHandler:^(...)]
→ [_methodChannel invokeMethod:@"onSuccess"|@"onError" ...]
→ else:
Expand All @@ -46,7 +46,7 @@ AppsflyerSdk.startSDK({onSuccess, onError}) [li
|------|------|
| `lib/src/appsflyer_sdk.dart` | `startSDK()` — guards double-start via `_isSdkStarted`, chooses handler vs. plain path |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `startSDK`, `startSDKwithHandler` — native start, posts `onSuccess`/`onError` back on the UI thread |
| `ios/Classes/AppsflyerSdkPlugin.m` | `startSDK:result:`, `startSDKwithHandler:result:` — native start, dispatches completion handler results on main queue |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `startSDK:result:`, `startSDKwithHandler:result:` — native start, dispatches completion handler results on main queue |

---

Expand Down
4 changes: 2 additions & 2 deletions internal-docs/features/F-003-sdk-plugin-version-retrieval.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ AppsflyerSdk.getSDKVersion() [lib/src/a
→ _methodChannel.invokeMethod("getSDKVersion")
→ Android: AppsflyerSdkPlugin.onMethodCall("getSDKVersion") → getSdkVersion(result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().getSdkVersion()
→ iOS: AppsflyerSdkPlugin.handleMethodCall("getSDKVersion") → getSDKVersion:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("getSDKVersion") → getSDKVersion:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ [[AppsFlyerLib shared] getSDKVersion]

AppsflyerSdk.getVersionNumber() [lib/src/appsflyer_sdk.dart]
Expand All @@ -41,7 +41,7 @@ AppsflyerSdk.getVersionNumber() [lib/src/a
| `lib/src/appsflyer_sdk.dart` | `getSDKVersion()` (async, native round-trip), `getVersionNumber()` (sync, local constant) |
| `lib/src/appsflyer_constants.dart` | `PLUGIN_VERSION` constant returned by `getVersionNumber()` |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `getSdkVersion(result)` — proxies `AppsFlyerLib.getInstance().getSdkVersion()` |
| `ios/Classes/AppsflyerSdkPlugin.m` | `getSDKVersion:result:` — proxies `[AppsFlyerLib shared] getSDKVersion]` |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `getSDKVersion:result:` — proxies `[AppsFlyerLib shared] getSDKVersion]` |

---

Expand Down
4 changes: 2 additions & 2 deletions internal-docs/features/F-004-in-app-event-logging.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ AppsflyerSdk.logEvent(eventName, eventValues)
→ Android: AppsflyerSdkPlugin.onMethodCall("logEvent") → logEvent(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().logEvent(mContext, eventName, eventValues)
→ result.success(true)
→ iOS: AppsflyerSdkPlugin.handleMethodCall("logEvent") → logEventWithCall:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("logEvent") → logEventWithCall:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ [[AppsFlyerLib shared] logEvent:eventName withValues:eventValues]
→ result(@YES)
```
Expand All @@ -39,7 +39,7 @@ AppsflyerSdk.logEvent(eventName, eventValues)
|------|------|
| `lib/src/appsflyer_sdk.dart` | `logEvent(String eventName, Map? eventValues)` — Dart public API, returns `Future<bool?>` |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `logEvent(MethodCall, Result)` — reads `AF_EVENT_NAME`/`AF_EVENT_VALUES` args, forwards to `AppsFlyerLib.getInstance().logEvent(mContext, eventName, eventValues)`, always returns `result.success(true)` |
| `ios/Classes/AppsflyerSdkPlugin.m` | `logEventWithCall:result:` — reads `eventName`/`eventValues` (normalizes `NSNull` to `nil`), forwards to `[[AppsFlyerLib shared] logEvent:withValues:]`, always returns `result(@YES)`; comment `//TODO: Add callback handler` marks that no completion callback is wired |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `logEventWithCall:result:` — reads `eventName`/`eventValues` (normalizes `NSNull` to `nil`), forwards to `[[AppsFlyerLib shared] logEvent:withValues:]`, always returns `result(@YES)`; comment `//TODO: Add callback handler` marks that no completion callback is wired |
| `doc/InAppEvents.md` | Public integration guide with usage example |

---
Expand Down
4 changes: 2 additions & 2 deletions internal-docs/features/F-005-ad-revenue-logging.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ AppsflyerSdk.logAdRevenue(AdRevenueData)
→ new AFAdRevenueData(monetizationNetwork, mediationNetwork, currencyIso4217Code, revenue)
→ AppsFlyerLib.getInstance().logAdRevenue(adRevenueData, additionalParameters)
→ result.success(true) | result.error(...) on invalid/unexpected input
→ iOS: AppsflyerSdkPlugin.handleMethodCall("logAdRevenue") → logAdRevenue:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("logAdRevenue") → logAdRevenue:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ getEnumValueFromString: maps the Dart enum's string value to AppsFlyerAdRevenueMediationNetworkType
→ [[AFAdRevenueData alloc] initWithMonetizationNetwork:mediationNetwork:currencyIso4217Code:eventRevenue:]
→ [[AppsFlyerLib shared] logAdRevenue:additionalParameters:]
Expand All @@ -45,7 +45,7 @@ AppsflyerSdk.logAdRevenue(AdRevenueData)
| `lib/src/appsflyer_ad_revenue_data.dart` | `AdRevenueData` model: `monetizationNetwork`, `mediationNetwork` (String), `currencyIso4217Code`, `revenue` (double), optional `additionalParameters` |
| `lib/src/appsflyer_constants.dart` | `AFMediationNetwork` enum with a `.value` getter mapping each case (e.g. `applovinMax`) to the exact lowercase/snake_case string (`"applovin_max"`) both native sides expect |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `logAdRevenue(MethodCall, Result)` — validates required args via `requireNonNullArgument`, converts the mediation-network string to the native `MediationNetwork` enum via `.valueOf(...toUpperCase())`, builds `AFAdRevenueData`, calls `AppsFlyerLib.getInstance().logAdRevenue(...)` |
| `ios/Classes/AppsflyerSdkPlugin.m` | `logAdRevenue:result:` and `getEnumValueFromString:` — validates required args, maps the mediation-network string to `AppsFlyerAdRevenueMediationNetworkType` via an explicit `NSDictionary` lookup table, builds `AFAdRevenueData`, calls `[[AppsFlyerLib shared] logAdRevenue:additionalParameters:]` |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `logAdRevenue:result:` and `getEnumValueFromString:` — validates required args, maps the mediation-network string to `AppsFlyerAdRevenueMediationNetworkType` via an explicit `NSDictionary` lookup table, builds `AFAdRevenueData`, calls `[[AppsFlyerLib shared] logAdRevenue:additionalParameters:]` |
| `doc/API.md` | `logAdRevenue` / `AdRevenueData` / `AFMediationNetwork` public documentation and usage example |

---
Expand Down
4 changes: 2 additions & 2 deletions internal-docs/features/F-006-custom-host-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ AppsflyerSdk.setHost(hostPrefix, hostName) [lib/src
→ _methodChannel.invokeMethod("setHost", {hostPrefix, hostName})
→ Android: AppsflyerSdkPlugin.onMethodCall("setHost") → setHost(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().setHost(hostPrefix, hostName)
→ iOS: AppsflyerSdkPlugin.handleMethodCall("setHost") → setHost:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("setHost") → setHost:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ [[AppsFlyerLib shared] setHost:hostName withHostPrefix:hostPrefix]

AppsflyerSdk.getHostName() / getHostPrefix()
Expand All @@ -43,7 +43,7 @@ AppsflyerSdk.getHostName() / getHostPrefix()
| `lib/src/appsflyer_sdk.dart` | `setHost`, `getHostName`, `getHostPrefix` |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `setHost`, `getHostName`, `getHostPrefix` native handlers |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsFlyerConstants.java` | `AF_HOST_PREFIX`, `AF_HOST_NAME` argument key constants |
| `ios/Classes/AppsflyerSdkPlugin.m` | `setHost:result:`, `getHostName:result:`, `getHostPrefix:result:` native handlers |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `setHost:result:`, `getHostName:result:`, `getHostPrefix:result:` native handlers |

---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ AppsflyerSdk.setCollectAndroidId(isCollect) [lib/src
→ Android: AppsflyerSdkPlugin.onMethodCall("setCollectAndroidId") → setCollectAndroidId(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().setCollectAndroidID(isCollect)
```
No iOS branch exists for either method name in `ios/Classes/AppsflyerSdkPlugin.m`'s `handleMethodCall:` — on iOS these calls fall through to `result(FlutterMethodNotImplemented)`.
No iOS branch exists for either method name in `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m`'s `handleMethodCall:` — on iOS these calls fall through to `result(FlutterMethodNotImplemented)`.

---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ AppsflyerSdk.setAndroidIdData(androidId) [lib/src
→ Android: AppsflyerSdkPlugin.onMethodCall("setAndroidIdData") → setAndroidIdData(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().setAndroidIdData(androidId)
```
No iOS branch exists for either method name in `ios/Classes/AppsflyerSdkPlugin.m`'s `handleMethodCall:`.
No iOS branch exists for either method name in `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m`'s `handleMethodCall:`.

---

Expand Down
4 changes: 2 additions & 2 deletions internal-docs/features/F-009-min-time-between-sessions.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ AppsflyerSdk.setMinTimeBetweenSessions(seconds) [lib/sr
→ _methodChannel.invokeMethod("setMinTimeBetweenSessions", {'seconds': seconds})
→ Android: AppsflyerSdkPlugin.onMethodCall("setMinTimeBetweenSessions") → setMinTimeBetweenSessions(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().setMinTimeBetweenSessions(seconds)
→ iOS: AppsflyerSdkPlugin.handleMethodCall("setMinTimeBetweenSessions") → setMinTimeBetweenSessions:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("setMinTimeBetweenSessions") → setMinTimeBetweenSessions:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ [AppsFlyerLib shared].minTimeBetweenSessions = seconds
```

Expand All @@ -38,7 +38,7 @@ AppsflyerSdk.setMinTimeBetweenSessions(seconds) [lib/sr
|------|------|
| `lib/src/appsflyer_sdk.dart` | `setMinTimeBetweenSessions(int)` — asserts non-negative seconds, dispatches to channel |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `setMinTimeBetweenSessions` native handler |
| `ios/Classes/AppsflyerSdkPlugin.m` | `setMinTimeBetweenSessions:result:` native handler (direct property assignment) |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `setMinTimeBetweenSessions:result:` native handler (direct property assignment) |

---

Expand Down
4 changes: 2 additions & 2 deletions internal-docs/features/F-010-currency-code-setting.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ AppsflyerSdk.setCurrencyCode(currencyCode)
→ Android: AppsflyerSdkPlugin.onMethodCall("setCurrencyCode") → setCurrencyCode(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().setCurrencyCode(currencyCode)
→ result.success(null)
→ iOS: AppsflyerSdkPlugin.handleMethodCall("setCurrencyCode") → setCurrencyCode:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("setCurrencyCode") → setCurrencyCode:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ [[AppsFlyerLib shared] setCurrencyCode:currencyCode]
→ result(nil)
```
Expand All @@ -39,7 +39,7 @@ AppsflyerSdk.setCurrencyCode(currencyCode)
|------|------|
| `lib/src/appsflyer_sdk.dart` | `setCurrencyCode(String currencyCode)` — platform-agnostic Dart API, `void` |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `setCurrencyCode(MethodCall, Result)` — forwards to `AppsFlyerLib.getInstance().setCurrencyCode(currencyCode)` |
| `ios/Classes/AppsflyerSdkPlugin.m` | `setCurrencyCode:result:` — forwards to `[[AppsFlyerLib shared] setCurrencyCode:]` |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `setCurrencyCode:result:` — forwards to `[[AppsFlyerLib shared] setCurrencyCode:]` |
| `doc/API.md` | Public documentation for `setCurrencyCode` |

---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ AppsflyerSdk.enableTCFDataCollection(shouldCollect) [lib/sr
→ _methodChannel.invokeListMethod("enableTCFDataCollection", {'shouldCollect': shouldCollect})
→ Android: AppsflyerSdkPlugin.onMethodCall("enableTCFDataCollection") → enableTCFDataCollection(call, result) [android/.../AppsflyerSdkPlugin.java]
→ AppsFlyerLib.getInstance().enableTCFDataCollection(shouldCollect)
→ iOS: AppsflyerSdkPlugin.handleMethodCall("enableTCFDataCollection") → enableTCFDataCollection:result: [ios/Classes/AppsflyerSdkPlugin.m]
→ iOS: AppsflyerSdkPlugin.handleMethodCall("enableTCFDataCollection") → enableTCFDataCollection:result: [ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m]
→ [[AppsFlyerLib shared] enableTCFDataCollection:shouldCollect]
```

Expand All @@ -37,7 +37,7 @@ AppsflyerSdk.enableTCFDataCollection(shouldCollect) [lib/sr
|------|------|
| `lib/src/appsflyer_sdk.dart` | `enableTCFDataCollection(bool)` |
| `android/src/main/java/com/appsflyer/appsflyersdk/AppsflyerSdkPlugin.java` | `enableTCFDataCollection` native handler |
| `ios/Classes/AppsflyerSdkPlugin.m` | `enableTCFDataCollection:result:` native handler |
| `ios/appsflyer_sdk/Sources/appsflyer_sdk/AppsflyerSdkPlugin.m` | `enableTCFDataCollection:result:` native handler |
| `doc/DMA.md` | Integration guide documenting the required manual-start + CMP sequencing |

---
Expand Down
Loading
Loading