> ## 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でネイティブ広告を実装する方法を案内します。

## 概要

ネイティブ広告は、アプリのUIに自然に統合される広告フォーマットです。広告要素(タイトル、画像、説明など)をアプリデザインに合わせて自由にカスタマイズできます。

### 主な特徴

* アプリUIと完璧に統合可能なカスタムデザイン
* 広告要素への個別アクセスと配置
* 広告主プロフィール情報の表示オプション
* 追加カスタムフィールドのサポート

***

## 実装方法

ネイティブ広告の実装は次の手順で進めます:

1. 広告の読み込み
2. カスタムビューの作成
3. ビューのバインディング
4. デリゲートの処理

***

## 1. 広告の読み込み

`AdropNativeAd`インスタンスを生成して広告を読み込みます。

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

  class MyViewController: UIViewController {
      private var nativeAd: AdropNativeAd?

      override func viewDidLoad() {
          super.viewDidLoad()

          // ネイティブ広告の生成
          nativeAd = AdropNativeAd(unitId: "YOUR_NATIVE_UNIT_ID")
          nativeAd?.delegate = self

          // 広告の読み込み
          nativeAd?.load()
      }
  }
  ```

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

  @interface MyViewController () <AdropNativeAdDelegate>
  @property (nonatomic, strong) AdropNativeAd *nativeAd;
  @end

  @implementation MyViewController

  - (void)viewDidLoad {
      [super viewDidLoad];

      // ネイティブ広告の生成
      self.nativeAd = [[AdropNativeAd alloc] initWithUnitId:@"YOUR_NATIVE_UNIT_ID"];
      self.nativeAd.delegate = self;

      // 広告の読み込み
      [self.nativeAd load];
  }

  @end
  ```
</CodeGroup>

### Context IDの設定

