billdog_flutter 1.0.2-beta.3
billdog_flutter: ^1.0.2-beta.3 copied to clipboard
BillDog SDK for Flutter — monetization, paywalls, subscriptions and BillDog Auth sign-in. Thin bridge over the native iOS/Android SDKs with inline native paywall rendering.
Changelog #
All notable changes to the BillDog Flutter SDK will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.2-beta.3 - 2026-10-03 #
Added #
- Purchase recording as store evidence (purchase-recording proposal r3.1 §6.4):
StoreEvidence(withfromInAppPurchase, which maps a StoreKit 1 restore to the original transaction id),PurchaseRecording,BillDog.recordPurchase,syncStorePurchases,purchaseRecordingIssues,storeAccountToken, andobservePurchaseResult(evidence:, transactionId:). PurchaseController.purchase(PurchaseRequest)andrestore(), defaulted to the per-store methods, returnPurchaseOutcome/RestoreOutcomewith the purchase's evidence.capabilitiesandstoreKitVersiondeclare what the controller can honour.
Changed (breaking) #
- The native forwarding controllers send the full purchase request (offer token, upgrade, quantity, the customer's store-account token) and carry the evidence back. Android used to send only the product id and a hardcoded store.
- A host purchase Dart does not answer within five minutes, or one in flight
when the engine detaches, is
Pending, not a failure or a hang. - A
PurchaseControllersubclass may no longer declare its own members namedpurchase,restore,capabilitiesorstoreKitVersion. - An embedded paywall's failed restore is reported as an error, not a restore (iOS).
OfferingResultcarries the placement as the server describes it:placementInfo(PlacementInfo),presentation(PlacementPresentation:gated,holdout,withheld,withheldReason),experiment(PlacementExperiment, withvariantName) andcampaign(PlacementCampaign), on every outcome.gated,placementId,experimentIdandvariantIdare read from them. The plugins used to send null for every display field, the variant name and the campaign.- Every failure a channel method reports is a typed
BillDogErrorcarrying the server's wire code:PlacementError.error,PresentError.error,RestoreFailed.error,WebCheckoutResult.failure,Failed.error;getCustomerInfo,getPaywall,identify,setUserAttributesandhasAccessForPlacementthrow one;BillDogAuth.deleteAccount()throwsReauthRequiredError/ProofRequiredError/ProofInvalidError.BillDogDelegate.onPurchaseFailedreceives aBillDogError, not a string. - A missing native plugin is a failure for
restorePurchases(RestoreFailed),register(PlacementError) andgetPresentationResult(PresentError); an empty native answer togetOfferingisOfferingFailed. These used to read as an empty restore, a dismissal, "no paywall" and "nothing configured". presentSurveyon an unconfigured SDK is an error, not a silent success.showInAppMessagesreturns whether they were shown (falseon iOS, which has no equivalent); it used to answer as if it had worked everywhere.setSandboxModeis removed: it was a no-op on both platforms (sandbox is decided by the API-key prefix).getOffering(placement)returns anOfferingResult(OfferingAvailable,OfferingHoldout,OfferingWithheld,OfferingNotConfigured,OfferingFailed) instead ofOffering?. A holdout, a withheld placement and a refusal are reported as themselves; no other offering is substituted.hasAccessForPlacementis asynchronous and asks the native SDK. It used to read a value nothing wrote, and answeredtruefor every placement.PurchaseController.restorePurchasesreturnsRestoreResult. The deprecatedRestorationResultalias is removed.- Headless paywall events carry no
paywall_id.placement_identifierholds the placement identifier;placement_idis sent only when the placement's server id is known.
Added #
getOfferings(): the project's default offering. No placement identifier is sent.purchase(productId),purchasePackage(package),purchaseViaWeb(productId)andcompleteWebCheckout(uri).BillDogAuth.deleteAccount().- Typed server refusals:
ProofRequiredError,ProofInvalidError(proof),ReauthRequiredError(maxAgeSeconds),AccessDeniedError(selector),PurchaseOwnerConflictError(retryable),PlacementAccessWithheldError,PlacementNotFoundError. BillDogDelegate.onWebCheckoutRedeemed(RedemptionOutcome): the nativeonDidRedeemLink, every outcome included (RedemptionRefusedcarries the server's typed refusal).integrations/billdog_superwall: an optional Superwall purchase controller backed by BillDog.
Fixed #
- Every
BillDogAuthandBillDogOrganizationscall threwMissingPluginException: Dart invoked them on thebilldogchannel while both plugins handle them onio.billdog.flutter/sdk. - iOS:
reset()tore the native SDK down (it called nativereset()); every call after a logout failed untilconfigureran again. It now calls nativelogOut(), as Android does.
Removed #
- The unused pigeon schema (
pigeons/billdog_api.dart) and thepigeondev-dependency. No generated code existed; the channels are hand-written. - The Dart journey action poller. It invoked
checkPendingActionsandcompleteAction, which neither plugin handled. The native SDKs fetch, execute and report journey actions themselves.
1.0.1-beta.2 #
Fixes iOS dependency resolution. The published podspec declared
s.dependency 'BillDog' — a pod that has never existed on the CocoaPods trunk —
so pod install failed with "Unable to find a specification for BillDog".
It now depends on BillDogFull (which the Swift sources already imported) with a
version floor naming the pre-release (>= 1.0.0-beta.2), since CocoaPods will not
select a pre-release for an unversioned or ~> requirement.
No Dart API or behaviour changes.
1.0.0-beta.2 #
Initial public beta. Thin bridge over the native BillDog iOS/Android SDKs, with
inline native paywall rendering via a PlatformView.
Added #
- Paywall presentation and inline native paywall view (
PaywallView). - Purchases: purchase, restore, and host-driven
PurchaseControllerbridge. - Identity:
logIn/logOut/identifywith attribute support and persistence acrossconfigure. - Analytics event tracking.
- Customer info stream, offerings, packages, entitlements, and subscription status models.
- Localization helpers, including CLDR-parity RTL locale detection.
- Delegate dispatch for paywall/purchase lifecycle callbacks.
- Hand-written
MethodChannelbridge (io.billdog.flutter/sdk) to the native SDKs. (This entry used to claim pigeon-generated channels; no pigeon output was ever generated or consumed, and the unused schema has been removed.)