Unity Plugin Changelog
This page documents version-by-version API changes for the AppCoins iOS Unity Plugin. Each entry lists breaking changes, new features, and migration steps where applicable.
Version 5.x (Upcoming)
Breaking Changes
-
Full API replacement — the previous direct API (
AppCoinsSDK.Instance.*) has been entirely replaced by a Unity IAP v5 custom store adapter. There is no compatibility shim. All code that calls methods onAppCoinsSDK.Instancemust be rewritten using the Unity IAP v5StoreControllerpattern. -
AppCoinsSDK.Instanceremoved — the following instance methods no longer exist:Removed method Replacement AppCoinsSDK.Instance.IsAvailable()AppCoinsStoreMode.Automatic(automatic runtime detection)AppCoinsSDK.Instance.GetProducts(skus)controller.OnProductsFetchedeventAppCoinsSDK.Instance.Purchase(sku, payload)controller.InitiatePurchase(productId)+OnPurchasePendingAppCoinsSDK.Instance.ConsumePurchase(sku)controller.ConfirmPurchase(order)AppCoinsSDK.Instance.GetUnfinishedPurchases()controller.FetchPurchases()+controller.CheckEntitlement() -
AppCoinsPurchaseManager.OnPurchaseUpdatedremoved — replace with subscriptions tocontroller.OnPurchasePending,controller.OnPurchaseConfirmed, andcontroller.OnPurchaseFailed. -
PurchaseIntentremoved —ConfirmPurchaseIntentandRejectPurchaseIntentno longer exist. The new API does not have an intent confirmation step. -
AppCoinsSDKPurchaseResultremoved — replaced by Unity IAP v5 order types:Old type / constant Replacement AppCoinsSDKPurchaseResultwith.StatestringsPendingOrder,ConfirmedOrder,FailedOrderUnity IAP typesAppCoinsSDK.PURCHASE_STATE_SUCCESScontroller.OnPurchaseConfirmedeventAppCoinsSDK.PURCHASE_STATE_FAILEDcontroller.OnPurchaseFailedevent -
AppCoinsSDKResult<T>removed — results are now delivered through Unity IAP v5 event callbacks. -
Unity IAP v5 now required —
com.unity.purchasing5.0 or later must be added as a package dependency. -
Unity 2022.3 or later required — the minimum supported Unity version has been raised from 2019.4 to 2022.3.
New Features
-
AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode)— the single entry point for plugin setup. Must be called beforeStoreController.Connect(). Returns the name of the selected store ("AppCoinsAppStore"or"AppleAppStore"). -
AppCoinsStoreMode.Automatic— performs a runtime check and selects AppCoins or Apple Billing based on the iOS version and install source. See How Runtime Detection Works. -
Full Unity IAP v5 compatibility — all standard Unity IAP v5 events (
OnProductsFetched,OnPurchasePending,OnPurchaseConfirmed,OnPurchaseFailed) work identically regardless of the active store. -
Built-in receipt with verification data —
order.Info.Receiptcontains a JSON payload includingPayload.verification.data.purchaseTokenfor server-side validation.
Migration Steps
-
Remove the old plugin from Assets. Delete
AppCoinsSDK.cs,AppCoinsPurchaseManager.cs,AppCoinsSDKPurchaseResult.cs,AppCoinsSDKResult.cs, and any related files. -
Add the new plugin from GitHub releases. Download the latest
.unitypackageand import it into your Assets folder. -
Add
com.unity.purchasing5.0 or later via Package Manager. Open Window → Package Manager, search for In App Purchasing, and install version 5.0 or later. -
Replace all
AppCoinsSDK.Instance.*calls with the Unity IAP v5StoreControllerpattern:IsAvailable()→AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic)GetProducts(skus)→ subscribe tocontroller.OnProductsFetchedInstance.Purchase(sku, payload)→controller.InitiatePurchase(productId)- Handle purchase result in
controller.OnPurchasePending
-
Replace
ConsumePurchase(sku)withcontroller.ConfirmPurchase(order). The new method takes thePendingOrderobject fromOnPurchasePending, not a SKU string. -
Add a single
ConfigureStoreAsynccall beforecontroller.Connect():await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);
await _controller.Connect();
See the full migration guide for complete before/after examples: Updating from a previous AppCoins Unity Plugin version
Version 4.x (Current)
v4.3.3 — July 2026
Bug Fixes & Improvements
- Improved attribution reliability with exponential backoff retry logic.
- Increased log levels to ensure SDK lifecycle logs are persisted on device.
v4.3.2 — March 2026
Bug Fixes & Improvements
- Fixed a bug where
getWalletListreturned a duplicated wallet after a guest-to-user account conversion.
v4.3.1 — March 2026
Bug Fixes & Improvements
- Fixed a mismatch between the
PURCHASE_STATE_USER_CANCELLEDconstant value and the AppCoins SDK return value.
v4.3.0 — March 2026
Bug Fixes & Improvements
- Added the
AppCoinsnamespace to plugin classes to avoid naming conflicts with other packages. - Fixed an issue where the SDK was linked to both the main target and
UnityFramework, causing duplicate class warnings in Xcode. - Removed the SwiftyRSA dependency, which caused conflicts with Apple's MessageProtection framework. If you added a workaround for this conflict, it can be removed.
v4.2.0 — February 2026
Bug Fixes & Improvements
- Added
installation_originandoem_idparameters to the Web Checkout URL for improved attribution.
v4.1.2 — February 2026
Bug Fixes & Improvements
- Fixed an issue where the MMP installation event was triggered regardless of installation source. The event now fires only for Aptoide-distributed installs.
v4.1.1 — February 2026
New Features
- Added CTC (Catappult Token Contribution) transaction reporting. The Xcode post-build script now automatically sets
MKSellsDigitalGoodstoYESinInfo.plist. No manual configuration is required.
v4.0.1 — December 2025
Bug Fixes & Improvements
AppCoinsSDK.Instance.IsAvailable()now returnsfalseby default again. The previous change that altered this default has been reverted.- Raised the web3swift package dependency version for Swift 6.2 compatibility.
v4.0.0 — November 2025
Breaking Changes
AppCoinsSDK.Instance.IsAvailable()now requires priorInitialize()call — the method returnsfalseifInitialize()has not been called, instead of performing a live availability check. Code that callsIsAvailable()without a precedingInitialize()will always receivefalse.
New Features
- Replaced the native checkout UI with a Web Checkout flow. No API changes are required.
AppCoinsSDK.Instance.IsAvailable()now returnsfalseifInitialize()has not been called. EnsureInitialize()is called before any purchase attempt.- Added support for older iOS versions.
Migration Steps
- Ensure
Initialize()is called beforeIsAvailable()at every application entry point. Move theInitialize()call toAwake()or the earliestStart()in your initialization sequence.
Version 3.x
v3.0.0 — May 2025
Breaking Changes
-
AppCoinsPurchaseManager.OnPurchaseUpdatedcallback type changed — the event signature changed fromAction<PurchaseResponse>toAction<PurchaseIntent>. All existing handlers must be rewritten to accept the new type and callConfirmPurchaseIntent()orRejectPurchaseIntent()before accessing purchase data:// Before (v2.x)
private void OnPurchaseUpdated(PurchaseResponse response)
{
if (response.State == AppCoinsSDK.PURCHASE_STATE_SUCCESS)
{
GiveItemToUser(response.Purchase.Sku);
StartCoroutine(ConsumePurchase(response.Purchase.Sku));
}
}
// After (v3.0.0)
private void OnPurchaseUpdated(PurchaseIntent intent)
{
var result = AppCoinsSDK.Instance.ConfirmPurchaseIntent(intent);
if (result.IsSuccess)
GiveItemToUser(intent.Purchase.Sku);
else
AppCoinsSDK.Instance.RejectPurchaseIntent(intent);
} -
Errors are now structured objects —
AppCoinsSDKErrorreplaces raw error strings. Code that compared.Erroragainst string constants must be updated to use the new typed error class.
New Features
- Introduced
AppCoinsSDKErrorfor structured error reporting. Errors from SDK calls now include a typed error class for easier identification. - Refactored response types to
AppCoinsSDKResult<T>for consistent handling across all async operations. - Added support for deferred indirect purchases and the ability to reject a
PurchaseIntentviaRejectPurchaseIntent().
Migration Steps
-
Update all
OnPurchaseUpdatedhandlers to acceptPurchaseIntentinstead ofPurchaseResponse. Replace access toresponse.Stateandresponse.Purchasewith a call toAppCoinsSDK.Instance.ConfirmPurchaseIntent(intent)to complete the purchase, orRejectPurchaseIntent(intent)to decline it. -
Update error handling to use
AppCoinsSDKErrorinstead of raw string comparisons. Access the error viaAppCoinsSDKResult<T>.Error, which now exposesType,Message, andDescriptionfields.
Version 2.x
v2.0.1 — March 2025
Bug Fixes & Improvements
- Fixed a crash when
Purchase()was called multiple times in quick succession while the SDK was unavailable.
v2.0.0 — March 2025
New Features
- Added a listener to
Purchase.updatesfor handling indirect in-app purchases (purchases initiated outside the app). - Set minimum AppCoins SDK dependency to v2.0.0, adding support for user authentication and developer testing features.
Version 1.x
Version 1.x provided a direct singleton API (AppCoinsSDK.Instance) with async methods for each billing operation. All results were returned as AppCoinsSDKResult<T> wrappers.
Key API surface (for reference):
AppCoinsSDK.Instance.IsAvailable()→AppCoinsSDKResult<Bool>AppCoinsSDK.Instance.GetProducts(skus)→AppCoinsSDKResult<[AppCoinsProduct]>AppCoinsSDK.Instance.Purchase(sku, payload)→ delivered viaAppCoinsPurchaseManager.OnPurchaseUpdatedAppCoinsSDK.Instance.ConsumePurchase(sku)→AppCoinsSDKResult<Void>AppCoinsSDK.Instance.GetUnfinishedPurchases()→AppCoinsSDKResult<[AppCoinsPurchase]>
All of the above are removed in v5.x. Follow the migration steps listed under Version 5.x to update your project.