> ## Documentation Index
> Fetch the complete documentation index at: https://docs.adrop.io/llms.txt
> Use this file to discover all available pages before exploring further.

# インタースティシャル広告

> iOSアプリでインタースティシャル広告を実装する方法を案内します。

## 概要

インタースティシャル広告は、アプリの画面全体を覆う形で表示される広告です。ゲームのレベル移行、コンテンツページの切り替えなど、アプリの自然な遷移ポイントで表示するのに適しています。

### 特徴

* 全画面を覆う没入型広告
* ユーザーが明示的に閉じるまで維持
* 画像および動画広告に対応
* 高い視覚的注目度

<Note>
  開発環境ではテストユニットIDを使用してください: `PUBLIC_TEST_UNIT_ID_INTERSTITIAL`
</Note>

***

## 実装手順

インタースティシャル広告は次の4ステップで実装します:

1. **初期化** - AdropInterstitialAdインスタンスの生成
2. **デリゲートの設定** - 広告イベント受信のためのデリゲート設定
3. **広告の読み込み** - 広告リクエストと受信
4. **広告の表示** - 画面への広告表示

***

## UIKit実装

### 基本実装

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  class ViewController: UIViewController {
      private var interstitialAd: AdropInterstitialAd?

      override func viewDidLoad() {
          super.viewDidLoad()
          loadInterstitialAd()
      }

      // 1. 広告の初期化と読み込み
      private func loadInterstitialAd() {
          interstitialAd = AdropInterstitialAd(unitId: "YOUR_UNIT_ID")
          interstitialAd?.delegate = self
          interstitialAd?.load()
      }

      // 2. 広告の表示
      private func showInterstitialAd() {
          guard let interstitialAd = interstitialAd,
                interstitialAd.isLoaded else { return }
          interstitialAd.show(fromRootViewController: self)
      }
  }
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  @interface ViewController () <AdropInterstitialAdDelegate>
  @property (nonatomic, strong) AdropInterstitialAd *interstitialAd;
  @end

  @implementation ViewController

  - (void)viewDidLoad {
      [super viewDidLoad];
      [self loadInterstitialAd];
  }

  // 1. 広告の初期化と読み込み
  - (void)loadInterstitialAd {
      self.interstitialAd = [[AdropInterstitialAd alloc] initWithUnitId:@"YOUR_UNIT_ID"];
      self.interstitialAd.delegate = self;
      [self.interstitialAd load];
  }

  // 2. 広告の表示
  - (void)showInterstitialAd {
      if (self.interstitialAd && self.interstitialAd.isLoaded) {
          [self.interstitialAd showFromRootViewController:self];
      }
  }

  @end
  ```
</CodeGroup>

### isLoadedプロパティ

広告が読み込まれたかを確認するプロパティです。`show()`呼び出し前にこの値を確認することをお勧めします。

<CodeGroup>
  ```swift Swift theme={null}
  if interstitialAd?.isLoaded == true {
      interstitialAd?.show(fromRootViewController: self)
  }
  ```

  ```objc Objective-C theme={null}
  if (self.interstitialAd.isLoaded) {
      [self.interstitialAd showFromRootViewController:self];
  }
  ```
</CodeGroup>

### デリゲートの実装

<CodeGroup>
  ```swift Swift theme={null}
  extension ViewController: AdropInterstitialAdDelegate {
      // 広告受信成功 (必須)
      func onAdReceived(_ ad: AdropInterstitialAd) {
          print("インタースティシャル広告受信完了")
          // 広告が準備できたら表示
          showInterstitialAd()
      }

      // 広告受信失敗 (必須)
      func onAdFailedToReceive(_ ad: AdropInterstitialAd, _ errorCode: AdropErrorCode) {
          print("インタースティシャル広告受信失敗: \(errorCode)")
      }

      // 広告表示 (オプション)
      func onAdImpression(_ ad: AdropInterstitialAd) {
          print("インタースティシャル広告表示")
      }

      // 広告クリック (オプション)
      func onAdClicked(_ ad: AdropInterstitialAd) {
          print("インタースティシャル広告クリック")
      }

      // インタースティシャル広告が表示される直前 (オプション)
      func onAdWillPresentFullScreen(_ ad: AdropInterstitialAd) {
          print("インタースティシャル広告表示直前")
      }

      // インタースティシャル広告が表示された直後 (オプション)
      func onAdDidPresentFullScreen(_ ad: AdropInterstitialAd) {
          print("インタースティシャル広告表示完了")
      }

      // インタースティシャル広告が閉じる直前 (オプション)
      func onAdWillDismissFullScreen(_ ad: AdropInterstitialAd) {
          print("インタースティシャル広告閉じる直前")
      }

      // インタースティシャル広告が閉じた直後 (オプション)
      func onAdDidDismissFullScreen(_ ad: AdropInterstitialAd) {
          print("インタースティシャル広告閉じた")
          // 次の広告を事前読み込み
          loadInterstitialAd()
      }

      // インタースティシャル広告表示失敗 (オプション)
      func onAdFailedToShowFullScreen(_ ad: AdropInterstitialAd, _ errorCode: AdropErrorCode) {
          print("インタースティシャル広告表示失敗: \(errorCode)")
      }
  }
  ```

  ```objc Objective-C theme={null}
  #pragma mark - AdropInterstitialAdDelegate

  // 広告受信成功 (必須)
  - (void)onAdReceived:(AdropInterstitialAd *)ad {
      NSLog(@"インタースティシャル広告受信完了");
      // 広告が準備できたら表示
      [self showInterstitialAd];
  }

  // 広告受信失敗 (必須)
  - (void)onAdFailedToReceive:(AdropInterstitialAd *)ad :(AdropErrorCode)errorCode {
      NSLog(@"インタースティシャル広告受信失敗: %ld", (long)errorCode);
  }

  // 広告表示 (オプション)
  - (void)onAdImpression:(AdropInterstitialAd *)ad {
      NSLog(@"インタースティシャル広告表示");
  }

  // 広告クリック (オプション)
  - (void)onAdClicked:(AdropInterstitialAd *)ad {
      NSLog(@"インタースティシャル広告クリック");
  }

  // インタースティシャル広告が表示される直前 (オプション)
  - (void)onAdWillPresentFullScreen:(AdropInterstitialAd *)ad {
      NSLog(@"インタースティシャル広告表示直前");
  }

  // インタースティシャル広告が表示された直後 (オプション)
  - (void)onAdDidPresentFullScreen:(AdropInterstitialAd *)ad {
      NSLog(@"インタースティシャル広告表示完了");
  }

  // インタースティシャル広告が閉じる直前 (オプション)
  - (void)onAdWillDismissFullScreen:(AdropInterstitialAd *)ad {
      NSLog(@"インタースティシャル広告閉じる直前");
  }

  // インタースティシャル広告が閉じた直後 (オプション)
  - (void)onAdDidDismissFullScreen:(AdropInterstitialAd *)ad {
      NSLog(@"インタースティシャル広告閉じた");
      // 次の広告を事前読み込み
      [self loadInterstitialAd];
  }

  // インタースティシャル広告表示失敗 (オプション)
  - (void)onAdFailedToShowFullScreen:(AdropInterstitialAd *)ad :(AdropErrorCode)errorCode {
      NSLog(@"インタースティシャル広告表示失敗: %ld", (long)errorCode);
  }
  ```
</CodeGroup>

***

## SwiftUI実装

SwiftUIでは`UIViewControllerRepresentable`を使用するか、UIWindowからrootViewControllerを取得して表示できます。

### 方法1: ViewModelパターン

```swift theme={null}
import SwiftUI
import AdropAds

