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]
See an example request →

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 Apple specVersion; use their replacements in the migration table.
  • Client Protocol 1.0.0 makes storeId required 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 UNKNOWN to the public Store enum; add the branch to every exhaustive when (getStore()).
  • OpenIAP Google 4.0.0 and KMP 4.0.0 make the Kotlin RequestVerifyPurchaseWithIapkitResult a plain class whose constructor and copy carry storeId; recompile code that copies results or constructs or copies purchases.
  • OpenIAP Google 4.0.0 moves shared classes into the openiap-core artifact; 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 of requestPurchase or 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_error for 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 hasActiveSubscriptions on 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 failed verify_purchase (on Android only when the result carries a code).
  • Godot 4.0.0 reports OpenIAP's error code in failed Apple products_fetched payloads for get_storefront, fetch_products, and iOS-only calls, which carried service-error or no code; match specific codes.
  • Godot 4.0.0 fails the Android export when openiap/android_store is 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 OpenIapConformance Swift 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.
  • OpenIAP Google 4.0.0 publishes openiap-core and the Kotlin openiap-conformance suite 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.
    • getAvailablePurchases honors includeSuspendedAndroid and reports suspended Play subscriptions through subscriptionBillingIssueListener.
  • Godot 4.0.0
    • Preserves Apple verification results and leaves unsupported Local (Device) purchases unfinished.
    • restore_purchases() returns RestoreResult, a Types.VoidResult subtype with code and error on failure; cancelling App Store restore reports user-cancelled in the result and the purchase_error signal (#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 priceAmountMicros instead of 0, 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).
    • horizonEnabled and openiapPlatform=none warn 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 -q builds show them, and a script that captures ./gradlew -q output sees them too.
    • fireOsEnabled=true is 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-trial offer, as Fire OS does.
    • Seven legacy Android fields on the raw NitroProduct type, which fetchProducts already drops, are deprecated for removal in the next major release; read subscriptionOffers or discountOffers instead.
  • expo-iap 5.8.2
    • Vega OS subscriptions report their billing period and free-trial offer, as in react-native-iap.
    • modules.horizon and the EXPO_IAP_FIREOS, EXPO_IAP_VEGA, EXPO_IAP_ONSIDE, and EXPO_IAP_HORIZON environment flags warn that expo-iap 6.0.0 removes them; see Migration for each replacement.
    • modules.amazon.fireOS is no longer deprecated, and declaring Fire OS with it or EXPO_IAP_FIREOS=1 turns off Vega auto-detection.
    • A hand-written root manifest.toml no longer draws a warning on every prebuild.
  • maui-iap 2.6.2
    • OpenIapAndroidStore warns (OPENIAP0001) that the next major release removes it.
    • An OpenIapAndroidStore value that disagrees with OpenIapStore fails the build, as a legacy flag does in Gradle; OpenIapStore=auto defers to it instead.
  • godot-iap 3.6.2
    • Release exports carry res://iapkit.cfg again; 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 or class_name that reuses one of its enum names, such as IapStore.
    • On Apple, restore_purchases() and sync_ios() wait up to five minutes, as Apple's other system sheets do, because AppStore.sync() can ask the player to sign in.
Protocols
  • @hyodotdev/openiap-commerce-protocol 0.3.1
    • Providers answer UNSUPPORTED_PROFILE for an operation outside their declared profiles, and bindPurchase answers UNSUPPORTED_STORE for a store they do not integrate instead of bound: false.
    • Removes the PURCHASE_NOT_FOUND and CONFLICT error codes, which no operation declared.
    • active now means a currently entitling subscription; access granted without one appears only in entitlements.
Tooling
  • @hyodotdev/openiap 0.1.1
    • doctor reads openiapStore pins and their aliases alongside the store flags, and reports store values the build would reject.
    • Its fixes name openiapStore instead of the deprecated flags.
    • The init brief 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 isSuspended after R8 shrinking.
    • OpenIapStore.enableBillingProgram takes effect in release builds; Horizon and Amazon ignore it with a warning.
Framework libraries
  • react-native-iap 16.7.1 - enableBillingProgramAndroid takes effect in release builds, and user choice billing events keep originalExternalTransactionId and productDetailsAndroid.
  • 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.gradle resolver and the io.github.hyochan.openiap Gradle 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.
  • openiap-apple 3.6.0 - adds OpenIapVersion.clientProtocolVersion; specVersion stays 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.horizon and modules.amazon.fireOS still pin but are deprecated; move the pin to ORG_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.HORIZON entry, which Horizon builds now report instead of PLAY_STORE, so add the branch if you switch exhaustively over Store.
  • godot-iap 3.6.0 - adds the openiap/android_store export option (auto follows the debug device) and openiap/horizon_app_id. Release exports leave res://iapkit.cfg out 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.fragment classes when an app also references current Google Play Services bindings.
...
Showing 1-5 of 90 items