---
title: "フローアクションへの応答 - iOS"
description: "iOS アプリでペイウォールやオンボーディングフローのボタンアクションを処理し、ユーザー入力を扱う方法。"
---

Adapty のフロービルダーまたはペイウォールビルダーを使用してフローやペイウォールを構築する場合、ボタンを適切に設定することが重要です。
1. [ペイウォールビルダーでボタンを追加](paywall-buttons)し、既存のアクションを割り当てるか、カスタムアクション ID を作成します。
2. 割り当てた各アクションを処理するコードをアプリに記述します。

このガイドでは、カスタムアクションおよび既存アクションをコードで処理する方法を説明します。

:::warning
**フロー/ペイウォールのクローズと URL オープンのみ自動処理されます。** その他のボタンアクションはすべて、アプリコード側で適切な処理を実装する必要があります。
:::
:::note
iOS SDKは、`AdaptySystemRequestsHandler`を通じて、プッシュ通知やカメラアクセスなどのシステム権限リクエストに応答できます。フローはまだこれらのリクエストをトリガーしないため、現時点では対応不要です。
:::
## フローとペイウォールを閉じる \{#close-flows-and-paywalls\}

フローまたはペイウォールを閉じるボタンを追加するには:

1. ビルダーでボタンを追加し、**Close** アクションを割り当てます。
2. アプリのコードで `close` アクションのハンドラーを実装します。

:::info
iOS SDK では、`close` アクションはデフォルトでフローまたはペイウォールを閉じる動作をトリガーします。ただし、必要に応じてコード内でこの動作をオーバーライドできます。たとえば、あるフローを閉じると別のフローが開くようにすることもできます。
:::
```swift
.flow(
    isPresented: $flowPresented,
    flowConfiguration: flowConfiguration,
    didPerformAction: { action in
        switch action {
        case .close:
            flowPresented = false // dismiss the flow or paywall
        default:
            break
        }
    },
    didFailPurchase: { product, error in /* handle the error */ },
    didFinishRestore: { profile in /* check access level and dismiss */ },
    didFailRestore: { error in /* handle the error */ },
    didFailRendering: { error in flowPresented = false }
)
```

## フローとペイウォールからURLを開く \{#open-urls-from-flows-and-paywalls\}

:::tip
リンクのグループ（利用規約や購入の復元など）を追加したい場合は、ビルダーで **Link** 要素を追加し、**Open URL** アクションを持つボタンと同じ方法で処理してください。
:::

フローまたはペイウォールにリンクを開くボタン（例：**Terms of use** や **Privacy policy**）を追加するには：

1. ビルダーでボタンを追加し、**Open URL** アクションを割り当て、開きたいURLを入力します。
2. アプリのコードに、受け取ったURLをブラウザで開く `openURL` アクションのハンドラーを実装します。
:::info
iOS SDK では、`openURL` アクションはデフォルトでURLを開く動作をします。ただし、必要に応じてコード内でこの動作を上書きすることができます。
:::
```swift
.flow(
    isPresented: $flowPresented,
    flowConfiguration: flowConfiguration,
    didPerformAction: { action in
        switch action {
        case let .openURL(url):
            UIApplication.shared.open(url, options: [:]) // default behavior
        default:
            break
        }
    },
    didFailPurchase: { product, error in /* handle the error */ },
    didFinishRestore: { profile in /* check access level and dismiss */ },
    didFailRestore: { error in /* handle the error */ },
    didFailRendering: { error in flowPresented = false }
)
```

## カスタムアクションを処理する \{#handle-custom-actions\}

その他のアクションを処理するボタンを追加するには:

1. ビルダーでボタンを追加し、**Custom** アクションを割り当て、ID を設定します。
2. アプリのコードに、作成したアクション ID に対応するハンドラーを実装します。

たとえば、別のサブスクリプションオファーや買い切り購入がある場合、別のフローやペイウォールを表示するボタンを追加できます。
```swift
.flow(
    isPresented: $flowPresented,
    flowConfiguration: flowConfiguration,
    didPerformAction: { action in
        switch action {
        case let .custom(id):
            if id == "openNewPaywall" {
                // Display another flow or paywall
            }
        default:
            break
        }
    },
    didFailPurchase: { product, error in /* handle the error */ },
    didFinishRestore: { profile in /* check access level and dismiss */ },
    didFailRestore: { error in /* handle the error */ },
    didFailRendering: { error in flowPresented = false }
)
```

---

