NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
iOS and macOS implementation of the Attriax plugin.
Last release 2 months ago
15 Jul 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 8 of 8 stable releases
Nothing withdrawn
no release was ever pulled
5 months old
8 releases · first in 2026
One column per month.
Swift Package Manager support: Package.swift manifests for the iOS and macOS plugins. Flutter 3.44 makes SwiftPM the default; the podspecs are kept as
Package.swift manifests for the iOS and macOS plugins. Flutter 3.44 makes SwiftPM the default; the podspecs are kept as the CocoaPods fallback for older Flutter versions.recordAdEvent was not resolved from the eventName wire key and did not reach the engine.Breaking: AttriaxConfig now requires projectToken; the deprecated appToken constructor alias and getter were removed.
package:attriax_flutter/attriax.dart that re-exports everything from attriax_flutter.dart (the old import remains a supported alias).isBot and botDetectedVia in the device context (WebDriver, headless/zero-size screen, and known bot user agents).Europe/ (French Guiana, Guadeloupe, Saint-Martin, Martinique, Saint-Barthélemy, Mayotte, Réunion).init() now rejects an empty projectToken, a non-positive maxQueueSize, and negative flush/ATT-timeout durations with an ArgumentError.validateReceipt(...) now takes a single required String receipt plus test, provider, environment, productId, and transactionId; the previous per-store fields (originalTransactionId, store, packageName, purchaseToken, receiptData, signedPayload, receiptSignature) were removed, and receipt must be non-empty.deepLinks.recordDeepLink(...) now requires uri; the optional linkPath parameter was removed.AttriaxConfig now requires projectToken; the deprecated appToken constructor alias and getter were removed.Attriax.init({bool? enabled}) no longer accepts an enabled argument; use tracking.enabled before or after init() to control event delivery.recordEvent, recordPurchase, recordRefund, recordAdRevenue, recordAdEvent, recordPageView, recordError, setUser, setUserProperty, setUserProperties, clearUserProperties) now return void (fire-and-forget) instead of Future<void>.Retry-After, instead of being re-flushed with no spacing; a Retry-After of 0 or negative also falls back to backoff rather than an immediate retry.408 (Request Timeout) and 425 (Too Early) in addition to 429 and all 5xx.recordDeepLink) is now time-bounded (30s) and throws TimeoutException if it does not complete, instead of hanging indefinitely while offline; the underlying request still follows the normal queue/retry policy.referrer.getLatestDeepLinkReferrer() now returns null immediately when no deep link has been handled yet, instead of waiting for the next deep-link event.null) instead of surfacing a delivery error from the referrer getters.projectToken/uri API changes). No Apple-only public API changes are required.Breaking: removed the deprecated GDPR auto-detection toggle from the shared Flutter AttriaxConfig.
AttriaxConfig.attriax.tracking as the focused Flutter facade for custom events, page views, revenue, ads, uninstall-token registration, user identity, and manual er
attriax.tracking as the focused Flutter facade for custom events, page views, revenue, ads, uninstall-token registration, user identity, and manual error reporting.anonymousTracking on AttriaxConfig, runtime attriax.tracking.anonymousTrackingEnabled, and attriax.consent.gdpr.requestDataErasure() for GDPR-erasure flows.example-rich/ so the publishable package example can stay integration-focused.example-gdpr/ app for manual GDPR consent, anonymous-tracking, and data-erasure QA.Attriax; use attriax.tracking.* instead.attriax.eventsEnabled to attriax.tracking.enabled.attriax.deepLinks.createDynamicLink(...) and attriax.deepLinks.recordDeepLink(...).attriax.consent.att.getTrackingAuthorizationStatus() and attriax.consent.att.requestTrackingAuthorization().anonymousTracking: false to keep that work in memory until consent allows identified delivery.validateReceipt(...) stays on the root Attriax entrypoint and remains available even when tracking is disabled or GDPR consent is still pending.example-rich/.Regulation-scoped GDPR consent APIs under attriax.consent.gdpr, including local and remote needsConsent() checks, explicit category decisions, setNotR
attriax.consent.gdpr, including local and remote needsConsent() checks, explicit category decisions, setNotRequired(), and reset().attriax_api_client package.attriax.skan runtime support for Apple platforms, including conversion-value updates, server-driven SKAdNetwork schema/state handling, and shared anal
attriax.skan runtime support for Apple platforms, including conversion-value updates, server-driven SKAdNetwork schema/state handling, and shared analytics key exports for aligning app events with dashboard and SKAN rules.AttriaxDeepLinks.recordDeepLink() now resolves to AttriaxDeepLinkEvent? after browser and deferred handling instead of the lower-level AttriaxDeepLinkResolution? wrapper.AttriaxAnalyticsEventKeys and AttriaxAnalyticsParamKeys exports for the shared event vocabulary. Useful for SKAN conversion-value rules and consistent event naming across your app and the dashboard.attriax_api_client package now uses cleaner json_serializable transport models instead of the older built_value-based output.SFSafariViewController or the system browser when Attriax resolves a deep link to a browser destination.requestTrackingAuthorization() now waits for the real ATT callback before returning to Dart, keeping startup advertising-ID collection aligned with the user's choice.Reinstall attribution and app-data-clear classification in the Flutter SDK app-open flow.
referrer facade with original-install, reinstall, session, and latest deep-link lookups.Attriax.installReferrer getter in favor of Attriax.referrer.* async methods.0.1.0 together.attriax_flutter 0.1.0.First public-ready Attriax Flutter SDK release
Your coding agent can read these notes before it upgrades. Set up the MCP server →