> ## 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.

# WebViewガイド

> iOSのWKWebViewでバックフィル広告を表示する方法

## 概要

WKWebViewをAdrop SDKに登録して、アプリ内のウェブコンテンツでバックフィル広告を表示できます。

***

## Info.plist設定

WebViewでバックフィル広告を有効にするには、`Info.plist`に以下のキーを追加してください：

```xml Info.plist theme={null}
<key>GADIntegrationManager</key>
<string>webview</string>
```

<Warning>
  この設定はWebViewでバックフィル広告が正常に動作するために必要です。この設定がないとバックフィル広告が表示されない場合があります。
</Warning>

***

## WebView登録

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

  class WebViewController: UIViewController {

      @IBOutlet weak var webView: WKWebView!

      override func viewDidLoad() {
          super.viewDidLoad()

          // WKWebViewConfigurationオブジェクトを初期化
          let webViewConfiguration = WKWebViewConfiguration()
          // "playsinline"属性を持つHTML動画をインラインで再生
          webViewConfiguration.allowsInlineMediaPlayback = true
          // "autoplay"属性を持つHTML動画を自動再生
          webViewConfiguration.mediaTypesRequiringUserActionForPlayback = []

          // WKWebViewConfigurationオブジェクトでWKWebViewを初期化
          webView = WKWebView(frame: view.frame, configuration: webViewConfiguration)
          // バックフィル広告サポートのためにWebViewを登録
          // コンテンツ読み込み前にできるだけ早く呼び出す
          Adrop.registerWebView(webView)

          // Webコンテンツを読み込む
          if let url = URL(string: "https://your-website.com") {
              webView.load(URLRequest(url: url))
          }
      }
  }
  ```

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

  @interface WebViewController ()
  @property (nonatomic, weak) IBOutlet WKWebView *webView;
  @end

  @implementation WebViewController

  - (void)viewDidLoad {
      [super viewDidLoad];

      // WKWebViewConfigurationオブジェクトを初期化
      WKWebViewConfiguration *webViewConfiguration = [[WKWebViewConfiguration alloc] init];
      // "playsinline"属性を持つHTML動画をインラインで再生
      webViewConfiguration.allowsInlineMediaPlayback = YES;
      // "autoplay"属性を持つHTML動画を自動再生
      webViewConfiguration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;

      // WKWebViewConfigurationオブジェクトでWKWebViewを初期化
      self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:webViewConfiguration];
      [self.view addSubview:self.webView];

      // バックフィル広告サポートのためにWebViewを登録
      // コンテンツ読み込み前にできるだけ早く呼び出す
      [Adrop registerWebView:self.webView];

      // Webコンテンツを読み込む
      NSURL *url = [NSURL URLWithString:@"https://your-website.com"];
      [self.webView loadRequest:[NSURLRequest requestWithURL:url]];
  }

  @end
  ```
</CodeGroup>

<Note>
  `registerWebView()`はメインスレッドで呼び出す必要があります。
  Webコンテンツを読み込む前にできるだけ早く呼び出してください（例：`viewDidLoad`）。
</Note>

<Warning>
  WebViewでバックフィル広告を使用するには`adrop-ads-backfill`モジュールが必要です。モジュールがインストールされていない場合、`registerWebView()`は静かに無視されます。
</Warning>

***

## 外部URLの処理

アプリで自社ドメイン以外のURLを外部ブラウザで開くロジックがある場合、広告リソースリクエスト（例：`googleads.g.doubleclick.net`）がブロックされないようにする必要があります。

広告リソース（iframe、スクリプトなど）は広告SDKによって自動的にロードされ、ユーザーが直接クリックしたものではありません。**ユーザーが直接クリックしたメインフレームのナビゲーション**のみを外部ブラウザにリダイレクトしてください。

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

  let allowedHost = "my-domain.com"

  func webView(_ webView: WKWebView,
               decidePolicyFor navigationAction: WKNavigationAction,
               decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

      guard let url = navigationAction.request.url else {
          decisionHandler(.cancel)
          return
      }

      let host = url.host ?? ""

      // ユーザーが直接クリックした場合のみ外部ブラウザで開く
      // 広告リソース（例：googleads.g.doubleclick.net）はiframe/スクリプトでロードされるためブロックしない
      if !host.contains(allowedHost),
         navigationAction.navigationType == .linkActivated {
          UIApplication.shared.open(url, options: [:], completionHandler: nil)
          decisionHandler(.cancel)
          return
      }

      decisionHandler(.allow)
  }
  ```

  ```objc Objective-C theme={null}
  NSString *allowedHost = @"my-domain.com";

  - (void)webView:(WKWebView *)webView
      decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
      decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

      NSURL *url = navigationAction.request.URL;
      if (!url) {
          decisionHandler(WKNavigationActionPolicyCancel);
          return;
      }

      NSString *host = url.host ?: @"";

      // ユーザーが直接クリックした場合のみ外部ブラウザで開く
      // 広告リソース（例：googleads.g.doubleclick.net）はiframe/スクリプトでロードされるためブロックしない
      if (![host containsString:allowedHost] &&
          navigationAction.navigationType == WKNavigationTypeLinkActivated) {
          [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
          decisionHandler(WKNavigationActionPolicyCancel);
          return;
      }

      decisionHandler(WKNavigationActionPolicyAllow);
  }
  ```
</CodeGroup>

<Warning>
  自社ドメイン以外のすべてのリクエストをブロックまたはリダイレクトしないでください。`googleads.g.doubleclick.net`のような広告リソースはバックフィル広告のプロセスで自動的にロードされ、WebView内で正常にロードされる必要があります。
</Warning>

***

## 関連ドキュメント

<CardGroup cols={2}>
  <Card title="バナー広告" icon="rectangle-ad" href="/ja/sdk/ios/banner">
    バナー広告の実装方法を確認
  </Card>

  <Card title="リファレンス" icon="book" href="/ja/sdk/ios/reference">
    APIリファレンス
  </Card>

  <Card title="サンプル" icon="code" href="/ja/sdk/ios/examples">
    サンプルリポジトリ
  </Card>
</CardGroup>