// ViewModel
class InterstitialAdViewModel: NSObject, ObservableObject {
    @Published var isAdReady = false
    @Published var isAdShowing = false

    private var interstitialAd: AdropInterstitialAd?

    init() {
        loadAd()
    }

    func loadAd() {
        interstitialAd = AdropInterstitialAd(unitId: "YOUR_UNIT_ID")
        interstitialAd?.delegate = self
        interstitialAd?.load()
    }

    func showAd() {
        guard let interstitialAd = interstitialAd,
              let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
              let rootViewController = windowScene.windows.first?.rootViewController else {
            return
        }

        interstitialAd.show(fromRootViewController: rootViewController)
    }
}

// Delegate
extension InterstitialAdViewModel: AdropInterstitialAdDelegate {
    func onAdReceived(_ ad: AdropInterstitialAd) {
        DispatchQueue.main.async {
            self.isAdReady = true
        }
    }

    func onAdFailedToReceive(_ ad: AdropInterstitialAd, _ errorCode: AdropErrorCode) {
        print("広告受信失敗: \(errorCode)")
    }

    func onAdDidPresentFullScreen(_ ad: AdropInterstitialAd) {
        DispatchQueue.main.async {
            self.isAdShowing = true
        }
    }

    func onAdDidDismissFullScreen(_ ad: AdropInterstitialAd) {
        DispatchQueue.main.async {
            self.isAdShowing = false
            self.isAdReady = false
        }
        // 次の広告を事前読み込み
        loadAd()
    }
}

