---
title: "フローとペイウォールを取得する - iOS"
description: "iOSアプリでAdaptyからフローとペイウォールを取得する方法。"
---

<MethodPromo method="getFlow" />
[フローまたはペイウォールビルダーのペイウォールを設計](adapty-paywall-builder)したら、それをモバイルアプリに表示できます。最初のステップは、以下の説明に従って、プレースメントに関連付けられたフローまたはペイウォールとそのビュー設定を取得することです。

:::tip

Adapty SDK をモバイルアプリに統合した実例を見たいですか？ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを示す[サンプルアプリ](sample-apps)をご確認ください。

:::

<details>
<summary>始める前に</summary>
1. Adapty ダッシュボードで[プロダクトを作成](create-product)します。
2. Adapty ダッシュボードで[フロー/ペイウォールを作成し、プロダクトを組み込み](create-paywall)ます。
3. Adapty ダッシュボードで[プレースメントを作成し、フロー/ペイウォールを組み込み](create-placement)ます。
4. モバイルアプリに [Adapty SDK](sdk-installation-ios) をインストールします。
</details>
## フローまたはペイウォールの取得 \{#fetch-flowpaywall\}

フロービルダーまたはペイウォールビルダーを使ってフローやペイウォールをデザインした場合、それをモバイルアプリのコードでレンダリングしてユーザーに表示することを心配する必要はありません。このようなフローやペイウォールには、表示する内容と表示方法の両方が含まれています。ただし、プレースメントを通じてIDを取得し、ビュー設定を準備した上で、モバイルアプリに表示する必要があります。
フローまたはペイウォールとその[ビュー設定](get-pb-paywalls#fetch-the-view-configuration)は、できるだけ早い段階で取得してください。表示する直前ではなく、理想的にはずっと前に取得しましょう。ビュー設定を取得した時点で、SDKはバックグラウンドで画像のダウンロードとキャッシュを開始します。早く取得するほど、ダウンロードが完了するまでの時間が長く確保できます。フローまたはペイウォールを表示する頃には、設定と画像がすでにキャッシュ済みで表示できる状態になっています。

フローまたはペイウォールを取得するには、`getFlow` メソッドを使用します：

<Tabs>
<TabItem value="swift" label="Swift">
```swift showLineNumbers
do {
    let flow = try await Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID")
    // the requested flow/paywall
} catch {
    // handle the error
}
```
</TabItem>
<TabItem value="callback" label="Swift-Callback">

```swift showLineNumbers
Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID") { result in
    switch result {
        case let .success(flow):
            // the requested flow/paywall
        case let .failure(error):
            // handle the error
    }
}
```
</TabItem>
</Tabs>

パラメーター:
| パラメータ | 必須/任意 | 説明 |
|---------|--------|-----------|
| **placementId** | 必須 | 取得したい[プレースメント](placements)の識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 |
| **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` | <p>デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュデータを返します。この方法を推奨するのは、ユーザーが常に最新のデータを受け取れるためです。</p><p></p><p>ただし、ユーザーが不安定なインターネット環境を利用していると想定される場合は、`.returnCacheDataElseLoad` を使用することを検討してください。これにより、キャッシュが存在する場合はキャッシュデータを返します。この場合、最新のデータが取得できないことがありますが、通信環境に左右されずに読み込み時間を短縮できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けたい場面での使用も安全です。</p><p></p><p>キャッシュはアプリを再起動しても保持され、アプリの再インストールや手動でのクリアを行った場合にのみ削除されます。</p><p></p><p>Adapty SDK はペイウォールをローカルに2つの層で保存しています。1つは上記の定期更新キャッシュ、もう1つは[フォールバックペイウォール](fallback-paywalls)です。また、CDN を使用してペイウォールをより高速に取得し、CDN に接続できない場合のスタンドアロンフォールバックサーバーも用意しています。このシステムは、常にペイウォールの最新バージョンを取得しつつ、インターネット接続が不安定な場合でも信頼性を確保するよう設計されています。</p> |
| **loadTimeout** | デフォルト: 5秒 | <p>このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルフォールバックが返されます。</p><p>まれに、内部で複数のリクエストが発生する場合があるため、`loadTimeout` に指定した時間よりわずかに遅くタイムアウトすることがあります。</p> |
レスポンスパラメーター：

| パラメーター | 説明 |
| :-------- | :---------- |
| Flow   | プレースメント、識別子（`id`、`variationId`）、名前、リモートコンフィグ、およびフローにビュー設定が含まれるかどうかを示す `hasViewConfiguration` フラグを含む `AdaptyFlow` オブジェクトです。プリロード、カスタム UI、またはプログラムによるチェック用に実際のプロダクトを取得するには、`getPaywallProducts(flow:)` を呼び出してください。 |
## ビュー設定の取得 \{#fetch-the-view-configuration\}

フローまたはペイウォールを取得したら、`flow.hasViewConfiguration` を使ってビュー設定が含まれているかどうかを確認します。このフラグは、Adapty ダッシュボードでプレースメントがどのように設計されたかを示します。

- **`true`** — プレースメントが **Flow Builder**（フロー）または **Paywall Builder**（ペイウォール）で設計されています。Adapty が UI をレンダリングします。以降の手順に従い、ビュー設定を取得して[フローまたはペイウォールを表示](ios-present-paywalls)してください。
- **`false`** — プレースメントはビルダー UI を持たないカスタムペイウォールです。
`getFlowConfiguration` メソッドを使用してビュー設定を読み込みます。

```swift showLineNumbers

guard flow.hasViewConfiguration else {
    // handle as remote config paywall
    return
}

let flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow)
```

パラメーター:
| パラメーター                | 必須/任意       | 説明 |
| :----------------------- | :------------- | :---------- |
| **forFlow**              | 必須       | `Adapty.getFlow` で取得した `AdaptyFlow` オブジェクト。 |
| **locale**               | <p>任意</p><p>デフォルト: `nil`</p> | [ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子。`-` で区切られた1つまたは2つのサブタグを持つ言語コードで指定します（例: `en`、`pt-br`）。詳細は[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。 |
| **loadTimeout**          | デフォルト: 5秒 | このメソッドのタイムアウトを制限する値です。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。内部で複数のリクエストが発生する場合があるため、`loadTimeout` で指定した時間よりわずかに遅れてタイムアウトすることがあります。 |
| **products**             | 任意       | 画面上のプロダクト表示タイミングを最適化するために、`AdaptyPaywallProduct` オブジェクトの配列を指定します。`nil` を渡すと、AdaptyUI が必要なプロダクトを自動的に取得します。 |
| **systemRequestsHandler** | 任意      | フローのアクションによってトリガーされるシステムの権限リクエストやレビューリクエストを処理する、`AdaptySystemRequestsHandler` に準拠したオブジェクト。フローにそのようなアクションが含まれる場合にのみ必要です。 |
| **assetsResolver**       | 任意       | フロー／ペイウォール内の画像や動画を上書きする `[String: AdaptyCustomAsset]` 辞書。詳細は[アセットのカスタマイズ](#customize-assets)を参照してください。 |
| **timerResolver**        | 任意       | 開発者が定義したタイマーの終了日時を提供する、`AdaptyTimerResolver` に準拠したオブジェクト。詳細は[開発者定義タイマーの設定](#set-up-developer-defined-timers)を参照してください。 |
読み込みが完了したら、[フロー/ペイウォールを表示](ios-present-paywalls)します。
## デフォルトオーディエンスのフローまたはペイウォールを取得して高速化する \{#get-a-flow-or-paywall-for-a-default-audience-to-fetch-it-faster\}

通常、フローやペイウォールはほぼ瞬時に取得されるため、このプロセスの高速化を特に気にする必要はありません。ただし、オーディエンスやプレースメントが多数あり、ユーザーのインターネット接続が不安定な場合は、フローやペイウォールの取得に想定以上の時間がかかることがあります。そのような状況では、何も表示しないよりもスムーズなユーザー体験を提供するために、デフォルトのフローまたはペイウォールを表示したいと思うかもしれません。
これに対処するために、`getFlowForDefaultAudience` メソッドを使用できます。このメソッドは、指定されたプレースメントの **All Users** オーディエンス向けのフローまたはペイウォールを取得します。ただし、推奨されるアプローチは `getFlow` メソッドでフローまたはペイウォールを取得することであり、詳細は上記の[ペイウォール情報の取得](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder)セクションをご覧ください。

:::warning
`getFlow` を推奨する理由

`getFlowForDefaultAudience` メソッドにはいくつかの重大な欠点があります：
- **後方互換性の問題**: 異なるアプリバージョン（現在と将来）で別々のペイウォールを表示する必要がある場合、課題が生じる可能性があります。現在の（レガシー）バージョンに対応したペイウォールを設計するか、現在の（レガシー）バージョンのユーザーがレンダリングされないペイウォールで問題が発生することを許容するかのどちらかを選択することになります。
- **ターゲティングの喪失**: すべてのユーザーに **All Users** オーディエンス向けに設計された同じペイウォールが表示されるため、パーソナライズされたターゲティング（国、マーケティングアトリビューション、独自のカスタム属性に基づくものを含む）が失われます。
これらのデメリットを許容してでもフローやペイウォールの取得を高速化したい場合は、以下のように `getFlowForDefaultAudience` メソッドを使用してください。それ以外の場合は、[上記](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder)で説明した `getFlow` を使用してください。
:::

```swift showLineNumbers
Adapty.getFlowForDefaultAudience(placementId: "YOUR_PLACEMENT_ID") { result in
    switch result {
        case let .success(flow):
            // the requested flow
        case let .failure(error):
            // handle the error
    }
}
```
| パラメーター | 必須/任意 | 説明 |
|---------|--------|-----------|
| **placementId** | 必須 | [プレースメント](placements)の識別子。Adapty ダッシュボードでプレースメントを作成した際に指定した値です。 |
| **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` | <p>デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方式はユーザーが常に最新のデータを受け取れるため、こちらをお勧めします。</p><p></p><p>ただし、ユーザーのインターネット接続が不安定だと思われる場合は、`.returnCacheDataElseLoad` を使用すると、キャッシュが存在する場合にそれを返すことができます。この場合、ユーザーが最新データを取得できないことがありますが、接続状況に関わらず読み込みが速くなります。キャッシュはセッション中でも定期的に更新されるため、ネットワークリクエストを避ける目的でのキャッシュ使用は安全です。</p><p></p><p>なお、キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみ削除されます。</p> |
## アセットのカスタマイズ \{#customize-assets\}

