Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
5bb82d4
build: bump af-android-plugin-bridge to 7.0.13 and @appsflyer-sdk/js-…
al-af Sep 14, 2026
e24ae2b
feat(android): add setAndroidIdData, setImeiData, and setOaidData API…
al-af Sep 14, 2026
d45e68a
test: add auto-booting and harden process cleanup in scenario runner …
al-af Sep 14, 2026
ccc1dea
ci: support -vN production republishes in release workflows and docum…
al-af Sep 14, 2026
057b8a0
chore(release): record 7.0.2-v2 changelog and update native version-s…
al-af Sep 14, 2026
f00b8f3
Merge pull request #705 from AppsFlyerSDK/dev/DELIVERY-130633/add-and…
al-af Sep 14, 2026
0cddeef
fix(android): default kotlin-stdlib to the Kotlin plugin version
al-af Oct 28, 2026
f38e2dd
fix(android): skip kotlin-android when AGP 9 already registers the ko…
al-af Oct 28, 2026
3e9882a
fix(android): enable buildConfig for BuildConfig.INCLUDE_CONNECTOR
al-af Oct 28, 2026
da00944
fix(expo): forward open and continue events on Expo SDK 58 scene-base…
al-af Oct 28, 2026
16d60c5
fix(expo): remove stale tools:replace entries when preferAppsFlyerBac…
al-af Oct 28, 2026
53bdccd
docs(expo): document plugin order for preferAppsFlyerBackupRules
al-af Oct 28, 2026
004e68a
docs(expo): add optional NSAdvertisingAttributionReportEndpoint step
al-af Oct 28, 2026
76c9904
docs(rules): sync Expo config and testing rules with new tests and be…
al-af Oct 28, 2026
65a47c9
fix(android): move jvmTarget to top-level kotlin compilerOptions and …
al-af Nov 1, 2026
aa69e8e
fix(expo): strip every backup key from tools:replace and warn on plug…
al-af Nov 1, 2026
7810e8d
fix(expo): accept whitespace around the ExpoAppDelegate superclass
al-af Nov 1, 2026
fdda9cd
test: cover RNTransport malformed event handling and listener removal
al-af Nov 1, 2026
3b1658f
chore(e2e): drop unused report format and redundant device lookups
al-af Nov 1, 2026
7fd71a1
docs(expo): correct AppDelegate warning, Swift calls, and backup-rule…
al-af Nov 1, 2026
df0d5b7
docs(rules): align Expo rules and KB with current plugin behavior
al-af Nov 1, 2026
e2d074b
Merge pull request #713 from AppsFlyerSDK/dev/DELIVERY-133635/7.0.4-u…
al-af Nov 1, 2026
2211418
chore: prepare RC 7.0.4-rc1 (iOS 7.0.41, Android 7.0.4, Bridge 7.0.13)
github-actions[bot] Nov 1, 2026
0903a7a
chore: prepare RC 7.0.4-rc1 (iOS 7.0.41, Android 7.0.4, Bridge 7.0.13)
github-actions[bot] Nov 1, 2026
f76e4e6
Update README.md
al-af Nov 1, 2026
9a70d83
Update CHANGELOG.md
al-af Nov 1, 2026
2c0390f
Update CHANGELOG.md
al-af Nov 1, 2026
fcbb199
chore: prepare production release 7.0.4 (from 7.0.4-rc1)
amit-kremer93 Nov 1, 2026
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
3 changes: 1 addition & 2 deletions .af-e2e/test-plan.json
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,6 @@
],

