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.
DeviceIdStoreis removed from the public barrel;OptoLinkData.fromMatchResponse/fromUrifactories 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
httpsUniversal Links (iOS) / App Links (Android). A registereduriSchemestill 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 Dartflutter/…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 vendoredOptoLink.xcframework— so apps on either dependency manager integrate unchanged.
Added
OptoLinkData.score(int?) — raw match score, present onFINGERPRINT_SCOREDmatches only.OptoLinkError+OptoLink.lastError— typed error details (status,message,requestId,retryAfterSeconds,details[],isConnectionError) for every failed call.initializeis 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 ononLink. Deferred and warm links stream as before, with the last emission replayed to late subscribers.trackEventproperty values are coerced to strings at the channel edge (null values dropped, each coercion logged atinfo); the natives areString → String.- Bool/
nullsemantics unchanged: the identity trio returnsFuture<bool>(falseonly on native error),resolveDeferredLink()returnsnullon failure — inspectOptoLink.lastErrorfor details. - Without a configured
logger,info/warning/errorentries go todebugPrintin 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.