// View
struct ContentView: View {
    @StateObject private var adViewModel = InterstitialAdViewModel()

    var body: some View {
        VStack {
            Text("インタースティシャル広告サンプル")
                .font(.title)

            Button("インタースティシャル広告を表示") {
                adViewModel.showAd()
            }
            .disabled(!adViewModel.isAdReady)
            .padding()
        }
    }
}
```

***

## デリゲートメソッド

### 必須メソッド

<ParamField body="onAdReceived" type="(AdropInterstitialAd) -> Void">
  広告受信成功時に呼び出されます。この時点で`show()`を呼び出して広告を表示できます。
</ParamField>

<ParamField body="onAdFailedToReceive" type="(AdropInterstitialAd, AdropErrorCode) -> Void">
  広告受信失敗時に呼び出されます。エラーコードを通じて失敗原因を確認できます。
</ParamField>

### オプションメソッド

<ParamField body="onAdImpression" type="(AdropInterstitialAd) -> Void">
  広告インプレッションが記録されたときに呼び出されます。
</ParamField>

<ParamField body="onAdClicked" type="(AdropInterstitialAd) -> Void">
  ユーザーが広告をクリックしたときに呼び出されます。
</ParamField>

<ParamField body="onAdWillPresentFullScreen" type="(AdropInterstitialAd) -> Void">
  インタースティシャル広告が表示される直前に呼び出されます。アニメーションの一時停止などの作業を実行できます。
</ParamField>

<ParamField body="onAdDidPresentFullScreen" type="(AdropInterstitialAd) -> Void">
  インタースティシャル広告が画面に表示された直後に呼び出されます。
</ParamField>

<ParamField body="onAdWillDismissFullScreen" type="(AdropInterstitialAd) -> Void">
  インタースティシャル広告が閉じる直前に呼び出されます。
</ParamField>

<ParamField body="onAdDidDismissFullScreen" type="(AdropInterstitialAd) -> Void">
  インタースティシャル広告が閉じた直後に呼び出されます。次の広告を事前読み込みするのに適したタイミングです。
</ParamField>

<ParamField body="onAdFailedToShowFullScreen" type="(AdropInterstitialAd, AdropErrorCode) -> Void">
  広告表示失敗時に呼び出されます。エラーコードを通じて失敗原因を確認できます。
</ParamField>

***

## クロージャコールバック

デリゲートの代わりにクロージャベースのコールバックを使用できます。

```swift theme={null}
let interstitialAd = AdropInterstitialAd(unitId: "YOUR_UNIT_ID")

// 必須
interstitialAd.onAdReceived = { ad in
    print("広告受信成功")
}
interstitialAd.onAdFailedToReceive = { ad, errorCode in
    print("広告受信失敗: \(errorCode)")
}

// オプション
interstitialAd.onAdImpression = { ad in print("広告表示") }
interstitialAd.onAdClicked = { ad in print("広告クリック") }
interstitialAd.onAdWillPresentFullScreen = { ad in print("広告表示直前") }
interstitialAd.onAdDidPresentFullScreen = { ad in print("広告表示完了") }
interstitialAd.onAdWillDismissFullScreen = { ad in print("広告閉じる直前") }
interstitialAd.onAdDidDismissFullScreen = { ad in print("広告閉じた") }
interstitialAd.onAdFailedToShowFullScreen = { ad, errorCode in print("広告表示失敗: \(errorCode)") }
```

<Note>
  デリゲートとクロージャの両方を設定すると、両方が呼び出されます。
</Note>

***

## ベストプラクティス

### 1. 広告の事前読み込み

広告を表示する前に事前に読み込んでユーザー体験を向上させてください。

```swift theme={null}
class GameViewController: UIViewController {
    private var interstitialAd: AdropInterstitialAd?
    private var isAdReady = false