"report": {
"output_dir": ".af-e2e/reports",
"format": "json"
"output_dir": ".af-e2e/reports"
}
}
88 changes: 59 additions & 29 deletions .af-smoke/rc-test-plan.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"_meta": {
"plan_id": "reactnative-rc-smoke",
"plugin": "reactnative",
"version": "1.0.0",
"description": "Post-publish smoke plan for the AppsFlyer React Native plugin. Exercises SMOKE-001/002/003 against example_rc_smoke/, which pins react-native-appsflyer@<X.Y.Z-rcN> from npm. This plan never depends on plugin source.",
"version": "1.1.0",
"description": "Post-publish smoke plan for the AppsFlyer React Native plugin. Exercises SMOKE-001/002/003 (E2E-001/002/003 subset) against example_rc_smoke/, which pins react-native-appsflyer@<X.Y.Z-rcN|X.Y.Z-vN> from npm. This plan never depends on plugin source.",
"platforms": ["android", "ios"],
"schema_version": "1.0.0",
"tooling_contract_ref": "SMOKE-001, SMOKE-002, SMOKE-003"
Expand All @@ -28,33 +28,35 @@
"id": "phase_1",
"name": "Cold launch smoke (RC artifact)",
"scenario_ref": "SMOKE-001",
"description": "Fresh install using the npm-pinned RC build. Validates SDK startup, install conversion data, pre/post-start API markers, and standard events.",
"description": "Fresh install using the npm-pinned RC build. Validates SDK startup, install conversion data, pre/post-start API markers, and standard events. Shorter wait than E2E-001.",
"requires_fresh_install": true,
"requires_device_identity_reset": true,
"wait_after_launch_sec": 60,
"checks": [
{
"id": "sdk_started",
"description": "start returns a result",
"description": "start was called",
"type": "log_contains",
"pattern": "[AF_QA][start] result:",
"fail_action": "abort"
},
{
"id": "conversion_data",
"description": "registerConversionListener callback fires",
"id": "is_first_launch_true",
"description": "registerConversionListener fires with is_first_launch=true",
"type": "log_contains",
"pattern": "[AF_QA][CALLBACK][registerConversionListener]",
"payload_check": {"field": "is_first_launch", "expected": "true"},
"fail_action": "fail"
},
{
"id": "pre_start_complete",
"id": "pre_start_apis_complete",
"description": "Pre-start auto APIs ran",
"type": "log_contains",
"pattern": "[AF_QA][AUTO_APIS] --- Pre-start auto APIs complete ---",
"fail_action": "fail"
},
{
"id": "post_start_complete",
"id": "post_start_apis_complete",
"description": "Post-start auto APIs ran",
"type": "log_contains",
"pattern": "[AF_QA][AUTO_APIS] --- Post-start auto APIs complete ---",
Expand All @@ -69,10 +71,10 @@
"fail_action": "fail"
},
{
"id": "no_fatal",
"description": "No fatal exceptions or process crashes",
"id": "no_fatal_errors",
"description": "No fatal exceptions or SDK errors in logs",
"type": "absent",
"patterns": ["FATAL EXCEPTION", "Process crashed"],
"patterns": ["Fatal Exception", "FATAL EXCEPTION", "[AF_QA][start] error:"],
"fail_action": "fail"
}
]
Expand All @@ -82,7 +84,7 @@
"id": "phase_2",
"name": "Background deep link (RC artifact)",
"scenario_ref": "SMOKE-002",
"description": "Backgrounds the RC build after Phase 1. Deep link returns app to foreground. onDeepLinking fires with expected deep link value.",
"description": "App backgrounded after Phase 1, then deep link triggers re-entry. Verifies URL is delivered to native layer. onDeepLinking attribution (FOUND/value) requires real OneLink and is warn-only in CI.",
"requires_fresh_install": false,
"wait_after_trigger_sec": 15,
"deep_link_url": "afqa-reactnative://deeplink?deep_link_value=qa_deeplink_bg&af_sub1=background_test&pid=testmedia&c=deeplink_test",
Expand All @@ -96,24 +98,38 @@
},
"checks": [
{
"id": "deep_link_received",
"description": "onDeepLinking callback fires",
"id": "deeplink_url_received",
"description": "Deep link URL delivered to native app layer",
"type": "log_contains",
"pattern": "[AF_QA][CALLBACK][onDeepLinking]",
"pattern": "[AF_QA][DEEPLINK_NATIVE]",
"fail_action": "fail"
},
{
"id": "deep_link_value",
"description": "Deep link value matches qa_deeplink_bg",
"id": "deeplink_callback_fired",
"description": "onDeepLinking callback fires after deep link (any status)",
"type": "log_contains",
"pattern": "qa_deeplink_bg",
"pattern": "[AF_QA][CALLBACK][onDeepLinking]",
"fail_action": "fail"
},
{
"id": "no_fatal",
"id": "deeplink_status_found",
"description": "onDeepLinking fires with Status.FOUND (requires real OneLink attribution — expected to warn in CI)",
"type": "log_contains",
"pattern": "status=FOUND",
"fail_action": "warn"
},
{
"id": "deeplink_value_bg",
"description": "deepLinkValue matches qa_deeplink_bg (requires server-side attribution — expected to warn in CI)",
"type": "log_contains",
"pattern": "deepLinkValue=qa_deeplink_bg",
"fail_action": "warn"
},
{
"id": "no_fatal_errors",
"description": "No fatal exceptions after deep link",
"type": "absent",
"patterns": ["FATAL EXCEPTION", "Process crashed"],
"patterns": ["Fatal Exception", "FATAL EXCEPTION"],
"fail_action": "fail"
}
]
Expand All @@ -123,7 +139,7 @@
"id": "phase_3",
"name": "Foreground deep link (RC artifact)",
"scenario_ref": "SMOKE-003",
"description": "Fresh install of the RC build, then deep link while app is in foreground. Verifies SDK start and deep link callback.",
"description": "Fresh install of the RC build. App in foreground after SDK start, then deep link. Attribution checks (FOUND/value) are warn-only in CI.",
"requires_fresh_install": true,
"wait_after_launch_sec": 60,
"wait_after_trigger_sec": 15,
Expand All @@ -145,24 +161,38 @@
"fail_action": "abort"
},
{
"id": "deep_link_received",
"description": "onDeepLinking callback fires after foreground deep link",
"id": "deeplink_url_received",
"description": "Deep link URL delivered to native app layer",
"type": "log_contains",
"pattern": "[AF_QA][CALLBACK][onDeepLinking]",
"pattern": "[AF_QA][DEEPLINK_NATIVE]",
"fail_action": "fail"
},
{
"id": "deep_link_value",
"description": "Deep link value matches qa_deeplink_fg",
"id": "deeplink_callback_fired",
"description": "onDeepLinking callback fires after deep link (any status)",
"type": "log_contains",
"pattern": "qa_deeplink_fg",
"pattern": "[AF_QA][CALLBACK][onDeepLinking]",
"fail_action": "fail"
},
{
"id": "no_fatal",
"id": "deeplink_status_found",
"description": "onDeepLinking fires with Status.FOUND (requires real OneLink attribution — expected to warn in CI)",
"type": "log_contains",
"pattern": "status=FOUND",
"fail_action": "warn"
},
{
"id": "deeplink_value_fg",
"description": "deepLinkValue matches qa_deeplink_fg (requires server-side attribution — expected to warn in CI)",
"type": "log_contains",
"pattern": "deepLinkValue=qa_deeplink_fg",
"fail_action": "warn"
},
{
"id": "no_fatal_errors",
"description": "No fatal exceptions",
"type": "absent",
"patterns": ["FATAL EXCEPTION", "Process crashed"],
"patterns": ["Fatal Exception", "FATAL EXCEPTION"],
"fail_action": "fail"
}
]
Expand Down
16 changes: 11 additions & 5 deletions .claude/rules/expo-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,25 @@ expo/

