Release 14.3.0
· 3 min read
This release consolidates the 14.3.x patch series with comprehensive improvements across Android, iOS, documentation, examples, and ecosystem alignment.
Breaking Changes ⚡️
useIAP
now expects callers to lean on the supplied callbacks instead of the temporary currentPurchase
helpers.
Added
getStorefront()
: returns the current storefront country code.deepLinkToSubscriptions()
: opens the native subscription management UI (Android/iOS).- Examples: "Manage Subscriptions" buttons in SubscriptionFlow and AvailablePurchases (opens native subscription management cross‑platform)
- Examples: Tap a purchased item to open a details modal
Changed
Android & iOS Platform Updates
- Android: migrate to OpenIAP Google 1.1.0; align init and field mapping with spec.
- Upgrade the fallback/config plugin to openiap-google 1.1.10 so Android builds pick up the latest Billing configuration fixes.
- Bump the iOS pod to openiap 1.1.12 and switch native error codes to PascalCase to match the shared TypeScript surface.
JavaScript & Bridge Improvements
- JS: Treat
requestPurchase
/requestSubscription
separately, warn in development when the wrong payload is supplied, and drop the legacyrequest
fallback. - JS: Normalize native error codes (including the Android "canceled" spelling) and keep init connection failures suppressed until the store is ready.
- Bridge: Warn when the iOS product type is unrecognized and align Active Subscription expiration fields with the generated schema.
- Removed the
currentPurchase
/currentPurchaseError
state fromuseIAP
and route purchase outcomes throughonPurchaseSuccess
/onPurchaseError
. - Trimmed the duplicate-event guard and logs so the hook focuses on forwarding results and refreshing subscription snapshots.
Documentation & Examples
- Docs: Clarify event‑driven purchase model (requests don't resolve with results); add FAQ about transient iOS success→error timing and simple debounce guidance
- Docs/Examples: Prefer
purchase.id
; continue usingpurchaseToken
for server validation - Examples: Redact sensitive fields in logs and modals (no raw
transactionReceipt
or fullpurchaseToken
) - Docs: Restore installation note and remove a local Docusaurus type shim to avoid duplicate identifiers.
Nitro & Plugin Enhancements
- Plugin: Re‑add opt‑in
"with-folly-no-couroutines": true
to inject Folly defines in the Podfile. - GraphQL: Bump to openiap-gql 1.0.0 so the generated schema stays in sync with the published contract.
Fixed
- Android: address a potential
init
race and improve error propagation. - iOS: add temporary stubs to keep Nitro/iOS aligned with the JS spec.
- iOS: Sanitize purchase error payload so product identifiers don't appear in
purchaseToken
on error events; keep internal de‑duplication by SKU - Examples/Tests: Align transaction row with
purchase.id
and update tests - Fix: Guard HybridObject creation and drop
isRuntimeAlive
usage to prevent CI/Jest issues. - Restore the explicit
Failed to initialize connection
message when Play Billing rejectsinitConnection()
so logs stay actionable. - Keep receipt validation failures tagged with a helpful prefix even when the underlying exception omits a message.
- Drop the purchase token from acknowledge/consume error payloads to avoid leaking identifiers in client logs.
No breaking changes. Compatible with 14.3.x line.