メインコンテンツまでスキップ

以前の AppCoins Unity プラグインからの更新

このガイドでは、以前の AppCoins Unity プラグインから現行バージョンへ移行する方法を説明します。以前のプラグインは、商品の取得、購入の開始、購入の消費を行う直接 API をシングルトン(AppCoinsSDK.Instance)として公開していました。新しいプラグインは、カスタムストアプロバイダーとして Unity IAP v5 の上に構築されています。すべての課金操作は、標準の Unity IAP StoreController のイベントとメソッドを通じて行われます。旧来の直接 API はもう存在しません。

概要

新しいプラグインは旧プラグインをラップするものではなく、完全に置き換えるものです。旧 SDK のファイルをプロジェクトから削除し、IAP のコードを Unity IAP v5 のパターンで書き直してください。移行作業は機械的です。旧来の各メソッドには新 API に直接対応するものがあり、購入のライフサイクルも一対一で対応します。

互換性のない変更の一覧

旧 API新 API
await AppCoinsSDK.Instance.IsAvailable()AppCoinsStoreMode.Automatic が自動的に処理します
await AppCoinsSDK.Instance.GetProducts(skus)controller.OnProductsFetched イベント
await AppCoinsSDK.Instance.Purchase(sku, payload)controller.PurchaseProduct(productId)OnPurchasePending イベント
await AppCoinsSDK.Instance.ConsumePurchase(sku)controller.ConfirmPurchase(order)
await AppCoinsSDK.Instance.GetUnfinishedPurchases()controller.ProcessPendingOrdersOnPurchasesFetched(true)controller.FetchPurchases()OnPurchasePending が再発火
await AppCoinsSDK.Instance.GetAllPurchases()Transaction.all(Unity プラグインではまだ公開されていません)。回避策として、未完了の購入の復元には controller.FetchPurchases() を使用してください。購入履歴の全件取得は、現時点では Unity プラグインで利用できません。
AppCoinsPurchaseManager.OnPurchaseUpdatedcontroller.OnPurchasePending
AppCoinsSDKPurchaseResult.State の文字列Unity IAP v5 の PendingOrder / ConfirmedOrder / FailedOrder
AppCoinsSDK.PURCHASE_STATE_SUCCESScontroller.OnPurchaseConfirmed イベント
AppCoinsSDK.PURCHASE_STATE_FAILEDcontroller.OnPurchaseFailed イベント
await AppCoinsSDK.Instance.ConfirmPurchaseIntent()削除 — PurchaseIntent は完全になくなりました

段階的な移行手順

1. 旧プラグインを削除する

Assets フォルダーから旧 AppCoins SDK のファイルを削除します。通常は次のものが含まれます。

  • AppCoinsSDK.cs
  • AppCoinsPurchaseManager.cs
  • AppCoinsSDKPurchaseResultAppCoinsSDKResultAppCoinsSDKError に関するすべてのファイル
  • 手動で追加していた場合は、旧来のネイティブ iOS フレームワークまたは .xcframework バンドル

スクリプトから、旧 SDK の名前空間を参照するすべての using ディレクティブを削除してください。

2. 新しいプラグインを追加する

GitHub のリリースページ から最新の .unitypackage をダウンロードし、インポートします。

  1. Unity で Assets → Import Package → Custom Package... を開きます。
  2. ダウンロードした .unitypackage ファイルを選択します。
  3. Import Unity Package ダイアログですべての項目が選択されていることを確認し、Import をクリックします。

プラグインのファイルは Assets/Plugins/iOS/AppCoinsSDKPlugin/ に配置されます。

3. Package Manager から Unity IAP を追加する

新しいプラグインには Unity IAP v5 が必要です。Window → Package Manager を開き、In App Purchasingcom.unity.purchasing)を検索して、バージョン 5.0 以降をインストールしてください。

⚠️
警告: 新しいプラグインには com.unity.purchasing 5.0 以降が必要です。このパッケージがない場合、コンパイルに失敗します。

4. 購入の呼び出しを Unity IAP v5 のフローに置き換える

AppCoinsSDK.Instance.Purchase(sku, payload)AppCoinsPurchaseManager.OnPurchaseUpdated の呼び出しをすべて、Unity IAP v5 の PurchaseProduct / OnPurchasePending パターンに置き換えてください。

変更前:

// Old: subscribe to OnPurchaseUpdated and call Purchase directly
AppCoinsPurchaseManager.OnPurchaseUpdated += OnPurchaseUpdated;
await AppCoinsSDK.Instance.Purchase("gas", "optional_payload");

private void OnPurchaseUpdated(AppCoinsSDKPurchaseResult result)
{
if (result.State == AppCoinsSDK.PURCHASE_STATE_SUCCESS)
{
GiveItemToUser(result.Sku);
StartCoroutine(ConsumePurchase(result.Sku));
}
else if (result.State == AppCoinsSDK.PURCHASE_STATE_FAILED)
{
Debug.LogError("Purchase failed: " + result.Error);
}
}

変更後:

// New: use Unity IAP v5 PurchaseProduct and subscribe to events
_controller.OnPurchasePending += OnPurchasePending;
_controller.OnPurchaseConfirmed += order => Debug.Log("Confirmed: " + order.Info.TransactionID);
_controller.OnPurchaseFailed += failure => Debug.LogError("Failed: " + failure.FailureReason);