ペイウォール/フローの画像や動画をカスタマイズするには、カスタムアセットを実装します。

ヒーロー画像と動画には事前定義済みのID（`hero_image`と`hero_video`）が割り当てられています。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズします。

その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定する](custom-media)必要があります。

たとえば、次のようなことができます。
- 一部のユーザーに別の画像や動画を表示する。
- リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。
- 動画を再生する前にプレビュー画像を表示する。
- 動画が読み込まれる前にプレイヤーがレイアウトスペースを確保できるよう、動画のピクセル解像度を指定する（アスペクト比 = `width / height`）。スキップするには `nil` を渡す。

カスタムアセットをシンプルな辞書で提供する方法の例を以下に示します:
```swift showLineNumbers
let customAssets: [String: AdaptyCustomAsset] = [
    // Show a local image using a custom ID
    "custom_image": .image(
        .uiImage(value: UIImage(named: "image_name")!)
    ),

    // Show a local preview image while a remote main image is loading
    "hero_image": .image(
        .remote(
            url: URL(string: "https://example.com/image.jpg")!,
            preview: UIImage(named: "preview_image")
        )
    ),

    // Show a local video with a preview image and a known resolution
    "hero_video": .video(
        .file(
            url: Bundle.main.url(forResource: "custom_video", withExtension: "mp4")!,
            preview: .uiImage(value: UIImage(named: "video_preview")!),
            resolution: CGSize(width: 1080, height: 1920)
        )
    ),
]

let flowConfig = try await AdaptyUI.getFlowConfiguration(
    forFlow: flow,
    assetsResolver: customAssets
)
```

