以前の 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.OnPurchaseUpdated | controller.OnPurchasePending |
AppCoinsSDKPurchaseResult.State の文字列 | Unity IAP v5 の PendingOrder / ConfirmedOrder / FailedOrder 型 |
AppCoinsSDK.PURCHASE_STATE_SUCCESS | controller.OnPurchaseConfirmed イベント |
AppCoinsSDK.PURCHASE_STATE_FAILED | controller.OnPurchaseFailed イベント |
await AppCoinsSDK.Instance.ConfirmPurchaseIntent() | 削除 — PurchaseIntent は完全になくなりました |
段階的な移行手順
1. 旧プラグインを削除する
Assets フォルダーから旧 AppCoins SDK のファイルを削除します。通常は次のものが含まれます。
AppCoinsSDK.csAppCoinsPurchaseManager.csAppCoinsSDKPurchaseResult、AppCoinsSDKResult、AppCoinsSDKErrorに関するすべてのファイル- 手動で追加していた場合は、旧来のネイティブ iOS フレームワークまたは
.xcframeworkバンドル
スクリプトから、旧 SDK の名前空間を参照するすべての using ディレクティブを削除してください。
2. 新しいプラグインを追加する
GitHub のリリースページ から最新の .unitypackage をダウンロードし、インポートします。
- Unity で Assets → Import Package → Custom Package... を開きます。
- ダウンロードした
.unitypackageファイルを選択します。 - Import Unity Package ダイアログですべての項目が選択されていることを確認し、Import をクリックします。
プラグインのファイルは Assets/Plugins/iOS/AppCoinsSDKPlugin/ に配置されます。
3. Package Manager から Unity IAP を追加する
新しいプラグインには Unity IAP v5 が必要です。Window → Package Manager を開き、In App Purchasing(com.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 の処理を削除する
PurchaseIntent、ConfirmPurchaseIntent、RejectPurchaseIntent を参照するコードはすべて削除してください。これらの型はもう存在しません。新しい 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}");
}
}