Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions packages/docs/public/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> OpenIAP: Unified in-app purchase specification for iOS & Android
> Documentation: https://openiap.dev
> Quick Reference: https://openiap.dev/llms.txt
> Generated: 2026-07-26T17:17:44.905Z
> Generated: 2026-07-27T13:04:16.611Z

## Table of Contents
1. Installation
Expand Down Expand Up @@ -31,22 +31,22 @@ cd ios && pod install
### Swift (iOS/macOS)
```swift
// Swift Package Manager
.package(url: "https://github.com/hyodotdev/openiap.git", from: "2.4.3")
.package(url: "https://github.com/hyodotdev/openiap.git", from: "2.4.4")

// CocoaPods
pod 'openiap', '~> 2.4.3'
pod 'openiap', '~> 2.4.4'
```

### Kotlin (Android)
```kotlin
// Gradle (build.gradle.kts)
implementation("io.github.hyochan.openiap:openiap-google:2.5.0")
implementation("io.github.hyochan.openiap:openiap-google:2.5.1")

// For Meta Horizon OS
implementation("io.github.hyochan.openiap:openiap-google-horizon:2.5.0")
implementation("io.github.hyochan.openiap:openiap-google-horizon:2.5.1")

// For Fire OS (Amazon Appstore)
implementation("io.github.hyochan.openiap:openiap-google-amazon:2.5.0")
implementation("io.github.hyochan.openiap:openiap-google-amazon:2.5.1")
```

### Flutter
Expand All @@ -55,13 +55,13 @@ flutter pub add flutter_inapp_purchase
```

### Godot
Download `godot-iap-2.6.0.zip` from GitHub Releases, extract it to
Download `godot-iap-2.6.1.zip` from GitHub Releases, extract it to
`addons/godot-iap/`, then enable the plugin in Project Settings.

### Kotlin Multiplatform
```kotlin
dependencies {
implementation("io.github.hyochan:kmp-iap:2.7.0")
implementation("io.github.hyochan:kmp-iap:2.7.1")
}
```

Expand All @@ -73,7 +73,7 @@ https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap
dotnet add package OpenIap.Maui
```

Current NuGet package version: 1.4.0
Current NuGet package version: 1.4.1

Requires .NET 9 or .NET 10, the MAUI workload, iOS 15.0+, and Android API 24+.

Expand Down
18 changes: 9 additions & 9 deletions packages/docs/public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> OpenIAP: Unified in-app purchase specification for iOS & Android
> Documentation: https://openiap.dev
> Full Reference: https://openiap.dev/llms-full.txt
> Generated: 2026-07-26T15:39:23.721Z
> Generated: 2026-07-27T13:04:16.611Z

## Installation

Expand All @@ -19,14 +19,14 @@ npm install react-native-iap
### Native
```swift
// Swift Package Manager
.package(url: "https://github.com/hyodotdev/openiap.git", from: "2.4.3")
.package(url: "https://github.com/hyodotdev/openiap.git", from: "2.4.4")
```

```kotlin
// Gradle
implementation("io.github.hyochan.openiap:openiap-google:2.5.0")
implementation("io.github.hyochan.openiap:openiap-google-horizon:2.5.0")
implementation("io.github.hyochan.openiap:openiap-google-amazon:2.5.0")
implementation("io.github.hyochan.openiap:openiap-google:2.5.1")
implementation("io.github.hyochan.openiap:openiap-google-horizon:2.5.1")
implementation("io.github.hyochan.openiap:openiap-google-amazon:2.5.1")
```