`withAppsFlyerIos.js`'s `modifySwiftAppDelegate` string-matches Expo's default Swift AppDelegate template (`didFinishLaunchingWithOptions`/`openURL`/`continueUserActivity`) and injects `handleLaunchOptions`/`handleOpen`/`continueUserActivity` calls via `AppsFlyerAttribution.shared` (one `import react_native_appsflyer`, no `AppsFlyerLib` import needed). `modifyObjcAppDelegate` handles the legacy ObjC template the same way.

Both matchers are exact-string-match against one template shape — if Expo/RN changes the default AppDelegate boilerplate, the matcher silently misses (falls through to `WarningAggregator.addWarningIOS`, not a build failure) instead of adapting. Re-verify the matched strings against a fresh `expo prebuild` output whenever bumping the supported Expo SDK version.
Expo SDK 58's scene-based template inherits `openURL`/`continueUserActivity` from `ExpoAppDelegate` instead of declaring them. The matcher requires `AppDelegate` subclassing exactly `ExpoAppDelegate` (`\b` word boundary; whitespace allowed around `:`), so other superclasses are skipped. When that class is present and a handler is missing, `modifySwiftAppDelegate` inserts it and forwards to `super`, so Expo subscribers keep receiving the event; it also skips a handler the app already declares.

## Manifest merge is not idempotent
The ObjC matcher and all three Swift injections into existing methods (`didFinishLaunchingWithOptions`, `openURL`, `continueUserActivity`) are exact-string-match against one template shape (only the missing-handler detection uses regexes) — if Expo/RN changes that boilerplate, the matcher silently misses (falls through to `WarningAggregator.addWarningIOS`, not a build failure) instead of adapting. Re-verify the matched strings against a fresh `expo prebuild` output whenever bumping the supported Expo SDK version.