_controller.PurchaseProduct("gas");

private void OnPurchasePending(PendingOrder order)
{
var product = order.CartOrdered.Items().FirstOrDefault()?.Product;
if (product == null) return;

GiveItemToUser(product.definition.id);
_controller.ConfirmPurchase(order);
}

5. ConsumePurchase を ConfirmPurchase に置き換える

AppCoinsSDK.Instance.ConsumePurchase(sku) の呼び出しをすべて controller.ConfirmPurchase(order) に置き換えてください。SKU の文字列ではなく PendingOrder オブジェクトを渡します。

変更前:

var result = await AppCoinsSDK.Instance.ConsumePurchase("gas");
if (result.IsSuccess) { /* done */ }

変更後:

_controller.ConfirmPurchase(order); // order is the PendingOrder from OnPurchasePending
⚠️
購入が成功するたびに ConfirmPurchase を呼び出してください。確定されなかった購入は 24 時間後に自動的に返金されます。

6. PurchaseIntent の処理を削除する

PurchaseIntentConfirmPurchaseIntentRejectPurchaseIntent を参照するコードはすべて削除してください。これらの型はもう存在しません。新しい API にインテントの段階はなく、購入は成功する(OnPurchasePending に届く)か失敗する(OnPurchaseFailed に届く)かのいずれかです。

変更前後の完全な例

変更前 — 旧来の直接 API:

using UnityEngine;
using AppCoins; // old namespace

public class OldIAPManager : MonoBehaviour
{
private async void Start()
{
// 1. Check availability manually
var availability = await AppCoinsSDK.Instance.IsAvailable();
if (!availability.IsSuccess || !availability.Value)
{
Debug.Log("AppCoins not available, falling back to Apple");
return;
}

// 2. Subscribe to purchase events
AppCoinsPurchaseManager.OnPurchaseUpdated += OnPurchaseUpdated;

// 3. Fetch products
var productsResult = await AppCoinsSDK.Instance.GetProducts(new[] { "gas", "premium_pack" });
if (productsResult.IsSuccess)
{
foreach (var product in productsResult.Value)
{
Debug.Log($"Product: {product.Sku}{product.PriceLabel}");
}
}

// 4. Handle unfinished purchases
var unfinished = await AppCoinsSDK.Instance.GetUnfinishedPurchases();
if (unfinished.IsSuccess)
{
foreach (var purchase in unfinished.Value)
{
GiveItemToUser(purchase.Sku);
await AppCoinsSDK.Instance.ConsumePurchase(purchase.Sku);
}
}
}

public async void BuyProduct(string sku)
{
await AppCoinsSDK.Instance.Purchase(sku, "optional_payload");
}

private async void OnPurchaseUpdated(AppCoinsSDKPurchaseResult result)
{
if (result.State == AppCoinsSDK.PURCHASE_STATE_SUCCESS)
{
GiveItemToUser(result.Sku);
var consumeResult = await AppCoinsSDK.Instance.ConsumePurchase(result.Sku);
if (!consumeResult.IsSuccess)
{
Debug.LogError("Consume failed: " + consumeResult.Error);
}
}
else if (result.State == AppCoinsSDK.PURCHASE_STATE_FAILED)
{
Debug.LogError("Purchase failed: " + result.Error);
}
}

private void GiveItemToUser(string sku)
{
Debug.Log($"Granting item: {sku}");
}
}

変更後 — 新しい Unity IAP v5 アダプター:

using System.Linq;
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Extension;
using AppCoins.Unity; // new namespace

public class NewIAPManager : MonoBehaviour
{
private StoreController _controller;

private async void Start()
{
// 1. Configure the store — replaces manual IsAvailable() check
var selectedStore = await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);
Debug.Log("Active store: " + selectedStore);

// 2. Get the controller and subscribe to events
_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
_controller.OnPurchaseConfirmed += order => Debug.Log("Confirmed: " + order.Info.TransactionID);
_controller.OnPurchaseFailed += f => Debug.LogError("Failed: " + f.FailureReason);

// 3. Re-fire OnPurchasePending for any unfinished purchases found by FetchPurchases()
_controller.ProcessPendingOrdersOnPurchasesFetched(true);

// 4. Connect — triggers OnProductsFetched when products are available
await _controller.Connect();

// 5. Trigger recovery of unfinished purchases — results arrive via OnPurchasePending
_controller.FetchPurchases();
}

private void OnProductsFetched(List<Product> products)
{
foreach (var product in products)
{
Debug.Log($"Product: {product.definition.id}{product.metadata.localizedPriceString}");
}
}

public void BuyProduct(string productId)
{
_controller.PurchaseProduct(productId);
}

private void OnPurchasePending(PendingOrder order)
{
var product = order.CartOrdered.Items().FirstOrDefault()?.Product;
if (product == null) return;

// Deliver the item before confirming
GiveItemToUser(product.definition.id);
// Confirm (consume) the purchase
_controller.ConfirmPurchase(order);
}

private void GiveItemToUser(string productId)
{
Debug.Log($"Granting item: {productId}");
}
}