:::note
アセットが見つからない場合、ペイウォール/フローはデフォルトの外観にフォールバックします。
:::
## 開発者定義タイマーの設定 \{#set-up-developer-defined-timers\}

モバイルアプリでカスタムタイマーを使用するには、`AdaptyTimerResolver` プロトコルに準拠したオブジェクトを作成します。このオブジェクトは、各カスタムタイマーのレンダリング方法を定義します。必要であれば、このプロトコルにすでに準拠している `[String: Date]` ディクショナリを直接使用することもできます。以下に例を示します：
```swift showLineNumbers
@MainActor
struct AdaptyTimerResolverImpl: AdaptyTimerResolver {
    func timerEndAtDate(for timerId: String) -> Date {
        switch timerId {
        case "CUSTOM_TIMER_6H":
            Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 hours
        case "CUSTOM_TIMER_NY":
            Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0)
        default:
            Date(timeIntervalSinceNow: 3600.0) // 1 hour
        }
    }
}
```

この例では、`CUSTOM_TIMER_NY` と `CUSTOM_TIMER_6H` は、Adapty ダッシュボードで設定した開発者定義タイマーの **Timer ID** です。`timerResolver` により、アプリは各タイマーを正しい値で動的に更新できます。例えば：

- `CUSTOM_TIMER_NY`: 元日など、タイマーの終了までの残り時間。
- `CUSTOM_TIMER_6H`: ユーザーがペイウォールを開いてから始まった6時間のうち、残りの時間。