```bash
Expand All @@ -36,20 +36,20 @@ flutter pub add flutter_inapp_purchase

```gdscript
# Godot
# Install godot-iap 2.6.0 to addons/godot-iap and enable the plugin
# Install godot-iap 2.6.1 to addons/godot-iap and enable the plugin
```

```kotlin
// Kotlin Multiplatform
implementation("io.github.hyochan:kmp-iap:2.7.0")
implementation("io.github.hyochan:kmp-iap:2.7.1")
```

```xml
<!-- .NET MAUI -->
<PackageReference Include="OpenIap.Maui" Version="1.4.0" />
<PackageReference Include="OpenIap.Maui" Version="1.4.1" />
```

Current NuGet package version: 1.4.0
Current NuGet package version: 1.4.1

## Framework Libraries

Expand Down
168 changes: 168 additions & 0 deletions packages/docs/src/pages/docs/updates/releases.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,16 @@ const purchaseSafetyReleases = [
['OpenIap.Maui 1.2.2', 'maui-iap-1.2.2'],
] as const;

const googlePurchaseRecoveryReleases = [
['openiap-google 2.5.2', 'google-2.5.2'],
['react-native-iap 15.6.2', 'react-native-iap-15.6.2'],
['expo-iap 4.7.2', 'expo-iap-4.7.2'],
['flutter_inapp_purchase 9.6.2', 'flutter-iap-9.6.2'],
['godot-iap 2.6.2', 'godot-iap-2.6.2'],
['kmp-iap 2.7.2', 'kmp-iap-2.7.2'],
['OpenIap.Maui 1.4.2', 'maui-iap-1.4.2'],
] as const;

const iapkitSecurityTrainReleases = [
['OpenIAP Spec 2.4.4', 'docs-2.4.4'],
['openiap-apple 2.4.4', '2.4.4'],
Expand All @@ -108,6 +118,164 @@ function Releases() {
useScrollToHash();

const allNotes: Note[] = [
// July 28, 2026 - Google Play ambiguous purchase recovery patch train
{
id: 'google-play-ambiguous-purchase-recovery-2026-07-28',
date: new Date('2026-07-28'),
Comment thread
coderabbitai[bot] marked this conversation as resolved.
element: (
<div
key="google-play-ambiguous-purchase-recovery-2026-07-28"
style={noteCardStyle}
>
<AnchorLink
id="google-play-ambiguous-purchase-recovery-2026-07-28"
level="h4"
>
July 28, 2026 - Google Play ambiguous purchase recovery patch train
</AnchorLink>

<p
style={{
marginBottom: '1rem',
color: 'var(--text-secondary)',
}}
>
Publishes a coordinated Android patch train for the purchase
completion regression reported in{' '}
<a
href="https://github.com/hyodotdev/openiap/issues/166"
target="_blank"
rel="noopener noreferrer"
className="external-link"
>
issue #166
</a>{' '}
and fixed in{' '}
<a
href="https://github.com/hyodotdev/openiap/pull/257"
target="_blank"
rel="noopener noreferrer"
className="external-link"
>
PR #257
</a>
. Google Play can commit a purchase while returning a transient
billing error to the app. The SDK now reconciles that ambiguous
callback against current ownership instead of immediately reporting
a failed purchase. The OpenIAP Spec and Apple package are unchanged
because this patch adds no public API or contract.
</p>

<h5 style={{ margin: '0 0 0.5rem 0' }}>Google</h5>
<ul
style={{
marginBottom: '1rem',
paddingLeft: '1.25rem',
fontSize: '0.9rem',
}}
>
<li>
<strong>openiap-google 2.5.2</strong> - recovers Google Play
purchase flows that receive <code>NETWORK_ERROR</code>,{' '}
<code>SERVICE_UNAVAILABLE</code>,{' '}
<code>SERVICE_DISCONNECTED</code>, or an ambiguous{' '}
<code>ERROR</code> after the store has already committed the
transaction. Recovery queries the requested product type and SKU,
ignores ownership older than the current flow, and completes the
original request exactly once.
</li>
<li>
Transient ownership-query failures retry up to three total
attempts with a 500 ms delay. Fatal billing results and
synchronous exceptions fail immediately, while stale purchases,
unrelated products, duplicate callbacks, and a replaced purchase
flow cannot satisfy recovery.
</li>
</ul>

<h5 style={{ margin: '0 0 0.5rem 0' }}>Framework libraries</h5>
<ul
style={{
marginBottom: '1rem',
paddingLeft: '1.25rem',
fontSize: '0.9rem',
}}
>
<li>
<strong>react-native-iap 15.6.2</strong> and{' '}
<strong>expo-iap 4.7.2</strong> ship the corrected Google Play
purchase runtime for Nitro Modules and Expo Modules without a
JavaScript API change.
</li>
<li>
<strong>flutter_inapp_purchase 9.6.2</strong>,{' '}
<strong>godot-iap 2.6.2</strong>, and{' '}
<strong>kmp-iap 2.7.2</strong> carry the same bounded native
recovery through their Android packages without changing their
public purchase contracts.
</li>
<li>
<strong>OpenIap.Maui 1.4.2</strong> rebuilds its Android binding
with the corrected Google package; its CLR API remains unchanged.
</li>
</ul>

<h5 style={{ margin: '0 0 0.5rem 0' }}>
Integration and validation notes
</h5>
<ul
style={{
marginBottom: '1rem',
paddingLeft: '1.25rem',
fontSize: '0.9rem',
}}
>
<li>
No application migration is required. Upgrade the package used by
the app and keep the normal purchase-success and purchase-error
listeners active until the purchase flow completes.
</li>
<li>
The regression suite covers delayed ownership visibility,
transient retry exhaustion, fatal query failures, old ownership,
base-plan purchases, duplicate completion, and replacement-flow
races. A physical Google Play license-tester purchase also
completed local IAPKit verification and consumption without
creating a duplicate logical order.
</li>
</ul>

<div
style={{
paddingTop: '1rem',
borderTop: '1px solid var(--border-color)',
}}
>
<h5 style={{ margin: '0 0 0.5rem 0' }}>Package Releases</h5>
<ul
style={{
margin: 0,
paddingLeft: '1.25rem',
fontSize: '0.9rem',
}}
>
{googlePurchaseRecoveryReleases.map(([label, tag]) => (
<li key={tag}>
<a
href={`https://github.com/hyodotdev/openiap/releases/tag/${tag}`}
target="_blank"
rel="noopener noreferrer"
>
{label}
</a>
</li>
))}
</ul>
</div>
</div>
),
},

// July 25, 2026 - IAPKit security and SDK patch train
{
id: 'iapkit-security-cross-sdk-payload-integrity-2026-07-25',
Expand Down
Loading
Loading