---
title: Track Webviews - iOS (classic)
description: Track webviews with the Contentsquare iOS SDK
lastUpdated: 14 April 2026
source_url:
  html: https://docs.contentsquare.com/en/ios/track-webviews/
  md: https://docs.contentsquare.com/en/ios/track-webviews/index.md
---

> Documentation index: https://docs.contentsquare.com/llms.txt
> Use this file to discover all available pages before exploring further.

The latest CSQ SDK is here! Learn how to [upgrade your app](https://docs.contentsquare.com/en/csq-sdk-ios/experience-analytics/upgrade-from-cs-sdk/).

WebView tracking links the Contentsquare SDK to the JavaScript tag running inside your WebViews to support analytics and Session Replay for web content displayed within your app.

iOS compatibility

Contentsquare **only** allows to track instances of `WKWebView`. `SFSafariViewController` is **not** supported: The Contentsquare SDK **cannot** track what is happening within its context, and its content will **not** be visible in Session Replay.

## Enable tracking in WebViews

### Where to inject your WebViews?

It is **essential** that you inject your WebViews in `viewWillAppear()`.

Additionally, when setting a delegate on your WebView, ensure that it is implemented and set **before** calling `Contentsquare.register(webView: WKWebView)`. If this order is not respected, your delegate will **not** receive any callbacks.

### WebView registration

Use the following API:

* Swift

  ```swift
  // Start tracking the given WKWebView
  Contentsquare.register(webView: WKWebView)
  ```

* Objective-C

  ```objective-c
  // Start tracking the given WKWebView
  Contentsquare registerWithWebView:(WKWebView * _Nonnull)];
  ```

### Tag setup

To complete the implementation, inject the **CS Tag in WebView mode** on your pages.

See 📚 [Mobile Apps WebView Tracking Documentation](https://docs.contentsquare.com/en/webview-tracking-tag/#manual-injection).

## Let's sum it up

Let's illustrate our implementation with a `UIViewController`. In your `viewWillAppear()` method, add the following:

* Swift

  ```swift
  override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(animated)


      // Inject the Bridge between the CS Tag in WebView mode and the SDK
      Contentsquare.register(webView: webView)
  }
  ```

* Objective-C

  ```objective-c
  - (void)viewWillAppear:(BOOL)animated {
      [super viewWillAppear:animated];


      // Inject the Bridge between the CS Tag in WebView mode and the SDK
      [Contentsquare registerWithWebView:self.webView];
  }
  ```

## Validate WebView tracking

### On the native side

Once you open the screen with the tracked WebView in your app, you should see the following log:

```plaintext
CSLIB ℹ️ Info: WebView tracking enabled on native side for page: [URL]. Waiting for Web Tracking Tag messages…
```

Once the web page is loaded in the WebView, you should see the following log:

```plaintext
CSLIB ℹ️ Info: WebView navigated to new page: [URL]. Waiting for Web Tracking Tag messages…
```

### On the Web side

Once the Web Tracking tag is detected in the web page, you should see the following log:

```plaintext
CSLIB ℹ️ Info: Web Tracking Tag is detected on page: [URL]
```

#### Validating Pageview and Gestures tracking

Page views sent through the Web Tracking Tag are displayed the same way as native screen views:

```plaintext
CSLIB ℹ️ Info: Screenview - Screen name: "{{page name given}}" - Screen number: 11
```

Taps and swipes detected by the Web Tracking Tag are also displayed the same way as taps and swipe on native elements, but the end of the target contains HTML DOM elements:

```plaintext
CSLIB ℹ️ Info: Tap - Target: ...>UIViewControllerWrapperView:eq(0)>UIView:eq(0)>WKWebView:eq(0)|webview|img#picture-holder
```