---

> [!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 ダッシュボード](adapty-paywall-builder)のペイウォールビルダーで[ペイウォールのビジュアルデザインを作成](adapty-paywall-builder)したら、それをモバイルアプリに表示できます。最初のステップは、以下の説明に従ってプレースメントに関連付けられたペイウォールとそのビュー設定を取得することです。

このトピックはペイウォールビルダーでカスタマイズされたペイウォールに関するものです。ペイウォールを手動で実装する場合は、[リモートコンフィグペイウォール用のペイウォールとプロダクトの取得](fetch-paywalls-and-products)を参照してください。

:::tip
Adapty SDK をモバイルアプリに統合した実際の例を見たい方は、[サンプルアプリ](sample-apps)をご覧ください。ペイウォールの表示、購入処理、その他の基本的な機能を含む完全なセットアップを確認できます。

:::

<details>
<summary>モバイルアプリでペイウォールを表示する前に</summary>
1. Adapty ダッシュボードで[プロダクトを作成する](create-product)。
2. Adapty ダッシュボードで[ペイウォールを作成し、プロダクトを追加する](create-paywall)。
3. Adapty ダッシュボードで[プレースメントを作成し、ペイウォールを追加する](create-placement)。
4. モバイルアプリに [Adapty SDK](sdk-installation-ios) をインストールする。
</details>
## ペイウォールビルダーで作成したペイウォールを取得する \{#fetch-paywall-designed-with-paywall-builder\}

[ペイウォールビルダーを使ってペイウォールをデザインした](adapty-paywall-builder)場合、ユーザーに表示するためのレンダリングコードをアプリに書く必要はありません。このようなペイウォールには、表示する内容と表示方法の両方が含まれています。ただし、プレースメントを通じてペイウォールのIDを取得し、ビュー設定を取得してから、アプリ内に表示する必要があります。
最適なパフォーマンスを確保するために、ペイウォールとその[ビュー設定](get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder)をできるだけ早く取得し、ユーザーに表示する前に画像のダウンロードに十分な時間を確保することが重要です。