`withAppsFlyerAndroid.js` appends `tools:replace` entries to `AndroidManifest.xml` without checking for existing entries — repeated `expo prebuild` (without `--clean`) duplicates them and breaks the Android build. Always check if the entry exists before appending.
## Manifest edits

`withAppsFlyerAndroid.js` never adds `tools:replace` entries. With `preferAppsFlyerBackupRules` it sets `xmlns:tools` when missing, deletes `android:dataExtractionRules`/`android:fullBackupContent`, and removes those names from `tools:replace`. The purchase-connector gradle property is added only when absent. Repeated `expo prebuild` cannot duplicate entries from this file. With the flag off, the plugin does not touch the manifest.

Expo runs mods in reverse `plugins` order, so list `react-native-appsflyer` before the plugin that adds the backup attributes (e.g. `expo-secure-store`). Listed after it, our mod runs first, finds nothing to remove, and `WarningAggregator` warns about plugin order.

## Expo Go incompatibility

Requires native modules unavailable in Expo Go — only works in development builds (`eas build --profile development`) or bare workflow.

## No test coverage
## Test coverage

Zero test coverage on the config plugins. Manual test with `expo prebuild --clean` on both platforms after any change.
- `__tests__/expo-app-delegate.test.js`: Swift SDK 54/57/58 fixtures, ObjC AppDelegate, Podfile strict-mode and purchase-connector flags.
- `__tests__/expo-android-backup-rules.test.js`: `tools:replace` cleanup, purchase-connector Gradle property, manifest with no application tag.
- Still run `expo prebuild --clean` on both platforms after any plugin change.

## Peer dependency

Expand Down
6 changes: 3 additions & 3 deletions .claude/rules/known-issues-kb.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ Both native bridges used to hold `init`/listener-registration RPCs in a JS-side

## Expo compatibility

