Skip to main content
Hyo
Godot IAP Maintainer
View all authors

1.2.3 - ExternalPurchaseCustomLink Types (iOS 18.1+)

· 2 min read
Hyo
Godot IAP Maintainer

This release syncs with OpenIAP v1.3.16 and adds type support for the new ExternalPurchaseCustomLink API introduced in iOS 18.1.

New Types​

This release adds GDScript type definitions for Apple's new ExternalPurchaseCustomLink API, which allows developers to direct users to external purchase links with proper tracking.

New Enums:

# Notice type for showing external purchase disclosure
enum ExternalPurchaseCustomLinkNoticeTypeIOS {
BROWSER = 0, # Display notice for browser-based purchases
}

# Token type for tracking external purchases
enum ExternalPurchaseCustomLinkTokenTypeIOS {
ACQUISITION = 0, # For new customer acquisition tracking
SERVICES = 1, # For existing customer services tracking
}

New Result Types:

# Result from showing the notice sheet
class ExternalPurchaseCustomLinkNoticeResultIOS:
var continued: bool # True if user chose to continue
var error: String # Error message if presentation failed

# Result from requesting a token
class ExternalPurchaseCustomLinkTokenResultIOS:
var token: String # The external purchase token
var error: String # Error message if retrieval failed

iOS Version Corrections​

  • ExternalPurchase API availability corrected to iOS 17.4+ (was incorrectly marked as 18.2+ in some cases)

Note​

This is a type-only release. The native wrapper functions for ExternalPurchaseCustomLink API are not yet exposed in godot-iap. The types are available for future integration or manual native bridge calls.

OpenIAP Versions​

PackageVersion
openiap-gql1.3.16
openiap-google1.3.27
openiap-apple1.3.14

For detailed changes, see the OpenIAP Release Notes.

1.2.0 - Android Input Type Field Naming Simplification

· 2 min read
Hyo
Godot IAP Maintainer

This release syncs with OpenIAP v1.3.15 and simplifies field naming in Android input types.

New Features​

One-Time Purchase Discount Offers (Android 7.0+)​

You can now apply discount offers to one-time (in-app) purchases using offer_token:

# Get product with discount offers
var products = await iap.get_products(["premium_upgrade"], "inapp")
var product = products[0]

# Check for discount offers
if product.discount_offers.size() > 0:
var offer = product.discount_offers[0]

# Purchase with discount
var request = RequestPurchaseAndroidProps.new()
request.skus = ["premium_upgrade"]
request.offer_token = offer.offer_token_android

var result = await iap.request_purchase_android(request)

Breaking Changes​

Simplified Field Names in Android Input Types​

Fields inside platform-specific input types no longer require the _android suffix. The parent type name already indicates the platform context.

Why this change?

When you use RequestPurchaseAndroidProps, the type name already tells you this is Android-specific. Adding _android suffix to fields inside is redundant.

Migration Guide​

Old NameNew Name
obfuscated_account_id_androidobfuscated_account_id
obfuscated_profile_id_androidobfuscated_profile_id
purchase_token_androidpurchase_token
replacement_mode_androidreplacement_mode

Before:

var request = RequestSubscriptionAndroidProps.new()
request.skus = ["premium_monthly"]
request.obfuscated_account_id_android = "user_123"
request.purchase_token_android = old_token
request.replacement_mode_android = 2

After:

var request = RequestSubscriptionAndroidProps.new()
request.skus = ["premium_monthly"]
request.obfuscated_account_id = "user_123"
request.purchase_token = old_token
request.replacement_mode = 2

Important: Response Types Keep Suffixes​

The suffix removal only applies to input types (request parameters). Response types still use suffixes because they're cross-platform:

# Response fields KEEP the _android suffix
var offer = product.discount_offers[0]
var token = offer.offer_token_android # Response field - keeps suffix

# Input fields DON'T have suffix
var request = RequestPurchaseAndroidProps.new()
request.offer_token = token # Input field - no suffix

Bug Fixes​

  • Fix GDScript enum reverse lookup for deserialization

OpenIAP Versions​

PackageVersion
openiap-gql1.3.15
openiap-google1.3.26
openiap-apple1.3.13

For detailed changes, see the OpenIAP Release Notes.