Skip to main content

Changelog

The plugin runs its own semver clock on pub.dev. It is a thin channel client over the native OptoLink SDKs, so a breaking change in a native SDK forces a plugin release even with no Dart change.

2.0.1​

README corrected for the pub.dev release — 2.0.0's README still documented the pre-2.0 git-dependency installation. It now shows the pub.dev dependency, points at optoapp.link, and is rewritten for a public audience. No code changes.

2.0.0​

The plugin is converted from a pure-Dart implementation to a thin channel client over the native OptoLink SDKs — the Swift SDK (iOS, SPM) and Kotlin SDK (Android, Maven Central) now own all HTTP, deferred matching, link ingestion, and identity/telemetry persistence. The public Dart API is source-compatible with 1.x.

Compatible with OptoLink backend v2.1.0+.

Install: flutter pub add optolink_flutter.

Breaking changes​

  • The Dart match stack is deleted — fingerprint collection, clipboard reading, install-referrer and first-launch detection, and their stores all moved into the native SDKs. The plugin drops every non-Flutter Dart dependency.
  • DeviceIdStore is removed from the public barrel; OptoLinkData.fromMatchResponse / fromUri factories are gone — links arrive resolved from the native SDK.
  • Fresh-start identity: the native SDKs keep their own device/first-launch stores, so upgrading installs get a new deviceId (1.x profiles are orphaned) and the first launch after upgrade makes one spurious deferred-match attempt. iOS may show the one-time paste-permission banner.
  • Custom URI schemes are no longer ingested as deep links — only https Universal Links (iOS) / App Links (Android). A registered uriScheme still routes the redirect page but delivers no link payload.
  • Backend requests now carry the natives' audit header (X-OptoLink-SDK: ios/0.1.0 / optolink-android/0.1.0); the Dart flutter/… header is gone.
  • New floors: Flutter ≥ 3.38.0 (the iOS bridge uses the scene-lifecycle plugin API introduced in 3.38), iOS deployment target 15.0, Android minSdk 23 (the native SDK's floor). iOS ships dual packaging — Package.swift (SPM) and a CocoaPods podspec with the vendored OptoLink.xcframework — so apps on either dependency manager integrate unchanged.

Added​

  • OptoLinkData.score (int?) — raw match score, present on FINGERPRINT_SCORED matches only.
  • OptoLinkError + OptoLink.lastError — typed error details (status, message, requestId, retryAfterSeconds, details[], isConnectionError) for every failed call. initialize is the one API that throws; config errors are programmer errors.
  • OptoLinkLogLevel.info — the natives' INFO progress trail (init summary, per-rung deferred decisions, HTTP request lines, link emitted) now reaches the Dart logger.

Changed​

  • getInitialLink() returns natively resolved data and is the only delivery path for cold-start direct links — they never stream on onLink. Deferred and warm links stream as before, with the last emission replayed to late subscribers.
  • trackEvent property values are coerced to strings at the channel edge (null values dropped, each coercion logged at info); the natives are String → String.
  • Bool/null semantics unchanged: the identity trio returns Future<bool> (false only on native error), resolveDeferredLink() returns null on failure — inspect OptoLink.lastError for details.
  • Without a configured logger, info/warning/error entries go to debugPrint in debug builds only.

1.2.0​

Custom events: OptoLink.instance.trackEvent(eventName, {properties}) reports arbitrary named events from your app's business logic, attributed to this device. Opt-in instrumentation — the linking/matching flow never fires events automatically. Anonymous-device events become attributable retroactively after a later setIdentity; no data rewrite. properties is a free-form map capped at 10 KiB serialized server-side (rejected, not truncated).

1.1.0​

Device & end-user identity: stable per-install deviceId (UUID v4, persisted, survives SDK re-init, resets on uninstall); automatic session registration on every app open that didn't go through the deferred-match path; deviceId sent on /match and short-code resolution calls. New APIs: setIdentity(externalId), clearIdentity(), deviceId.

1.0.0​

Initial release: direct deep links (Universal Links, App Links, custom URI schemes), the deferred pipeline (clipboard token, Play Install Referrer, device fingerprint, IP fuzzy fallback), short-code resolution, confidence levels on every match, and the diagnostic logging hook. Android minSdk 21; iOS 13+ with the SDK pure-Dart on iOS.