### Duplicate manifest entries
**Root cause:** `withAppsFlyerAndroid.js` is not idempotent.
**Fix:** use `expo prebuild --clean`, not plain `expo prebuild`.
### Stale `tools:replace` after `preferAppsFlyerBackupRules`
**Root cause:** another config plugin lists the backup attributes in `tools:replace`; deleting the attributes leaves that entry naming attributes that no longer exist. [#706](https://github.com/AppsFlyerSDK/appsflyer-react-native-plugin/issues/706) reports a manifest-merge failure; not reproduced, only the stale entry was. `expo-secure-store` 58.0.2 alone does not write `tools:replace`.
**Fix:** `withAppsFlyerAndroid.js` now removes the stale names (unreleased, fixed on the 7.0.4 branch). `react-native-appsflyer` must be listed before the other plugin in `app.json`, since Expo runs mods in reverse order. `withAppsFlyerAndroid.js` itself is idempotent; it never appends entries.

## Runtime crashes

Expand Down
2 changes: 1 addition & 1 deletion .claude/rules/native-android.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Emitted via `reactApplicationContext.emitDeviceEvent("RNAppsFlyer_rpcEvent", pay

## Build setup

`android/build.gradle` pins `af-android-plugin-bridge:7.0.12` explicitly — `af-android-sdk-bom:7.0.1` doesn't carry a matching version. `namespace` is declared for AGP 8.0+. `minSdkVersion` defaults to 21 — verify `plugin_bridge`'s own `minSdkVersion` is ≤21 before release.
`android/build.gradle` pins `af-android-plugin-bridge:7.0.13` explicitly — `af-android-sdk-bom:7.0.1` doesn't carry a matching version. `namespace` is declared for AGP 8.0+. `minSdkVersion` defaults to 21 — verify `plugin_bridge`'s own `minSdkVersion` is ≤21 before release.

`AppsFlyerRpcHandler`'s constructor takes `contextProvider: () -> Context`, not `context: Context` — a named-arg call using `context =` fails to compile. `RNAppsFlyerModule.kt` passes `contextProvider = { reactApplicationContext.currentActivity ?: reactApplicationContext }`, invoked fresh on every call (not cached), so `init()` can backfill a missed `onActivityResumed` transition instead of stalling session-ready.

Expand Down
2 changes: 1 addition & 1 deletion .claude/rules/release-versioning.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ Deprecated methods must keep working at runtime. Add a backward-compat test in `

## Tag convention

All tags use the `v` prefix (`v6.18.0`, `v7.0.2`, ...). `release.yml` tags every production release (`v$VERSION`) and every RC (`v$VERSION-rcN`).
All tags use the `v` prefix (`v6.18.0`, `v7.0.2`, `v7.0.2-v2`, ...). `release.yml` accepts `X.Y.Z-rcN` on the RC path, and `X.Y.Z` or `X.Y.Z-vN` on production. GitHub tags are always `v$VERSION` (so `7.0.2-v2` becomes `v7.0.2-v2`). `-vN` is part of the version identity and is not stripped on promote.

## Native SDK dependency update

Expand Down
4 changes: 3 additions & 1 deletion .claude/rules/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ paths:
| `compatibility.test.js` | Backward compat for consent, StoreKit, callbacks |
| `linting.test.js` | ESLint validation of source files |
| `purchase-connector.test.ts` | PurchaseConnector models + interface (legacy bridge, unchanged) |
| `expo-app-delegate.test.js` | Expo config plugin: Swift AppDelegate patching against SDK 54/57/58 fixtures (`__tests__/fixtures/app-delegates/`) |
| `expo-android-backup-rules.test.js` | Expo config plugin: stale `tools:replace` cleanup when `preferAppsFlyerBackupRules` is set |

## Mock-and-verify pattern

Expand Down Expand Up @@ -64,4 +66,4 @@ Don't assert constants equal themselves — a test must be able to fail if the i

## Known coverage gaps

Native-level iOS XCTest / Android JUnit for the RPC handlers, Expo config plugin tests, and live-device quickstart scenarios (killed-state deep link, full parity) are not yet covered.
Native-level iOS XCTest / Android JUnit for the RPC handlers and live-device quickstart scenarios (killed-state deep link, full parity) are not yet covered.
6 changes: 3 additions & 3 deletions .github/workflows/rc-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ on:
workflow_dispatch:
inputs:
rc_version:
description: 'RC version to smoke, e.g. 6.18.0-rc1 (must exist on npm)'
description: 'RC version to smoke, e.g. 6.18.0-rc1 or 7.0.2-v2 (must exist on npm)'
required: true
type: string
release_branch:
Expand Down Expand Up @@ -117,8 +117,8 @@ jobs:
# published. Dry runs naturally fail the visibility poll below and
# emit a skipped check-run.
VERSION=$(node -p "require('./package.json').version")
if [[ ! "$VERSION" =~ -rc[0-9]+$ ]]; then
echo "package.json version is not an RC ($VERSION); skipping."
if [[ ! "$VERSION" =~ -(rc|v)[0-9]+$ ]]; then
echo "package.json version is not an RC or -vN tag ($VERSION); skipping."
echo "should_run=false" >> "$GITHUB_OUTPUT"
echo "skip_reason=not_rc_version" >> "$GITHUB_OUTPUT"
echo "rc_version=$VERSION" >> "$GITHUB_OUTPUT"
Expand Down
13 changes: 7 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ on:
- rc
- production
rn_version:
description: 'Plugin version (e.g., 6.18.0-rc1 for RC, 6.18.0 for production)'
description: 'Plugin version (e.g., 6.18.0-rc1 for RC, 6.18.0 or 7.0.2-v2 for production)'
required: true
type: string
ios_sdk_version:
Expand Down Expand Up @@ -610,12 +610,12 @@ jobs:
echo "Extracted version from package.json: $VERSION"
fi

# Validate version format (X.Y.Z, no -rc suffix for production)
if [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
# Validate version format (X.Y.Z or X.Y.Z-vN; no -rc suffix for production)
if [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+(-v[0-9]+)?$ ]]; then
echo "Valid production version format: $VERSION"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
else
echo "::error::Invalid production version format: $VERSION (expected X.Y.Z)"
echo "::error::Invalid production version format: $VERSION (expected X.Y.Z or X.Y.Z-vN)"
exit 1
fi

Expand Down Expand Up @@ -728,7 +728,7 @@ jobs:
if [[ "$TAG" == "rc" ]]; then
npm publish --tag rc --provenance
else
npm publish --provenance
npm publish --tag latest --provenance
fi
echo "Published $VERSION to npm"

Expand Down Expand Up @@ -1242,7 +1242,8 @@ jobs:
CI_JIRA_DOMAIN: ${{ secrets.CI_JIRA_DOMAIN }}
run: |
set +e
JIRA_FIX_VERSION="React Native SDK v$VERSION"
BASE_VERSION="${VERSION%%-v*}"
JIRA_FIX_VERSION="React Native SDK v$BASE_VERSION"

echo "Looking for Jira tickets with fix version: $JIRA_FIX_VERSION"

Expand Down
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
## 7.0.4
Release date: *2026-11-01*

### Changes
- React Native >> iOS native SDK 7.0.4 (`AppsFlyerRPC` 7.0.41); Android `af-android-sdk` 7.0.4 + `af-android-plugin-bridge` 7.0.13
- React Native >> iOS `PurchaseConnector` pod 7.0.4
- React Native >> Android Gradle Plugin 9 support: `jvmTarget` moved to the top-level `kotlin { compilerOptions }` block, `kotlin-android` is applied only when AGP doesn't already register the Kotlin extension, and the explicit `kotlin-stdlib` dependency was dropped (the Kotlin plugin adds a matching one)
- React Native >> Fix Android builds failing on `BuildConfig.INCLUDE_CONNECTOR` when the host app disables `buildConfig` (the AGP 9 default)
- React Native >> Expo config plugin: support the Expo SDK 58 scene-based `AppDelegate` — open-URL and universal-link (`continueUserActivity`) events are now forwarded to `AppsFlyerAttribution.shared`
- React Native >> Expo config plugin: accept extra whitespace around the `ExpoAppDelegate` superclass when patching `AppDelegate.swift`
- React Native >> Expo config plugin: `preferAppsFlyerBackupRules` now removes stale `android:dataExtractionRules` / `android:fullBackupContent` entries from `tools:replace`, which previously failed the manifest merge, and warns during `expo prebuild` when another plugin adds the backup attributes after AppsFlyer's runs
- React Native >> Docs: Expo plugin ordering for `preferAppsFlyerBackupRules`, and an optional `NSAdvertisingAttributionReportEndpoint` step

## 7.0.2-v2
Release date: *2026-09-14*

- React Native >> `@appsflyer-sdk/js-core-plugin` 7.1.0
- React Native >> Android `af-android-plugin-bridge` 7.0.13
- React Native >> Added Android ID setters `setAndroidIdData`, `setImeiData`, and `setOaidData`

## 7.0.2
Release date: *2026-08-26*

Expand Down
Loading
Loading