ペイウォールを取得するには、`getPaywall` メソッドを使用します：
<Tabs>
<TabItem value="swift" label="Swift">
```swift showLineNumbers
do {
    let paywall = try await Adapty.getPaywall("YOUR_PLACEMENT_ID")
    // the requested paywall
} catch {
    // handle the error
}
```
</TabItem>
<TabItem value="callback" label="Swift-Callback">

```swift showLineNumbers
Adapty.getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en") { result in
    switch result {
        case let .success(paywall):
            // the requested paywall
        case let .failure(error):
            // handle the error
    }
}
```
</TabItem>
</Tabs>

パラメーター:
| パラメータ | 必須/任意 | 説明 |
|---------|--------|-----------|
| **placementId** | 必須 | 取得したい[プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値を使用します。 |
| **locale** | <p>任意</p><p>デフォルト: `en`</p> | <p>[ペイウォールのローカライズ](add-paywall-locale-in-adapty-paywall-builder)の識別子です。このパラメータは、マイナス（**-**）で区切られた1つまたは2つのサブタグで構成された言語コードを指定します。最初のサブタグは言語、2番目のサブタグは地域を表します。</p><p></p><p>例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。</p><p>ロケールコードの詳細と推奨される使い方については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。</p> |
| **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` | <p>デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるようになるため、この設定を推奨します。</p><p></p><p>ただし、ユーザーの通信環境が不安定な場合は、`.returnCacheDataElseLoad` を使用してキャッシュが存在する場合はキャッシュデータを返すことを検討してください。この設定では最新データが取得できないことがありますが、通信が不安定な環境でも読み込みが速くなります。キャッシュはセッション中に定期的に更新されるため、ネットワークリクエストを減らす目的でキャッシュを利用しても問題ありません。</p><p></p><p>キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリアによってのみ削除されます。</p><p></p><p>Adapty SDK はペイウォールをローカルに2層で保存します。1つは上記の定期更新キャッシュ、もう1つは[フォールバックペイウォール](fallback-paywalls)です。また、ペイウォールをより速く取得するために CDN を使用し、CDN に接続できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、通信環境が悪い場合でも常にペイウォールの最新バージョンを確実に取得できるよう設計されています。</p> |
| **loadTimeout** | デフォルト: 5秒 | <p>このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュデータまたはローカルのフォールバックが返されます。</p><p>内部的に複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりもわずかに遅くタイムアウトすることがあります。</p> |
レスポンスパラメーター：

| パラメーター | 説明 |
| :-------- | :---------- |
| Paywall   | プロダクトIDのリスト、ペイウォール識別子、リモートコンフィグ、その他いくつかのプロパティを含む [`AdaptyPaywall`](https://swift.adapty.io/documentation/adapty/adaptypaywall) オブジェクト。 |
## ペイウォールビルダーで作成したペイウォールのビュー設定を取得する \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\}

:::important
ペイウォールビルダーで **Show on device** トグルを有効にしてください。このオプションがオンになっていない場合、ビュー設定を取得できません。
:::

ペイウォールを取得したら、ビュー設定が含まれているかどうかを確認してください。ビュー設定が存在する場合は、そのペイウォールがペイウォールビルダーで作成されたことを意味します。これにより、ペイウォールの表示方法が決まります。ビュー設定がある場合はペイウォールビルダーのペイウォールとして扱い、ない場合は[リモートコンフィグのペイウォールとして処理してください](present-remote-config-paywalls)。
`getPaywallConfiguration` メソッドを使って、ビュー設定を読み込みます。

```swift showLineNumbers

guard paywall.hasViewConfiguration else {
    //  use your custom logic
    return
}

do {
    let paywallConfiguration = try await AdaptyUI.getPaywallConfiguration(
            forPaywall: paywall,
            products: products
    )
    // use loaded configuration
} catch {
    // handle the error
}
```

パラメーター:
| パラメータ               | 必須/任意      | 説明 |
| :----------------------- | :------------- | :---------- |
| **paywall**              | 必須           | 対象のペイウォールのコントローラーを取得するための `AdaptyPaywall` オブジェクト。 |
| **loadTimeout**          | デフォルト: 5秒 | このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。内部で複数のリクエストが発生する場合があるため、まれに `loadTimeout` で指定した時間よりもわずかに遅れてタイムアウトすることがあります。 |
| **products**             | 任意           | 画面上でのプロダクト表示タイミングを最適化するために、`AdaptyPaywallProduct` オブジェクトの配列を指定します。`nil` を渡した場合、AdaptyUI が自動的に必要なプロダクトを取得します。 |
:::note
複数の言語を使用している場合は、[ペイウォールビルダーのローカライゼーションを追加する方法](add-paywall-locale-in-adapty-paywall-builder)と、ロケールコードを正しく使用する方法を[こちら](localizations-and-locale-codes)でご確認ください。
:::

読み込みが完了したら、[ペイウォールを表示](ios-present-paywalls)してください。
## デフォルトオーディエンス向けペイウォールを取得してより速く表示する \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\}

通常、ペイウォールはほぼ瞬時に取得されるため、速度を気にする必要はありません。ただし、オーディエンスやペイウォールの数が多く、ユーザーのインターネット接続が不安定な場合は、ペイウォールの取得に想定以上の時間がかかることがあります。そのような状況では、ペイウォールをまったく表示しないよりも、デフォルトのペイウォールを表示してスムーズなユーザー体験を提供することを検討するとよいでしょう。
この問題に対処するために、`getPaywallForDefaultAudience` メソッドを使用できます。このメソッドは、指定されたプレースメントの **All Users** オーディエンス向けペイウォールを取得します。ただし、推奨されるアプローチは `getPaywall` メソッドでペイウォールを取得することであり、詳細は上記の [ペイウォール情報の取得](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder) セクションをご覧ください。

:::warning
`getPaywall` を推奨する理由

`getPaywallForDefaultAudience` メソッドにはいくつかの重大な欠点があります：
- **後方互換性の問題**: 異なるアプリバージョン（現行バージョンと将来のバージョン）に対して異なるペイウォールを表示する必要がある場合、課題が生じる可能性があります。現行（レガシー）バージョンに対応したペイウォールを設計するか、現行（レガシー）バージョンのユーザーがレンダリングされないペイウォールに遭遇するリスクを許容するかのどちらかを選択しなければなりません。
- **ターゲティングの喪失**: すべてのユーザーが **All Users** オーディエンス向けに設計された同じペイウォールを見ることになるため、パーソナライズされたターゲティング（国、マーケティングアトリビューション、独自のカスタム属性に基づくものを含む）が失われます。
これらのデメリットを受け入れてでもペイウォールの取得を高速化したい場合は、以下のように `getPaywallForDefaultAudience` メソッドを使用してください。そうでない場合は、[上記](get-pb-paywalls#fetch-paywall-designed-with-paywall-builder)で説明した `getPaywall` を使用してください。
:::

```swift showLineNumbers
Adapty.getPaywallForDefaultAudience(placementId: "YOUR_PLACEMENT_ID", locale: "en") { result in
    switch result {
        case let .success(paywall):
            // the requested paywall
        case let .failure(error):
            // handle the error
    }
}
```
:::note
`getPaywallForDefaultAudience` メソッドは iOS SDK バージョン 2.11.2 以降で利用可能です。
:::
| パラメーター | 必須/任意 | 説明 |
|---------|--------|-----------|
| **placementId** | 必須 | [プレースメント](placements)の識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。 |
| **locale** | <p>任意</p><p>デフォルト: `en`</p> | <p>[ペイウォールのローカライズ](add-remote-config-locale)の識別子です。このパラメーターは、マイナス（**-**）文字で区切られた1つ以上のサブタグで構成される言語コードである必要があります。最初のサブタグは言語、2番目は地域を表します。</p><p></p><p>例: `en` は英語、`pt-br` はブラジルポルトガル語を表します。</p><p></p><p>ロケールコードおよび推奨される使用方法については、[ローカライズとロケールコード](localizations-and-locale-codes)を参照してください。</p> |
| **fetchPolicy** | デフォルト: `.reloadRevalidatingCacheData` | <p>デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。</p><p></p><p>ただし、ユーザーが不安定なインターネット環境にある場合は、`.returnCacheDataElseLoad` の使用を検討してください。キャッシュが存在する場合はキャッシュデータを返すため、最新データが得られない場合もありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを減らす目的で安全に利用できます。</p><p></p><p>キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみ削除されます。</p> |
## アセットのカスタマイズ \{#customize-assets\}

ペイウォールの画像や動画をカスタマイズするには、カスタムアセットを実装します。

ヒーロー画像と動画には、`hero_image` と `hero_video` という定義済みIDがあります。カスタムアセットバンドルでは、これらのIDを使って各要素を指定し、動作をカスタマイズできます。

その他の画像や動画については、Adapty ダッシュボードで[カスタムIDを設定](custom-media)する必要があります。

たとえば、次のようなことができます。

- 一部のユーザーに別の画像や動画を表示する。
- リモートのメイン画像の読み込み中に、ローカルのプレビュー画像を表示する。
- 動画を再生する前にプレビュー画像を表示する。
:::important
この機能を使用するには、Adapty iOS SDK をバージョン 3.7.0 以上にアップデートしてください。
:::

カスタムアセットをシンプルな辞書形式で提供する方法の例を示します：
```swift showLineNumbers
let customAssets: [String: AdaptyCustomAsset] = [
    // Show a local image using a custom ID
    "custom_image": .image(
        .uiImage(value: UIImage(named: "image_name")!)
    ),

    // Show a local preview image while a remote main image is loading
    "hero_image": .image(
        .remote(
            url: URL(string: "https://example.com/image.jpg")!,
            preview: UIImage(named: "preview_image")
        )
    ),

    // Show a local video with a preview image
    "hero_video": .video(
        .file(
            url: Bundle.main.url(forResource: "custom_video", withExtension: "mp4")!,
            preview: .uiImage(value: UIImage(named: "video_preview")!)
        )
    ),
]

let paywallConfig = try await AdaptyUI.getPaywallConfiguration(
    forPaywall: paywall,
    assetsResolver: customAssets
)
```

:::note
アセットが見つからない場合、ペイウォールはデフォルトの外観にフォールバックします。
:::
## デベロッパー定義タイマーの設定 \{#set-up-developer-defined-timers\}

モバイルアプリでカスタムタイマーを使用するには、`AdaptyTimerResolver` プロトコルに準拠したオブジェクトを作成します。このオブジェクトは、各カスタムタイマーのレンダリング方法を定義します。`[String: Date]` ディクショナリはすでにこのプロトコルに準拠しているため、直接使用することもできます。以下に例を示します。
```swift showLineNumbers
@MainActor
struct AdaptyTimerResolverImpl: AdaptyTimerResolver {
    func timerEndAtDate(for timerId: String) -> Date {
        switch timerId {
        case "CUSTOM_TIMER_6H":
            Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 hours
        case "CUSTOM_TIMER_NY":
            Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0)
        default:
            Date(timeIntervalSinceNow: 3600.0) // 1 hour
        }
    }
}
```

この例では、`CUSTOM_TIMER_NY` と `CUSTOM_TIMER_6H` は、Adapty ダッシュボードで設定した開発者定義タイマーの **Timer ID** です。`timerResolver` により、アプリは各タイマーを正しい値で動的に更新できます。例えば：

- `CUSTOM_TIMER_NY`: 元日など、タイマー終了までの残り時間。
- `CUSTOM_TIMER_6H`: ユーザーがペイウォールを開いてから始まった6時間のうち、残り時間。

---