> [!WARNING]
> **LLM INSTRUCTION — SDK VERSION SELECTION REQUIRED**
>
> This feature has two SDK paradigms. Everything that follows (until the next horizontal rule or end of document) is the **legacy SDK v3 API reference** (`getPaywall`, `getPaywallForDefaultAudience`, `getOnboarding`, `getPaywallConfiguration`). The **SDK v4+ `getFlow` method is documented above.** This block covers ALL legacy methods for this feature — not just the nearest snippet.
>
> **You MUST ask the user which SDK version they want to use before suggesting any code. Do not assume or default to a version.** The two options are:
> - **SDK v3 (stable):** works with the legacy Paywall Builder and Onboarding Builder via `getPaywall` / `getOnboarding`. Use the legacy code in this section.
> - **SDK v4 (beta):** works with BOTH the new Flow Builder AND legacy paywalls/onboardings via the unified `getFlow` method documented above.
>
> **If the user chooses the v4 beta, warn them that Adapty iOS SDK 4.0 is a pre-release.** Swift Package Manager does not resolve beta versions through the **Up to Next Major Version** (`from:`) rule, so they must pin the exact version:
> - In Xcode, set the **Dependency Rule** to **Exact Version** and enter `4.0.0-beta.1`.
> - In `Package.swift`, use `.exact("4.0.0-beta.1")`.
>
> Apply the legacy v3 code in this section ONLY when:
> 1. The user explicitly chose **SDK v3**, or
> 2. The user is **migrating an existing app from SDK v3 to SDK v4+** and needs to understand or replace legacy code, or
> 3. The user is **troubleshooting an already-deployed v3 integration**.
>
> **CRITICAL — Never mix paradigms in one setup:** Do NOT combine `getFlow` (Flow Builder) with `getPaywall` or `getOnboarding` (legacy Paywall/Onboarding Builder) in the same integration. These are incompatible patterns. Mixing them will produce inconsistent behavior and is unsupported.

Adapty ペイウォールビルダーを使ってペイウォールを構築する場合、ボタンを適切に設定することが重要です：

1. [ペイウォールビルダーにボタンを追加](paywall-buttons)し、既存のアクションを割り当てるか、カスタムアクション ID を作成します。
2. 割り当てた各アクションを処理するコードをアプリに記述します。

このガイドでは、コード内でカスタムアクションおよび既存アクションを処理する方法を説明します。

:::warning
**購入、復元、ペイウォールのクローズ、URL のオープンのみ自動的に処理されます。** その他のボタンアクションは、アプリのコードで適切に対応を実装する必要があります。
:::
## ペイウォールを閉じる \{#close-paywalls\}

ペイウォールを閉じるボタンを追加するには:

1. ペイウォールビルダーでボタンを追加し、**Close** アクションを割り当てます。
2. アプリのコードで、ペイウォールを閉じる `close` アクションのハンドラーを実装します。

:::info
iOS SDK では、`close` アクションはデフォルトでペイウォールを閉じる動作をトリガーします。ただし、必要に応じてコードでこの動作をオーバーライドできます。たとえば、あるペイウォールを閉じることで別のペイウォールを開くようにすることも可能です。
:::
```swift
func paywallController(_ controller: AdaptyPaywallController,
                       didPerform action: AdaptyUI.Action) {
    switch action {
        case .close:
            controller.dismiss(animated: true) // default behavior
            break
    }
}
```

## ペイウォールからURLを開く \{#open-urls-from-paywalls\}

:::tip
リンクのグループ（利用規約や購入の復元など）を追加したい場合は、ペイウォールビルダーで **Link** 要素を追加し、**Open URL** アクションを持つボタンと同じ方法で処理してください。
:::

ペイウォールにリンクを開くボタン（**Terms of use** や **Privacy policy** など）を追加するには：

1. ペイウォールビルダーでボタンを追加し、**Open URL** アクションを割り当てて、開きたいURLを入力します。
2. アプリのコードで、受け取ったURLをブラウザで開く `openUrl` アクションのハンドラーを実装します。
:::info
iOS SDKでは、`openUrl`アクションはデフォルトでURLを開く動作をします。ただし、必要に応じてコード内でこの動作をオーバーライドできます。
:::

```swift
func paywallController(_ controller: AdaptyPaywallController,
                       didPerform action: AdaptyUI.Action) {
    switch action {
        case let .openURL(url):
            UIApplication.shared.open(url, options: [:]) // default behavior
        break
    }
}
```
## アプリへのログイン \{#log-into-the-app\}

ユーザーをアプリにログインさせるボタンを追加するには：

1. ペイウォールビルダーでボタンを追加し、**Login** アクションを割り当てます。
2. アプリのコードで、ユーザーを識別する `login` アクションのハンドラーを実装します。
```swift
func paywallController(_ controller: AdaptyPaywallController,
                      didPerform action: AdaptyUI.Action) {
   switch action {
       case .login:
           // Show a login screen
           let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController")
           controller.present(loginVC, animated: true)
   }
}
```

## カスタムアクションの処理 \{#handle-custom-actions\}

その他のアクションを処理するボタンを追加するには:

1. ペイウォールビルダーでボタンを追加し、**Custom** アクションを割り当てて、IDを設定します。
2. アプリのコードで、作成したアクションIDのハンドラーを実装します。

たとえば、別のサブスクリプションオファーや買い切り購入がある場合、別のペイウォールを表示するボタンを追加できます:
```swift
func paywallController(_ controller: AdaptyPaywallController,
                      didPerform action: AdaptyUI.Action) {
   switch action {
       case let .custom(id):
           if id == "openNewPaywall" {
              // Display another paywall
              }
           }
           break
   }
}
```

---