becklinks_flutter 0.3.1
becklinks_flutter: ^0.3.1 copied to clipboard
Deep links, deferred deep links and attribution for Flutter apps with Beck Links.
Changelog #
All notable changes to becklinks_flutter (called becklink_flutter up to 0.2.0) are documented here. The format follows
Keep a Changelog and the package uses
Semantic Versioning.
0.3.1 - 2026-10-14 #
Changed #
- Documentation only: the product is called Beck Links in the README, the privacy document and the package description. No code change.
0.3.0 - 2026-10-14 #
Changed #
-
The package is now called
becklinks_flutter, to match the domain becklinks.com. The API is the same: only the package name and the import change.dependencies: becklinks_flutter: ^0.3.0import 'package:becklinks_flutter/becklinks_flutter.dart'; -
becklink_flutter0.2.1 is a small wrapper that re-exports this package, so an app that still importspackage:becklink_flutter/becklink_flutter.dartkeeps working afterflutter pub upgrade. It is discontinued; move to the new name when convenient. -
On iOS the pod and the Swift package are now called
becklinks_flutter.
0.2.0 - 2026-10-12 #
Added #
LinkEvent.resource(LinkResourcewithtypeandid): the item a URL-template link names, such as challenge4521forhttps://acme.becklinks.com/c/4521.nullfor ordinary links.- The SDK now recognises URL-template paths of two to four segments (
/c/4521) as Beck Link URIs on the project's link hosts, inonLink,isBeckLinkUriandhandleUri, so apps that use Beck Link URL templates receive them like any other link. Paths the platform reserves (/_c/…,/api/…) are still ignored. - README section "Links to every item (URL templates)".
Fixed #
- A URL-template path whose id holds an escaped space or control character, or is longer than 128 characters (32 for a fixed part), is no longer taken for a Beck Link URI.
0.1.1 - 2026-10-09 #
Changed #
- README: the Install section now uses
flutter pub add becklink_flutterfrom pub.dev.
0.1.0 - 2026-10-09 #
First release, for Android 6.0+ (API 23) and iOS 15+ (Xcode 16+), on Flutter 3.27+ (Dart 3.6+).
Added #
BeckLink.instance.isBeckLinkUri(uri): synchronous, offline check for a Beck Link URI of the configured environment (platform hosts, cached link hosts, the custom-scheme form), so an app's own deep-link listener can skip Beck Link URIs.BeckLink.instance.handleUri(uri): feeds a URI received by other means (app_links,go_router, a push payload, a QR scan) into the SDK like a link opened by the system. Delivers oneLinkEventononLink, returnsfalsefor URIs that are not Beck Link URIs, is deduplicated against the platform channel and repeated calls (same URL within 10 seconds), and is safe to call beforeconfigure()finished.configure(handlePlatformLinks: false): the SDK reads no launch link and listens to no native link stream; the app forwards its links withhandleUri. Deferred deep linking, first open, attribution and events are unchanged. Defaulttrue, so existing apps are not affected.- README section "Apps that already handle deep links (app_links, go_router, GetX)".
BeckLink.instance.configure()with a publishable key (pk_test_…orpk_live_…). It returns at once and runs storage, the launch link and network work in the background. Options:logLevel,enablePasteboardandfirstOpenTimeout(3 seconds by default, up to 30).- Direct deep links: Universal Links and custom-scheme URLs on iOS (cold start included, for app-delegate apps and, from Flutter 3.38, UIScene apps), App Links and custom-scheme URLs on Android. Only Beck Link URLs of the configured environment are reported; other URLs never leave the device.
onLinkstream that delivers every link once (the launch link, the deferred link and links received while running) and buffers links until the first listener;getInitialLink()for the link that opened the app.- Deferred deep linking on the first open: Google Play Install Referrer on Android, opt-in
pasteboard click URL on iOS (read at most once per install, only after pattern detection, only
for the project's link hosts). Every match reports
matchMethodandconfidence. - Install attribution with
getAttribution()andonAttribution(pending,attributed,organic,reinstall,unavailable), stored on the device after the first open. - Custom events with
track(): validated on the device, kept in a persistent offline queue (500 events or 2 MB, 7 days), sent in gzip batches of up to 50 every 15 seconds, at 20 events and when the app goes to the background;flush()to send now. setUserId()andclearUserId(); the user ID goes with sessions and events and into share links asreferrer_user_id.createLink()withLinkOptionsfor share and referral links on the environment's link host.setTrackingEnabled()consent switch: off deletes queued events and the install ID and stops collection, while links keep routing.setLogLevel()andLogLevel; logs never contain API keys, user IDs, query strings or event properties.- Typed
BeckLinkExceptionwith stable codes (not_configured,invalid_key,network,rate_limited,tracking_disabled,link_not_found,timeout,invalid_request). - HTTP client with retries (exponential backoff with full jitter, 2-second base, 5-minute cap),
Retry-Aftersupport and idempotency keys. - Install ID kept in the iOS Keychain (this device only) so reinstalls are recognised; SDK storage excluded from backups on both platforms.
- iOS privacy manifest (
PrivacyInfo.xcprivacy) and a data disclosure for App Store privacy labels and Google Play Data safety (doc/privacy.md). - CocoaPods support, and Swift Package Manager support on Flutter 3.44+.
- Example app with go_router and a Debug screen.
- Diagnostics for debug and support screens:
BeckLink.version,getDiagnostics()(BeckLinkDiagnostics: install ID, first-open outcome withunmatchedReason, remote config, queued events) and theonApiCallstream (BeckLinkApiCall: status, request ID,Idempotent-Replayed). configure(apiBaseUrl:)for staging and local SDK API servers; debug builds also accept plain HTTP to private network addresses.- Debug-build helpers
debugRunFirstOpen()anddebugOpenLink().