    override func viewDidLoad() {
        super.viewDidLoad()
        // 画面進入時に事前読み込み
        preloadInterstitialAd()
    }

    private func preloadInterstitialAd() {
        interstitialAd = AdropInterstitialAd(unitId: "YOUR_UNIT_ID")
        interstitialAd?.delegate = self
        interstitialAd?.load()
    }

    func onGameLevelComplete() {
        // レベル完了時にすぐに表示
        if isAdReady {
            interstitialAd?.show(fromRootViewController: self)
        }
    }
}

extension GameViewController: AdropInterstitialAdDelegate {
    func onAdReceived(_ ad: AdropInterstitialAd) {
        isAdReady = true
    }

    func onAdFailedToReceive(_ ad: AdropInterstitialAd, _ errorCode: AdropErrorCode) {
        print("広告読み込み失敗: \(errorCode)")
    }

    func onAdDidDismissFullScreen(_ ad: AdropInterstitialAd) {
        isAdReady = false
        // 次の広告を事前読み込み
        preloadInterstitialAd()
    }
}
```

### 2. 適切な表示タイミング

アプリの自然な遷移ポイントで広告を表示してください。

```swift theme={null}
// ✅ 良い例: ゲームレベルの移行
func onLevelComplete() {
    saveProgress()
    showInterstitialAd()
    loadNextLevel()
}

// ✅ 良い例: コンテンツ閲覧完了
func onArticleFinished() {
    showInterstitialAd()
}

// ❌ 悪い例: ユーザーアクション中
func onButtonTap() {
    showInterstitialAd() // ユーザー体験の阻害
    performAction()
}
```

### 3. 閉じた後の再読み込み

広告が閉じた後、次の広告を事前読み込みしてください。

```swift theme={null}
func onAdDidDismissFullScreen(_ ad: AdropInterstitialAd) {
    // すぐに次の広告を読み込み
    loadInterstitialAd()
}
```

### 4. エラー処理

広告読み込み失敗に備えた処理を実装してください。

```swift theme={null}
func onAdFailedToReceive(_ ad: AdropInterstitialAd, _ errorCode: AdropErrorCode) {
    switch errorCode {
    case .ERROR_CODE_NETWORK:
        print("ネットワークエラー: 後で再試行")
        retryAfterDelay()
    case .ERROR_CODE_AD_NO_FILL:
        print("表示する広告がありません")
        continueWithoutAd()
    default:
        print("広告読み込み失敗: \(errorCode)")
    }
}

private func retryAfterDelay() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 30) {
        self.loadInterstitialAd()
    }
}
```

### 5. 表示頻度の制限

広告の表示頻度を制限して、ユーザー体験を損なわないようにしてください。

```swift theme={null}
class AdFrequencyManager {
    private var lastAdShownTime: Date?
    private let minimumInterval: TimeInterval = 180 // 3分

    func canShowAd() -> Bool {
        guard let lastTime = lastAdShownTime else {
            return true
        }

        return Date().timeIntervalSince(lastTime) >= minimumInterval
    }

    func recordAdShown() {
        lastAdShownTime = Date()
    }
}

// 使用例
let frequencyManager = AdFrequencyManager()

func showInterstitialIfAllowed() {
    guard frequencyManager.canShowAd() else {
        print("広告表示の間隔が短すぎます")
        return
    }

    interstitialAd?.show(fromRootViewController: self)
}

func onAdDidPresentFullScreen(_ ad: AdropInterstitialAd) {
    frequencyManager.recordAdShown()
}
```

***

## 次のステップ

<CardGroup cols={2}>
  <Card title="リワード広告" href="/ja/sdk/ios/rewarded">
    リワード広告でユーザーエンゲージメントの向上
  </Card>

  <Card title="バナー広告" href="/ja/sdk/ios/banner">
    バナー広告の実装
  </Card>

  <Card title="ターゲティング設定" href="/ja/sdk/ios/targeting">
    ユーザー属性とコンテキストターゲティング
  </Card>

  <Card title="リファレンス" href="/ja/sdk/ios/reference">
    APIリファレンスドキュメント
  </Card>
</CardGroup>
