Skip to main content

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 on AppCoinsSDK.Instance must be rewritten using the Unity IAP v5 StoreController pattern.

  • AppCoinsSDK.Instance removed — the following instance methods no longer exist:

    Removed methodReplacement
    AppCoinsSDK.Instance.IsAvailable()AppCoinsStoreMode.Automatic (automatic runtime detection)
    AppCoinsSDK.Instance.GetProducts(skus)controller.OnProductsFetched event
    AppCoinsSDK.Instance.Purchase(sku, payload)controller.InitiatePurchase(productId) + OnPurchasePending
    AppCoinsSDK.Instance.ConsumePurchase(sku)controller.ConfirmPurchase(order)
    AppCoinsSDK.Instance.GetUnfinishedPurchases()controller.FetchPurchases() + controller.CheckEntitlement()
  • AppCoinsPurchaseManager.OnPurchaseUpdated removed — replace with subscriptions to controller.OnPurchasePending, controller.OnPurchaseConfirmed, and controller.OnPurchaseFailed.

  • PurchaseIntent removedConfirmPurchaseIntent and RejectPurchaseIntent no longer exist. The new API does not have an intent confirmation step.

  • AppCoinsSDKPurchaseResult removed — replaced by Unity IAP v5 order types:

    Old type / constantReplacement
    AppCoinsSDKPurchaseResult with .State stringsPendingOrder, ConfirmedOrder, FailedOrder Unity IAP types
    AppCoinsSDK.PURCHASE_STATE_SUCCESScontroller.OnPurchaseConfirmed event
    AppCoinsSDK.PURCHASE_STATE_FAILEDcontroller.OnPurchaseFailed event
  • AppCoinsSDKResult<T> removed — results are now delivered through Unity IAP v5 event callbacks.

  • Unity IAP v5 now requiredcom.unity.purchasing 5.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 before StoreController.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 dataorder.Info.Receipt contains a JSON payload including Payload.verification.data.purchaseToken for server-side validation.

Migration Steps

  1. Remove the old plugin from Assets. Delete AppCoinsSDK.cs, AppCoinsPurchaseManager.cs, AppCoinsSDKPurchaseResult.cs, AppCoinsSDKResult.cs, and any related files.

  2. Add the new plugin from GitHub releases. Download the latest .unitypackage and import it into your Assets folder.

  3. Add com.unity.purchasing 5.0 or later via Package Manager. Open Window → Package Manager, search for In App Purchasing, and install version 5.0 or later.

  4. Replace all AppCoinsSDK.Instance.* calls with the Unity IAP v5 StoreController pattern:

    • IsAvailable()AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic)
    • GetProducts(skus) → subscribe to controller.OnProductsFetched
    • Instance.Purchase(sku, payload)controller.InitiatePurchase(productId)
    • Handle purchase result in controller.OnPurchasePending
  5. Replace ConsumePurchase(sku) with controller.ConfirmPurchase(order). The new method takes the PendingOrder object from OnPurchasePending, not a SKU string.

  6. Add a single ConfigureStoreAsync call before controller.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 getWalletList returned 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_CANCELLED constant value and the AppCoins SDK return value.

v4.3.0 — March 2026

Bug Fixes & Improvements

  • Added the AppCoins namespace 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_origin and oem_id parameters 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 MKSellsDigitalGoods to YES in Info.plist. No manual configuration is required.

v4.0.1 — December 2025

Bug Fixes & Improvements

  • AppCoinsSDK.Instance.IsAvailable() now returns false by 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 prior Initialize() call — the method returns false if Initialize() has not been called, instead of performing a live availability check. Code that calls IsAvailable() without a preceding Initialize() will always receive false.

New Features

  • Replaced the native checkout UI with a Web Checkout flow. No API changes are required.
  • AppCoinsSDK.Instance.IsAvailable() now returns false if Initialize() has not been called. Ensure Initialize() is called before any purchase attempt.
  • Added support for older iOS versions.

Migration Steps

  1. Ensure Initialize() is called before IsAvailable() at every application entry point. Move the Initialize() call to Awake() or the earliest Start() in your initialization sequence.

Version 3.x

v3.0.0 — May 2025

Breaking Changes

  • AppCoinsPurchaseManager.OnPurchaseUpdated callback type changed — the event signature changed from Action<PurchaseResponse> to Action<PurchaseIntent>. All existing handlers must be rewritten to accept the new type and call ConfirmPurchaseIntent() or RejectPurchaseIntent() 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 objectsAppCoinsSDKError replaces raw error strings. Code that compared .Error against string constants must be updated to use the new typed error class.

New Features

  • Introduced AppCoinsSDKError for 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 PurchaseIntent via RejectPurchaseIntent().

Migration Steps

  1. Update all OnPurchaseUpdated handlers to accept PurchaseIntent instead of PurchaseResponse. Replace access to response.State and response.Purchase with a call to AppCoinsSDK.Instance.ConfirmPurchaseIntent(intent) to complete the purchase, or RejectPurchaseIntent(intent) to decline it.

  2. Update error handling to use AppCoinsSDKError instead of raw string comparisons. Access the error via AppCoinsSDKResult<T>.Error, which now exposes Type, Message, and Description fields.


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.updates for 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 via AppCoinsPurchaseManager.OnPurchaseUpdated
  • AppCoinsSDK.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.