Use this page with AI
Copy this into your coding assistant and add your request.
Read https://openiap.dev/docs/updates/releases and https://openiap.dev/llms.txt. Follow the reading instructions, detailed reference, and linked guides relevant to my task before making changes.
Inspect my existing project and reuse its framework and conventions. Ask me for missing product decisions. Implement the requested behavior and run the applicable checks.
Show the working result, the commands and actual test results, and any remaining limitations. Keep your explanation brief.
My request: [describe what customers should be able to do]Releases
Release notes for OpenIAP packages and framework libraries.
October 9, 2026 - Community store providers and Client Protocol 1.0.0#
Use community stores on Apple and Android through one provider contract. Build and test integrations in your own repository, then select a linked provider without changing app purchase APIs.
Read the community provider announcement for the design and an integration walkthrough. Start with the Amazon community provider example to follow packaging, provider selection, receipt verification, and conformance testing across the extension boundary.
Breaking changes
See the provider contract upgrade guide for what to change.
- Client Protocol 1.0.0 removes deprecated redemption APIs, Horizon
success, and ApplespecVersion; use their replacements in the migration table. - Client Protocol 1.0.0 makes
storeIdrequired on purchases and IAPKit results; set it on hand-built values (C# and the Kotlin IAPKit result infer official ids). - KMP 4.0.0 adds
UNKNOWNto the publicStoreenum; add the branch to every exhaustivewhen (getStore()). - OpenIAP Google 4.0.0 and KMP 4.0.0 make the Kotlin
RequestVerifyPurchaseWithIapkitResulta plain class whose constructor andcopycarrystoreId; recompile code that copies results or constructs or copies purchases. - OpenIAP Google 4.0.0 moves shared classes into the
openiap-coreartifact; apps linking the AAR by file must add it (Maven consumers get it transitively). - OpenIAP Apple 4.0.0 requires tvOS 16.0+ (SwiftPM; CocoaPods already required 16.0); raise the deployment target of tvOS apps.
- OpenIAP Apple 4.0.0 throws
CancellationError, with no purchase-error event, when the calling task ofrequestPurchaseor another StoreKit operation is cancelled; catch it at the call site. - Flutter 11.0.0
initConnection()now returns false on iOS and macOS when StoreKit cannot make payments; it returned true before. - React Native 17.0.0, Expo 6.0.0, Flutter 11.0.0, and MAUI 3.0.0 now reject failed Play
openRedeemOfferCode()launches instead of resolving null; catch the error. - Godot 4.0.0 now emits
purchase_errorfor failed or unsupported redemption while returning null; subscribe to the signal. - React Native 17.0.0, Expo 6.0.0, Flutter 11.0.0, and Godot 4.0.0 forward the provider's Android error code where they returned fixed codes; handle specific codes such as
not-prepared. - Flutter 11.0.0 and Godot 4.0.0 (and KMP 4.0.0 on iOS) report the native error code from failed verification instead of always
purchase-verification-failed; match specific codes. - React Native 17.0.0, Expo 6.0.0, and Flutter 11.0.0 run the provider's Android restore first, and on Horizon deliver each owned purchase to purchase listeners; make the handler idempotent.
- React Native 17.0.0 and Flutter 11.0.0 (every call), KMP 4.0.0 and MAUI 3.0.0 (id-filtered calls) answer
hasActiveSubscriptionson iOS from the active flag; a subscriber in billing grace reads inactive. - Godot 4.0.0 emits one
purchase_error, not two, for a failed Apple restore, and one for a failedverify_purchase(on Android only when the result carries a code). - Godot 4.0.0 reports OpenIAP's error code in failed Apple
products_fetchedpayloads forget_storefront,fetch_products, and iOS-only calls, which carriedservice-erroror no code; match specific codes. - Godot 4.0.0 fails the Android export when
openiap/android_storeis unrecognized instead of falling back to Play; fix the store value.
Common changes
- OpenIAP Google 4.0.0 clears the purchase status SKU after an empty completion, so later store errors do not inherit that SKU.
- The optional registry lists provider capabilities, maintenance tiers, and conformance reports; unregistered providers work with explicit coordinates.
- Providers deliver purchase failures through one canonical error event and preserve the purchase token across ownership reads.
- IAPKit rejects invalid refresh-token and OAuth verifier IDs and redacts sensitive OAuth debug logs.
Protocols and native packages
- Client Protocol 1.0.0 publishes the stable provider contract, store identity, and shared provider metadata.
- CLI 0.2.0 checks community store selection and provider coordinates with
openiap doctor. - OpenIAP Apple 4.0.0
- Adds factory discovery and the public
OpenIapConformanceSwift suite. - Delivers purchase errors before returning, and the SwiftUI store preserves sessions across failed or cancelled reconnects with retryable teardown.
- The Swift example retries unfinished purchases after verification or transaction-finish failures and keeps owned non-consumables visible.
- Adds factory discovery and the public
- OpenIAP Google 4.0.0 publishes
openiap-coreand the Kotlinopeniap-conformancesuite alongside the three official store artifacts, with shared provider discovery and compatibility checks. New protocol members require default implementations so existing providers keep linking.
Framework libraries
- Flutter 11.0.0 examples keep pending purchases and failed local verification unfinished.
- MAUI 3.0.0 examples leave pending purchases and failed local verification unfinished.
- KMP 4.0.0 examples preserve the store's error message when a purchase request returns no result and leave failed verification unfinished.
- React Native 17.0.0, Expo 6.0.0, Flutter 11.0.0, Godot 4.0.0, KMP 4.0.0, and MAUI 3.0.0 support external providers, preserving purchase identity and normalized verification errors, including unsupported receipt verification.
- React Native 17.0.0, Expo 6.0.0, and Flutter 11.0.0 name a community provider's store in init-failure messages, as they already did for Horizon and Amazon.
- React Native 17.0.0
- Preserves unknown Android renewal as
null; required Boolean hints do not establish cancellation or entitlement. - Preserves normalized provider errors when opening subscription management and delivers each repeated Apple purchase failure, including failures during another product's background error.
getAvailablePurchaseshonorsincludeSuspendedAndroidand reports suspended Play subscriptions throughsubscriptionBillingIssueListener.
- Preserves unknown Android renewal as
- Godot 4.0.0
- Preserves Apple verification results and leaves unsupported Local (Device) purchases unfinished.
restore_purchases()returnsRestoreResult, aTypes.VoidResultsubtype withcodeanderroron failure; cancelling App Store restore reportsuser-cancelledin the result and thepurchase_errorsignal (#510).- Android exports raise AGP to 8.9.1 and compile SDK to 36, preserving newer versions and target SDK; use a compatible Gradle wrapper (8.11.1+) and JDK 17 (#511).
- Keeps Apple listeners when provider disconnection fails and fixes iOS source builds with SwiftPM generators.
- Never signals connection success after initialization fails.
Integration notes
- Follow the Store provider guide to build a provider; provider-specific settings belong to its manifest or resources.
- The Amazon community package is an educational example; use the official Amazon integration for FireOS apps.
- Existing store aliases, legacy flags, and deprecated configuration paths remain supported; their removal schedule moves to the following major releases.
October 7, 2026 - Retry purchases after choosing alternative billing#
Google Play User Choice Billing releases the pending purchase when the user chooses alternative billing, so canceling an external checkout no longer blocks the next purchase.
Protocols and native packages
- openiap-google 3.6.3
- Repeated selection callbacks cannot complete a later purchase, including after reconnecting.
- A lost billing connection or unusable selection details fail the pending request so the app can retry.
Integration notes
Upgrade to the framework patch below and rebuild the Android app; an over-the-air JavaScript update cannot replace the native SDK.
The selection event starts your checkout; it does not confirm payment or grant an entitlement. See the User Choice Billing listener guide.
September 30, 2026 - Amazon subscriptions report real prices and trials#
Paid Amazon plans no longer read as free trials, Vega OS reports the same offers as Fire OS, store-selection errors and deprecation warnings say what to do, and a debug build says thanks once after its first purchase. See PR #500.
Native packages
- openiap-apple 3.6.1 remembers, once per install, that the framework library showed its first-purchase notice.
- openiap-google 3.6.2
- Remembers, once per install, that the framework library showed its first-purchase notice.
- Amazon plans report their price in
priceAmountMicrosinstead of0, which made a zero-price trial check read every paid plan as a free trial. - Amazon prices with a decimal comma, such as
9,99 €, no longer read as 999 on a device set to English. - The Gradle plugin links a flavor's store into its unit-test and instrumented-test classpaths too; a Horizon test run got the Play artifact next to the Horizon one.
- Store-selection errors name a fix that works: build one store per invocation, or pass an option's value inline (
--name=value). horizonEnabledandopeniapPlatform=nonewarn that the next major release removes them; see Migration.- The
openiap: store=…line and the deprecation warnings print at Gradle's quiet level, so Flutter's-qbuilds show them, and a script that captures./gradlew -qoutput sees them too. fireOsEnabled=trueis no longer deprecated in openiap-google, react-native-iap, and flutter_inapp_purchase; it declares a Fire OS build and wins over the connected debug device.
Framework libraries
Every library below ships openiap-google 3.6.2 and openiap-apple 3.6.1. React Native, Expo, and Flutter also ship openiap-google's store resolver, with the same errors and warnings.
In a debug build, the first purchase that finishes prints a short thank-you to the debug console (React Native DevTools for react-native-iap), with a link to star the repository and an invitation to list your app on the showcase. It prints once per install, never in a release build or a test run, and nothing leaves the device. kmp-iap and maui-iap print it on Android only: their iOS side has no reliable sign that the app is a debug build. Nothing prints on Vega OS, which has no store for the once-per-install flag.
- react-native-iap 16.7.2
- Vega OS subscriptions report their billing period and, when the customer is eligible, a
free-trialoffer, as Fire OS does. - Seven legacy Android fields on the raw
NitroProducttype, whichfetchProductsalready drops, are deprecated for removal in the next major release; readsubscriptionOffersordiscountOffersinstead.
- Vega OS subscriptions report their billing period and, when the customer is eligible, a
- expo-iap 5.8.2
- Vega OS subscriptions report their billing period and free-trial offer, as in react-native-iap.
modules.horizonand theEXPO_IAP_FIREOS,EXPO_IAP_VEGA,EXPO_IAP_ONSIDE, andEXPO_IAP_HORIZONenvironment flags warn that expo-iap 6.0.0 removes them; see Migration for each replacement.modules.amazon.fireOSis no longer deprecated, and declaring Fire OS with it orEXPO_IAP_FIREOS=1turns off Vega auto-detection.- A hand-written root
manifest.tomlno longer draws a warning on every prebuild.
- maui-iap 2.6.2
OpenIapAndroidStorewarns (OPENIAP0001) that the next major release removes it.- An
OpenIapAndroidStorevalue that disagrees withOpenIapStorefails the build, as a legacy flag does in Gradle;OpenIapStore=autodefers to it instead.
- godot-iap 3.6.2
- Release exports carry
res://iapkit.cfgagain; 3.6.0 and 3.6.1 left it out. types.gd, regenerated in @hyodotdev/openiap-client-protocol 0.1.1, loads beside a project autoload orclass_namethat reuses one of its enum names, such asIapStore.- On Apple,
restore_purchases()andsync_ios()wait up to five minutes, as Apple's other system sheets do, becauseAppStore.sync()can ask the player to sign in.
- Release exports carry
Protocols
- @hyodotdev/openiap-commerce-protocol 0.3.1
- Providers answer
UNSUPPORTED_PROFILEfor an operation outside their declared profiles, andbindPurchaseanswersUNSUPPORTED_STOREfor a store they do not integrate instead ofbound: false. - Removes the
PURCHASE_NOT_FOUNDandCONFLICTerror codes, which no operation declared. activenow means a currently entitling subscription; access granted without one appears only inentitlements.
- Providers answer
Tooling
- @hyodotdev/openiap 0.1.1
doctorreadsopeniapStorepins and their aliases alongside the store flags, and reports store values the build would reject.- Its fixes name
openiapStoreinstead of the deprecated flags. - The
initbrief ends with a note that lets your coding assistant mention the showcase and feedback channels once, and not star, post, or submit anything unless you ask.
September 26, 2026 - Minified release builds keep billing working#
Android release builds shrunk with R8 no longer lose billing features on any store, and no ProGuard rules are needed in your app. See PR #490.
Native packages
- openiap-google 3.6.1
- Fixes minified Horizon builds that failed on
javax.annotation.Nullable. - Preserves the Amazon Appstore SDK classes and fields used by reflection, so purchases work in release builds.
- Preserves Play Billing support for External Payments, Billing Choice, external links, user choice billing, automatic reconnection, and
isSuspendedafter R8 shrinking. OpenIapStore.enableBillingProgramtakes effect in release builds; Horizon and Amazon ignore it with a warning.
- Fixes minified Horizon builds that failed on
Framework libraries
- react-native-iap 16.7.1 -
enableBillingProgramAndroidtakes effect in release builds, and user choice billing events keeporiginalExternalTransactionIdandproductDetailsAndroid. - kmp-iap 3.6.1 - fixes minified Horizon and Amazon release builds, which failed on Play Billing classes those stores don't ship or could not start billing.
September 26, 2026 - Your connected device picks the store now#
Every framework now resolves the Android store at build time with one shared rule: an explicit openiapStore pin, a store flavor in the Gradle task, the Quest or Fire device plugged in on debug builds, otherwise Play. No more per-framework flags. Only debug builds follow the device, so pin release builds; conflicting signals fail the build instead of shipping the wrong billing SDK. See PR #482 and the announcement post.
Native packages
- openiap-google 3.6.0
- Ships the shared
openiap-store.gradleresolver and theio.github.hyochan.openiapGradle plugin. - Amazon subscriptions add a free-trial offer when the customer is eligible for one.
- Horizon purchases from the durable cache survive
SERVICE_UNAVAILABLE, and errors name the actual store. - Drops
BuildConfig.OPENIAP_SPEC_VERSION.
- Ships the shared
- openiap-apple 3.6.0 - adds
OpenIapVersion.clientProtocolVersion;specVersionstays as a deprecated alias until client protocol 1.0.0.
Framework libraries
- react-native-iap 16.7.0, expo-iap 5.8.0, and flutter_inapp_purchase 10.7.0 - run the same shared resolver. Expo's
modules.horizonandmodules.amazon.fireOSstill pin but are deprecated; move the pin toORG_GRADLE_PROJECT_openiapStore. - expo-iap 5.8.0 - also recognizes a Vega project without an enable flag, and the config plugin logs to stderr, so tools that print the Expo config as JSON get clean output.
- flutter_inapp_purchase 10.7.0 - also stops logging Android purchase tokens.
- kmp-iap 3.6.0 - gains a
Store.HORIZONentry, which Horizon builds now report instead ofPLAY_STORE, so add the branch if you switch exhaustively overStore. - godot-iap 3.6.0 - adds the
openiap/android_storeexport option (autofollows the debug device) andopeniap/horizon_app_id. Release exports leaveres://iapkit.cfgout of the bundle, so a game that ships its IAPKit key there loses it; see the fix. - maui-iap 2.6.0
- Links one store's AAR per build. NuGet resolves dependencies at restore time, so every build also carries Play Services, DataTransport, and kotlinx-serialization-json regardless of store.
- Fixes duplicate
androidx.fragmentclasses when an app also references current Google Play Services bindings.