[コンテキストターゲティング](/ja/sdk/ios/targeting#コンテキストターゲティング)のためにContext IDを設定できます。

<CodeGroup>
  ```swift Swift theme={null}
  // contextIdは読み取り専用 — イニシャライザで設定
  let nativeAd = AdropNativeAd(unitId: "YOUR_UNIT_ID", contextId: "article_123")
  ```

  ```objc Objective-C theme={null}
  // contextIdは読み取り専用 — イニシャライザで設定
  AdropNativeAd *nativeAd = [[AdropNativeAd alloc] initWithUnitId:@"YOUR_UNIT_ID" contextId:@"article_123"];
  ```
</CodeGroup>

<Note>
  開発中はテストユニットIDを使用してください。[テストユニットID](#テストユニットid)セクションを参照してください。
</Note>

***

## 2. カスタムビューの作成

ストーリーボードまたはコードでネイティブ広告ビューを構成します。

### UIKit (Storyboard/XIB)

ストーリーボードで`AdropNativeAdView`を生成し、広告要素をIBOutletとして接続します。

```swift theme={null}
import AdropAds

class NativeAdViewCell: UITableViewCell {
    @IBOutlet weak var nativeAdView: AdropNativeAdView!
    @IBOutlet weak var iconImageView: UIImageView!
    @IBOutlet weak var headlineLabel: UILabel!
    @IBOutlet weak var bodyLabel: UILabel!
    @IBOutlet weak var mediaView: UIView!
    @IBOutlet weak var callToActionButton: UIButton!

    // 広告主プロフィール (オプション)
    @IBOutlet weak var advertiserLogoImageView: UIImageView!
    @IBOutlet weak var advertiserNameLabel: UILabel!

    func configure(with ad: AdropNativeAd) {
        // ビューのバインディング (次のセクション参照)
    }
}
```

### UIKit (コード)

```swift theme={null}
import AdropAds

class NativeAdView: UIView {
    let nativeAdView = AdropNativeAdView()
    let iconImageView = UIImageView()
    let headlineLabel = UILabel()
    let bodyLabel = UILabel()
    let mediaView = UIView()
    let callToActionButton = UIButton()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupViews()
    }

    private func setupViews() {
        addSubview(nativeAdView)
        nativeAdView.addSubview(iconImageView)
        nativeAdView.addSubview(headlineLabel)
        nativeAdView.addSubview(bodyLabel)
        nativeAdView.addSubview(mediaView)
        nativeAdView.addSubview(callToActionButton)

        // Auto Layoutの設定
        // ...
    }
}
```

***

## 3. ビューのバインディング

`AdropNativeAdView`に広告要素をバインディングして広告データを表示します。

```swift theme={null}
func configure(with ad: AdropNativeAd) {
    // 各要素をAdropNativeAdViewにバインディング
    nativeAdView.setIconView(iconImageView)
    nativeAdView.setHeadLineView(headlineLabel)
    nativeAdView.setBodyView(bodyLabel)
    nativeAdView.setMediaView(mediaView)
    nativeAdView.setCallToActionView(callToActionButton)

    // 広告主プロフィール (オプション)
    if let advertiserLogoView = advertiserLogoImageView,
       let advertiserNameView = advertiserNameLabel {
        nativeAdView.setProfileLogoView(advertiserLogoView)
        nativeAdView.setProfileNameView(advertiserNameView)
    }

    // 広告データの設定 (自動的にバインドされたビューに表示)
    nativeAdView.setNativeAd(ad)
}
```

### バインディングメソッド

| メソッド                              | 説明                                                                                                                                                    | 必須    |
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----- |
| `setIconView(_:onClick:)`         | アイコン画像ビューの設定. `onClick: ((AdropNativeAd?, UIView) -> Void)? = nil`                                                                                    | オプション |
| `setHeadLineView(_:onClick:)`     | タイトルラベルの設定. `onClick: ((AdropNativeAd?, UIView) -> Void)? = nil`                                                                                      | オプション |
| `setBodyView(_:)`                 | 説明ラベルの設定                                                                                                                                              | オプション |
| `setMediaView(_:)`                | メイン画像/動画ビューの設定。**動画クリエイティブには必須** — VTRと`onAdVideoStart` / `onAdVideoEnd`コールバックは、SDKメディアコンテナがこのメソッドでバインドされた場合にのみ発生します。[動画トラッキングとVTR](#動画トラッキングとvtr)参照。 | オプション |
| `setCallToActionView(_:onClick:)` | CTAボタンの設定. `onClick: ((AdropNativeAd?, UIView) -> Void)? = nil`                                                                                       | オプション |
| `setAdvertiserView(_:onClick:)`   | 広告主ビューの設定. `onClick: ((AdropNativeAd?, UIView) -> Void)? = nil`                                                                                       | オプション |
| `setProfileLogoView(_:onClick:)`  | 広告主ロゴ画像ビューの設定. `onClick: ((AdropNativeAd?, UIView) -> Void)? = nil`                                                                                   | オプション |
| `setProfileNameView(_:onClick:)`  | 広告主名ラベルの設定. `onClick: ((AdropNativeAd?, UIView) -> Void)? = nil`                                                                                      | オプション |
| `setNativeAd(_:)`                 | 広告データの設定                                                                                                                                              | 必須    |

<Note>
  `onClick`クロージャは、ユーザーがバインドされたビューをタップしたときに呼び出されます。現在の`AdropNativeAd?`インスタンスとタップされた`UIView`をパラメータとして受け取ります。指定しない場合、デフォルトのクリック動作（リンク先URLを開く）が使用されます。
</Note>

<Note>
  広告主プロフィールを表示するには、Adropコンソールで該当広告ユニットの<strong>広告主プロフィール表示</strong>を有効にする必要があります。
</Note>

***

## 4. デリゲートの処理

`AdropNativeAdDelegate`を実装して広告イベントを処理します。

<CodeGroup>
  ```swift Swift theme={null}
  extension MyViewController: AdropNativeAdDelegate {
      // 広告受信成功
      func onAdReceived(_ nativeAd: AdropNativeAd) {
          print("ネイティブ広告受信成功")

          // 広告データにアクセス
          print("タイトル: \(nativeAd.headline)")
          print("説明: \(nativeAd.body)")
          print("CTA: \(nativeAd.callToAction)")

          // ビューに広告をバインディング
          configureNativeAdView(with: nativeAd)
      }

      // 広告受信失敗
      func onAdFailedToReceive(_ nativeAd: AdropNativeAd, _ errorCode: AdropErrorCode) {
          print("ネイティブ広告受信失敗: \(errorCode)")
      }

      // 広告クリック (オプション)
      func onAdClicked(_ nativeAd: AdropNativeAd) {
          print("ネイティブ広告クリック")
      }

      // 広告表示 (オプション)
      func onAdImpression(_ nativeAd: AdropNativeAd) {
          print("ネイティブ広告表示")
      }
  }
  ```

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

  // 広告受信成功
  - (void)onAdReceived:(AdropNativeAd *)nativeAd {
      NSLog(@"ネイティブ広告受信成功");

      // 広告データにアクセス
      if (nativeAd.headline) {
          NSLog(@"タイトル: %@", nativeAd.headline);
      }

      if (nativeAd.body) {
          NSLog(@"説明: %@", nativeAd.body);
      }

      if (nativeAd.callToAction) {
          NSLog(@"CTA: %@", nativeAd.callToAction);
      }

      // ビューに広告をバインディング
      [self configureNativeAdViewWith:nativeAd];
  }

  // 広告受信失敗
  - (void)onAdFailedToReceive:(AdropNativeAd *)nativeAd :(AdropErrorCode)errorCode {
      NSLog(@"ネイティブ広告受信失敗: %ld", (long)errorCode);
  }

  // 広告クリック (オプション)
  - (void)onAdClicked:(AdropNativeAd *)nativeAd {
      NSLog(@"ネイティブ広告クリック");
  }

  // 広告表示 (オプション)
  - (void)onAdImpression:(AdropNativeAd *)nativeAd {
      NSLog(@"ネイティブ広告表示");
  }
  ```
</CodeGroup>

### デリゲートメソッド

| メソッド                        | 必須    | 説明                      |
| --------------------------- | ----- | ----------------------- |
| `onAdReceived(_:)`          | 必須    | 広告読み込み成功時に呼び出される        |
| `onAdFailedToReceive(_:_:)` | 必須    | 広告読み込み失敗時に呼び出される        |
| `onAdClicked(_:)`           | オプション | ユーザーが広告をクリックしたときに呼び出される |
| `onAdImpression(_:)`        | オプション | 広告が表示されたときに呼び出される       |
| `onAdVideoStart(_:)`        | オプション | 動画広告の再生が開始されたときに呼び出される  |
| `onAdVideoEnd(_:)`          | オプション | 動画広告の再生が完了したときに呼び出される   |

***

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

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

```swift theme={null}
let nativeAd = AdropNativeAd(unitId: "YOUR_UNIT_ID")

nativeAd.onAdReceived = { ad in
    print("ネイティブ広告受信成功")
}

nativeAd.onAdFailedToReceive = { ad, errorCode in
    print("ネイティブ広告受信失敗: \(errorCode)")
}

nativeAd.onAdImpression = { ad in
    print("ネイティブ広告表示")
}

nativeAd.onAdClicked = { ad in
    print("ネイティブ広告クリック")
}

nativeAd.onAdVideoStart = { ad in
    print("ネイティブ広告動画再生開始")
}

nativeAd.onAdVideoEnd = { ad in
    print("ネイティブ広告動画再生完了")
}
```

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

***

## 広告プロパティ

`AdropNativeAd`オブジェクトを通じて広告データにアクセスできます。

### 基本プロパティ

```swift theme={null}
// 広告受信成功時
func onAdReceived(_ nativeAd: AdropNativeAd) {
    // タイトル
    print("タイトル: \(nativeAd.headline)")

    // 説明
    print("説明: \(nativeAd.body)")

    // CTAボタンテキスト
    print("CTA: \(nativeAd.callToAction)")

    // メイン画像/動画
    print("メディアURL: \(nativeAd.asset)")
}
```

### 広告主プロフィール

```swift theme={null}
// 広告主情報（profileおよびそのプロパティはnon-optional）
let profile = nativeAd.profile
print("広告主ロゴ: \(profile.displayLogo)")
print("広告主名: \(profile.displayName)")

// プロフィールリンク（オプション — 広告主ページへのリンク）
if let link = profile.link {
    print("プロフィールリンク: \(link)")
}
```

### カスタムフィールド

Adropコンソールで設定した追加テキスト項目にアクセスできます。

```swift theme={null}
// 追加テキスト項目（extraはnon-optional [String: String]）
let extra = nativeAd.extra
if !extra.isEmpty {
    // 例: 価格情報
    if let price = extra["price"] {
        print("価格: \(price)")
    }

    // 例: 割引率
    if let discount = extra["discount"] {
        print("割引率: \(discount)")
    }

    // 例: 評価
    if let rating = extra["rating"] {
        print("評価: \(rating)")
    }
}
```

<Note>
  `extra`フィールドは、Adropコンソールの広告ユニット設定で定義した追加テキスト項目IDをキーとして使用します。
</Note>

### プロパティ一覧

| プロパティ            | 型                      | 説明               |
| ---------------- | ---------------------- | ---------------- |
| `unitId`         | `String`               | 広告ユニットID         |
| `contextId`      | `String`               | コンテキストターゲティングID  |
| `headline`       | `String`               | 広告タイトル           |
| `body`           | `String`               | 広告説明             |
| `callToAction`   | `String`               | CTAボタンテキスト       |
| `icon`           | `String`               | アイコン画像URL        |
| `cover`          | `String`               | カバー画像URL         |
| `asset`          | `String`               | メイン画像/動画URL      |
| `creative`       | `String`               | クリエイティブHTMLコンテンツ |
| `creativeSize`   | `CGSize`               | クリエイティブコンテンツサイズ  |
| `advertiser`     | `String`               | 広告主名             |
| `advertiserURL`  | `String`               | 広告主URL           |
| `profile`        | `AdropNativeAdProfile` | 広告主プロフィール情報      |
| `extra`          | `[String: String]`     | 追加カスタムフィールド      |
| `accountTag`     | `[String: Any]`        | アカウントレベルのタグデータ   |
| `creativeTag`    | `[String: Any]`        | クリエイティブレベルのタグデータ |
| `destinationURL` | `String?`              | 広告遷移先URL         |
| `txId`           | `String`               | トランザクションID       |
| `campaignId`     | `String`               | キャンペーンID         |
| `creativeId`     | `String`               | クリエイティブID        |
| `browserTarget`  | `BrowserTarget?`       | 広告クリック時のURL開き方   |
| `isLoaded`       | `Bool`                 | 広告が読み込まれたかどうか    |
| `isBackfilled`   | `Bool`                 | バックフィル広告かどうか     |

### AdropNativeAdProfile

| プロパティ         | 型         | 説明          |
| ------------- | --------- | ----------- |
| `displayLogo` | `String`  | 広告主ロゴ画像URL  |
| `displayName` | `String`  | 広告主表示名      |
| `link`        | `String?` | 広告主ページへのリンク |

***

## カスタムクリック

カスタムクリックを使用すると、デフォルトの動作（リンク先URLを開く）の代わりに、広告クリック動作を自分で処理できます。

### 設定

<CodeGroup>
  ```swift Swift theme={null}
  let nativeAd = AdropNativeAd(unitId: "YOUR_UNIT_ID")
  nativeAd.useCustomClick = true
  ```

  ```objc Objective-C theme={null}
  AdropNativeAd *nativeAd = [[AdropNativeAd alloc] initWithUnitId:@"YOUR_UNIT_ID"];
  nativeAd.useCustomClick = YES;
  ```
</CodeGroup>

### 全体クリック領域

`setIsEntireClick(_:)`を使用して、`AdropNativeAdView`全体をクリック可能にします。

```swift theme={null}
nativeAdView.setIsEntireClick(true)
```

<Note>
  `useCustomClick`が`true`の場合、`setNativeAd(_:)`で`setIsEntireClick(true)`が自動的に呼び出されます。
</Note>

### 手動クリック

`performClick()`を使用して手動でクリックイベントをトリガーします。

```swift theme={null}
nativeAdView.performClick()
```

### URLを開く

`open(_:useInAppBrowser:)`を使用してプログラムでURLを開きます。

```swift theme={null}
// リンク先URLを開く
nativeAd.open(nativeAd.destinationURL)

// アプリ内ブラウザで開く
nativeAd.open(nativeAd.destinationURL, useInAppBrowser: true)
```

***

## 動画トラッキングとVTR

Adropはネイティブ広告の動画指標 — VTR（動画完了率）、`onAdVideoStart`、`onAdVideoEnd` — を、SDKメディアコンテナ（`AdropNativeAdView.setMediaView(_:)`でバインドされた`UIView`）内で動画がレンダリングされる場合にのみ収集します。

`AdropNativeAd.asset`プロパティは元の画像または動画ファイルのURLを返します。これはサムネイル表示や媒体社独自分析などの**補助メタデータ**として公開されており、再生を直接行うためのものではありません。

<Warning>
  動画ネイティブ広告の`asset` URLを独自の動画プレイヤー（`AVPlayer`、`AVPlayerViewController`またはサードパーティプレイヤー）に直接渡さないでください。SDKメディアコンテナを経由しないと以下の現象が発生します。

  * 該当面で**VTR（動画完了率）が収集されません。**
  * `onAdVideoStart` / `onAdVideoEnd`コールバックが**呼び出されません。**
  * 該当ユニットの動画パフォーマンス集計が欠落または0として報告されます。

  クリック（`onAdClicked`）とインプレッション（`onAdImpression`）トラッキングはコンテナビューに接続されているため引き続き動作しますが、動画関連シグナルは失われます。
</Warning>

### 推奨パターン

動画ネイティブ広告には必ずSDKメディアコンテナをバインドしてください。

<CodeGroup>
  ```swift Swift theme={null}
  nativeAdView.setMediaView(mediaView)    // 動画トラッキングのため必須
  nativeAdView.setNativeAd(ad)
  ```

  ```objc Objective-C theme={null}
  [self.nativeAdView setMediaView:self.mediaView];    // 動画トラッキングのため必須
  [self.nativeAdView setNativeAd:ad];
  ```
</CodeGroup>

<Note>
  特定の面がどうしても独自プレイヤーを使う必要があり、VTRが計測されないことを許容する場合、広告を`AdropNativeAdView`にバインドしたままにすることで、クリックとインプレッションのアトリビューションは引き続き確保できます。ただしその面を社内レポートで**非VTRインベントリ**として分類し、SDKが計測した動画パフォーマンスと混在させないでください。
</Note>

***

## ベストプラクティス

### エラー処理

広告読み込み失敗時に代替UIを表示してユーザー体験を維持してください。

```swift theme={null}
func onAdFailedToReceive(_ nativeAd: AdropNativeAd, _ errorCode: AdropErrorCode) {
    print("ネイティブ広告受信失敗: \(errorCode)")

    // 広告領域を非表示
    nativeAdContainerView.isHidden = true

    // または代替コンテンツを表示
    showFallbackContent()
}
```

***

## テストユニットID

開発およびテスト時には次のテストユニットIDを使用してください。

| 広告タイプ           | テストユニットID                               |
| --------------- | --------------------------------------- |
| ネイティブ (画像)      | `PUBLIC_TEST_UNIT_ID_NATIVE`            |
| ネイティブビデオ (16:9) | `PUBLIC_TEST_UNIT_ID_NATIVE_VIDEO_16_9` |
| ネイティブビデオ (9:16) | `PUBLIC_TEST_UNIT_ID_NATIVE_VIDEO_9_16` |

```swift theme={null}
// テスト広告の読み込み
nativeAd = AdropNativeAd(unitId: AdropUnitId.PUBLIC_TEST_UNIT_ID_NATIVE)
```

<Warning>
  実際の配信時には、必ずAdropコンソールで作成した実際のユニットIDを使用してください。
</Warning>

***

## 一括ロード (loads)

`AdropNativeAd.loads(...)`を使用すると、1回の呼び出しで複数のネイティブ広告をまとめてリクエストできます。フィード・カルーセル・ページネーションリストへ挿入する広告プールのプリフェッチに有用です。

### シグネチャ

<CodeGroup>
  ```swift Swift theme={null}
  AdropNativeAd.loads(
      unitId: String,
      contextId: String = "",
      delegate: AdropNativeAdDelegate
  )
  ```

  ```objc Objective-C theme={null}
  [AdropNativeAd loadsWithUnitId:@"YOUR_UNIT_ID"
                       contextId:@""
                        delegate:delegate];
  ```
</CodeGroup>

### 使用方法

<CodeGroup>
  ```swift Swift theme={null}
  class ViewController: UIViewController {
      private var ads: [AdropNativeAd] = []

      override func viewDidLoad() {
          super.viewDidLoad()
          AdropNativeAd.loads(unitId: "YOUR_UNIT_ID", delegate: self)
      }
  }

  extension ViewController: AdropNativeAdDelegate {
      // 単体用コールバック — バッチ経路では使用されません。
      func onAdReceived(_ ad: AdropNativeAd) { /* batch path */ }
      func onAdFailedToReceive(_ ad: AdropNativeAd, _ errorCode: AdropErrorCode) {}

      // バッチ成功 — 各広告はレンダリング完了状態で渡されます。
      func onAdsReceived(_ ads: [AdropNativeAd]) {
          self.ads = ads
          ads.forEach { ad in
              bind(ad)  // AdropNativeAdViewへバインド
          }
      }

      // バッチ失敗
      func onAdsFailedToReceive(_ errorCode: AdropErrorCode) {
          print("バッチロード失敗: \(errorCode)")
      }

      // クリック/インプレッション/動画コールバックは各インスタンスで通常通り呼ばれます。
      func onAdClicked(_ ad: AdropNativeAd) {
          print("ネイティブクリック")
      }

      func onAdImpression(_ ad: AdropNativeAd) {
          print("ネイティブインプレッション")
      }
  }
  ```

  ```objc Objective-C theme={null}
  @interface ViewController () <AdropNativeAdDelegate>
  @property (nonatomic, strong) NSArray<AdropNativeAd *> *ads;
  @end

  @implementation ViewController

  - (void)viewDidLoad {
      [super viewDidLoad];
      [AdropNativeAd loadsWithUnitId:@"YOUR_UNIT_ID" contextId:@"" delegate:self];
  }

  #pragma mark - AdropNativeAdDelegate

  - (void)onAdReceived:(AdropNativeAd *)ad { /* batch path */ }
  - (void)onAdFailedToReceive:(AdropNativeAd *)ad :(AdropErrorCode)errorCode {}

  - (void)onAdsReceived:(NSArray<AdropNativeAd *> *)ads {
      self.ads = ads;
      for (AdropNativeAd *ad in ads) {
          [self bindNativeAd:ad];
      }
  }

  - (void)onAdsFailedToReceive:(AdropErrorCode)errorCode {
      NSLog(@"バッチロード失敗: %ld", (long)errorCode);
  }

  - (void)onAdClicked:(AdropNativeAd *)ad {
      NSLog(@"ネイティブクリック");
  }

  - (void)onAdImpression:(AdropNativeAd *)ad {
      NSLog(@"ネイティブインプレッション");
  }

  @end
  ```
</CodeGroup>

### デリゲートメソッド

| メソッド                                                                 | 呼び出されるタイミング                                                   |
| -------------------------------------------------------------------- | ------------------------------------------------------------- |
| `onAdsReceived(_:)`                                                  | バッチ配信完了。**すべての広告が完全にレンダリングされた状態**で渡されます。                      |
| `onAdsFailedToReceive(_:)`                                           | リクエスト拒否、ネットワーク失敗、または表示可能な広告がなかった場合 (`ERROR_CODE_AD_NO_FILL`)。 |
| `onAdClicked` / `onAdImpression` / `onAdVideoStart` / `onAdVideoEnd` | 単体`load()`と同様に、各広告ごとに呼ばれます。                                   |

<Warning>
  単体`onAdReceived(_:)` / `onAdFailedToReceive(_:_:)`コールバックは`loads`経路では**呼ばれません**。バッチ結果は必ず`onAdsReceived(_:)` / `onAdsFailedToReceive(_:)`で受け取ってください。
</Warning>

### 定数

<ParamField body="AdropNativeAd.maxLoadsBatch" type="Int" default="5">
  1回の`loads(...)`呼び出しで返却される広告の最大数。
</ParamField>

### 制約事項

* **呼び出しあたり最大5個。** サーバーがそれ以上を返しても先頭の5個のみ配信されます。
* **バックフィルは適用されません。** ダイレクト広告が埋まらない場合、バックフィル設定に関わらず`onAdsFailedToReceive`が`ERROR_CODE_AD_NO_FILL`で呼ばれます。
* `AdropBanner.loads(...)`と異なり、ネイティブバッチは**すべての広告のレンダリングが完了するまで待機**してから`onAdsReceived(_:)`を呼びます。配信時点で各インスタンスは完全にレンダリングされています。
* 返却された広告への強参照を保持してください。`AdropNativeAdView`にバインドされる前に解放されると黙って破棄されます。

***

## バックフィル広告

バックフィル広告が有効な場合、ダイレクト広告がない時に自動的にバックフィル広告がロードされます。`isBackfilled`プロパティでバックフィル広告かどうかを確認できます。

<CodeGroup>
  ```swift Swift theme={null}
  class ViewController: UIViewController, AdropNativeAdDelegate {
      private var nativeAd: AdropNativeAd?

      func onAdReceived(_ nativeAd: AdropNativeAd) {
          if nativeAd.isBackfilled {
              print("バックフィル広告がロードされました")
          } else {
              print("ダイレクト広告がロードされました")
          }
      }

      func onAdFailedToReceive(_ nativeAd: AdropNativeAd, _ errorCode: AdropErrorCode) {
          switch errorCode {
          case .ERROR_CODE_AD_NO_FILL:
              print("ダイレクト広告なし、バックフィル広告をリクエスト中...")
          case .ERROR_CODE_AD_BACKFILL_NO_FILL:
              print("バックフィル広告もありません")
              // 広告領域を非表示にする
          default:
              print("広告ロード失敗: \(errorCode)")
          }
      }
  }
  ```

  ```objc Objective-C theme={null}
  @interface ViewController () <AdropNativeAdDelegate>
  @property (nonatomic, strong) AdropNativeAd *nativeAd;
  @end

  @implementation ViewController

  - (void)onAdReceived:(AdropNativeAd *)nativeAd {
      if (nativeAd.isBackfilled) {
          NSLog(@"バックフィル広告がロードされました");
      } else {
          NSLog(@"ダイレクト広告がロードされました");
      }
  }

  - (void)onAdFailedToReceive:(AdropNativeAd *)nativeAd :(AdropErrorCode)errorCode {
      if (errorCode == AdropErrorCodeAdNoFill) {
          NSLog(@"ダイレクト広告なし、バックフィル広告をリクエスト中...");
      } else if (errorCode == AdropErrorCodeBackfillNoFill) {
          NSLog(@"バックフィル広告もありません");
          // 広告領域を非表示にする
      } else {
          NSLog(@"広告ロード失敗: %ld", (long)errorCode);
      }
  }

  @end
  ```
</CodeGroup>

### AdChoicesの位置調整

バックフィルネイティブ広告で、AdChoicesマークを表示するコーナーを指定できます。`load()`呼び出し前に`AdropNativeAd`インスタンスの`preferredAdChoicesPosition`を設定してください。

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

  let nativeAd = AdropNativeAd(unitId: "YOUR_UNIT_ID")
  nativeAd.preferredAdChoicesPosition = .bottomRight
  nativeAd.load()
  ```

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

  AdropNativeAd *nativeAd = [[AdropNativeAd alloc] initWithUnitId:@"YOUR_UNIT_ID"];
  nativeAd.preferredAdChoicesPosition = AdropAdChoicesPositionBottomRight;
  [nativeAd load];
  ```
</CodeGroup>

| 値              | 説明        |
| -------------- | --------- |
| `.topLeft`     | 左上        |
| `.topRight`    | 右上（デフォルト） |
| `.bottomLeft`  | 左下        |
| `.bottomRight` | 右下        |

<Note>
  この設定はバックフィルネットワークに渡される希望位置のヒントで、バックフィルネイティブ広告にのみ適用されます — ダイレクト広告には影響しません。必ず`load()`呼び出し前に設定する必要があり、バックフィルネットワークがポリシー上別の位置に表示する場合があります。
</Note>

<Note>
  バックフィル広告を使用するには、`AdropAds-Backfill`依存性を追加する必要があります。[はじめに](/ja/sdk/ios/overview)を参照してください。
</Note>

***

## 関連ドキュメント

<CardGroup cols={2}>
  <Card title="はじめに" href="/ja/sdk/ios">
    SDKのインストールと初期化
  </Card>

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

  <Card title="インタースティシャル広告" href="/ja/sdk/ios/interstitial">
    インタースティシャル広告の実装
  </Card>

  <Card title="リワード広告" href="/ja/sdk/ios/rewarded">
    リワード広告の実装
  </Card>
</CardGroup>
