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

Unity IAP v5 と併用して AppCoins を追加する

このガイドでは、すでに Unity IAP v5(5.0 以降)を使用している Unity ゲームに AppCoins Billing を追加する方法を説明します。プロジェクトがそれより古い Unity IAP バージョンを使用している場合は、先に Unity IAP v4 以前と併用して AppCoins を追加する を参照してください。必要なのは、既存の Connect() 呼び出しの前に 1 行追加することだけです。すでに記述したイベントハンドラー、商品定義、確定処理はすべてそのままで、Aptoide 経由で配信されたビルドでは AppCoins が有効なストアになります。

セットアップ

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

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

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

概要

AppCoins は、カスタムストアプロバイダーとして Unity IAP v5 に統合されます。設定が完了すると、すでに使用している StoreController API が、条件を満たす場合は自動的に AppCoins Billing へ購入をルーティングし、それ以外の場合は Apple Billing にフォールバックします。購入用の別 API は不要です。

変更点は 1 つだけ

AppCoins の API を使用するファイルに追加するものは 2 つです。名前空間のインポートと、Connect() の前の 1 つの await です。

変更前:

_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
_controller.ProcessPendingOrdersOnPurchasesFetched(true);
await _controller.Connect();
_controller.FetchProducts(new List<ProductDefinition> { new ProductDefinition("your_product_id", ProductType.Consumable) });
_controller.FetchPurchases();

変更後:

using AppCoins.Unity; // Add this using directive

// ↓ This is the only new line required
await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);

_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;
_controller.ProcessPendingOrdersOnPurchasesFetched(true);
await _controller.Connect();
_controller.FetchProducts(new List<ProductDefinition> { new ProductDefinition("your_product_id", ProductType.Consumable) });
_controller.FetchPurchases();
⚠️
警告: ConfigureStoreAsynccontroller.Connect() の前に呼び出して await してください。ストアを設定せずに Connect() を呼び出すと、ストアプロバイダーが誤って設定されるか、登録されない状態になります。

Automatic モードの動作

AppCoinsStoreMode.Automatic は起動時に AppDistributor.current を照会し、iOS 17.4 以降で、Apple App Store および TestFlight 以外からインストールされた場合に AppCoins Billing を有効にします。インストール元ごとの詳細は、実行時判定の仕組み を参照してください。

OnPurchasePendingOnProductsFetchedOnPurchaseConfirmedOnPurchaseFailed の各ハンドラーは、どのストアが有効であっても同じように発火します。どちらの経路が選択されたかを確認するには、ConfigureStoreAsync の完了後に AppCoinsIAP.SelectedStore を参照してください。

var selectedStore = await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);
// selectedStore is either "AppCoinsAppStore" or "AppleAppStore"
Debug.Log("Active billing store: " + selectedStore);

レシートの変更点

サーバーサイドで購入検証を行っている場合、AppCoins Billing が有効なときは order.Info.Receipt に Apple のレシートではなく AppCoins の JSON ペイロードが含まれる点にご注意ください。レシートの構造とサーバーサイド検証のフローについては、購入の検証 を参照してください。

変更前後の完全な例

以下の例は Unity IAP v5 の完全なセットアップを示し、AppCoins を追加するために必要な唯一の変更点を強調しています。

変更前 — Apple のみの標準的な Unity IAP v5:

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Extension;

public class IAPManager : MonoBehaviour
{
private StoreController _controller;

private async void Start()
{
_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;

_controller.ProcessPendingOrdersOnPurchasesFetched(true);

await _controller.Connect();

_controller.FetchProducts(new List<ProductDefinition> { new ProductDefinition("your_product_id", ProductType.Consumable) });
_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;

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

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

変更後 — AppCoins を追加した同じコード(強調された行が新規):

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Extension;
using AppCoins.Unity; // Add this using directive

public class IAPManager : MonoBehaviour
{
private StoreController _controller;

private async void Start()
{
// ↓ This is the only new line required
await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic);

_controller = UnityIAPServices.StoreController();
_controller.OnProductsFetched += OnProductsFetched;
_controller.OnPurchasePending += OnPurchasePending;

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

await _controller.Connect();

_controller.FetchProducts(new List<ProductDefinition> { new ProductDefinition("your_product_id", ProductType.Consumable) });

// 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;

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

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

AppCoins 固有の追加は、using AppCoins.Unity; ディレクティブと await AppCoinsIAP.ConfigureStoreAsync(AppCoinsStoreMode.Automatic); の呼び出しだけです。その他(ProcessPendingOrdersOnPurchasesFetched(true)FetchProducts(List<ProductDefinition>)FetchPurchases())はすべて標準的な Unity IAP v5 のものであり、変更前・変更後のどちらにも含まれます。