# Codeless IAP の設定ボタン

> Codeless IAP ボタンと IAP リスナーを設定して使用すると、複雑なコードを書かずにアプリケーション内課金を有効にし、購入を復元できます。

Codeless IAPボタンを使用すると、最小限のスクリプトでアプリケーション内課金と復元ボタンを簡単に設定できます。IAP ボタンを使用して、購入および復元機能を UI ボタンに直接追加します。このアプローチは、ユーザーがアプリケーション内で製品を購入または復元するためのシンプルな方法を提供します。

## OnProductFetched を使用して製品の詳細を更新##use-onproductfetched-to-update-product-details

Unity Iap は、アプリケーション ストアから製品情報を取得するときに `OnProductFetched` イベントを発生させます。タイトル、説明、価格など、UI内の製品に関連するすべてのテキストをこのイベントで更新してください。

`OnProductFetched` スクリプトの例：

> **Tip:**
>
> 以下のようなスクリプトを `IAPButton` に追加して、さまざまなビューをこのイベントにリンクします。

```cs
public class IAPButtonView : MonoBehaviour
{
    [SerializeField]
    TMP_Text title;
    [SerializeField]
    TMP_Text price;

    public void OnProductFetched(Product product)
    {
        if (title != null)
        {
            title.text = product.metadata.localizedTitle;
        }

        if (price != null)
        {
            price.text = product.metadata.localizedPriceString;
        }
    }
}
```

## IAP リスナー##iap-listeners

Codeless IAP は通常、成功と失敗の購入イベントをシーン内のアクティブな IAP ボタンコンポーネントに送信します。ただし、IAP ボタンの使用は現実的ではありません。例えば、購入処理が中断されて完了しなかった場合、Unity Iap は次回の初期化時 (通常はアプリケーション起動直後で、IAP ボタンがまだ初期化されていない場合) に購入処理を再度試行します。このような場合は、IAP Listener コンポーネントを使用できます。IAP リスナーは、IAP ボタンで処理できない購入イベントを受信し、すべての購入が正しく処理されるようにします。IAP リスナーをシーンに追加して、これらのイベントを自動的にハンドルします。

> **Note:**
>
> 複製応答を避けるために、IAP リスナーによって処理されるイベントが同じ製品の IAP ボタンによってサブスクライブされていないことを確認してください。

IAP リスナーを追加するには、次の手順を実行します。

1. Unity エディターで、**［Services**］＞ ［**アプリ内課金**］＞ ［**Create IAP Listener］** を選択します。
2. 手順に従って、購入処理スクリプトをゲームオブジェクトコンポーネントとして作成します。詳細については、[購入処理](./codeless-iap.md#purchase-fulfillment) を参照してください。
3. 階層リストから **IAP Listener** を選択し、Inspector でその **IAP Listener** スクリプトコンポーネントを探します。次に、**+** を選択して、**On Purchases Fetched (Orders)** と \*\*On Order Pending (\*\*PendingOrder) の機能を追加します。
   * **On Order Pending** はすべての新規トランザクションを処理し、個々の `PendingOrder`に対して実行されます。
   * **On Purchases Fetched は**、既存のすべてのトランザクションを処理し、すべてのアクティブな Pending、Confirmed、およびディファードトランザクションを含む `Orders` オブジェクトで呼び出されます。
4. 購入処理スクリプトを持つゲームオブジェクトをコンポーネントの Inspector のイベントフィールドにドラッグし、ドロップダウンメニューから機能を選択します。

## 復元ボタン##restore-button

Apple App Store などの一部のアプリケーション ストアでは、アプリケーションに**復元**ボタンが必要です。Codeless IAPは、アプリケーションに復元ボタンを実装する簡単な方法を提供します。

**復元**ボタンを追加するには、次の手順を実行します。

1. シーンに **IAP ボタン**を追加します（**［Services］**＞ ［**アプリ内課金**］＞ ［**Create IAP ボタン**）。
2. **IAP ボタン**を選択した状態で、Inspector で **IAP ボタン**コンポーネントを探します。
   1. 「**ボタンの種類**」ドロップダウンメニューで、「**復元**」を選択します。Inspector ウィンドウが更新され、復元 ボタンに関連するフィールドのみがディスプレイされます。
3. 任意: プラス(+)ボタンを選択して、`On Transactions Restored (Boolean, String)`にスクリプトを追加します。
   1. トランザクション復元スクリプトを持つゲームオブジェクトをコンポーネントの Inspector のイベントフィールドにドラッグし、ドロップダウンから機能を選択します。

```cs title="OnTransactionsRestored example"
public void OnTransactionsRestored(bool success, string? error)
{
    Debug.Log($"TransactionsRestored: {success} {error}");
}
```

ユーザーがランタイムにこのボタンを選択すると、現在のストアの購入復元 API が呼び出されます。Apple App Store では、これは Apple のビルトイン復元または同期フローをトリガーします。
google play では、復元は IAP 初期化の一部です。ランタイムの追加復元呼び出しで結果が得られることはほとんどありません。

Unity Iap は常に **Restore IAP ボタン**で `OnTransactionsRestored` メソッドを実行し、復元が失敗した場合は結果と関連するエラー メッセージを表示します。

トランザクションが正常に復元されると、Unity Iap は製品にリンクされた **IAP ボタン**の `OnPurchaseFetched` コールバック、または **IAP Listener** コンポーネントの `OnPurchasesFetched` コールバックを呼び出します。

```cs
public void OnOrderPending(PendingOrder order)
{
    foreach (var cartItem in order.CartOrdered.Items())
    {
        var product = cartItem.Product;
        // grant purchase...
    }
}

public void OnPurchasesFetched(Orders existingOrders)
{
    Foreach (existOrders.ConfirmedOrders の var order)
    {
        foreach (var cartItem in order.CartOrdered.Items())
        {
            var product = cartItem.Product;
            // grant access...
        }
    }
}
```
