---
title: Compatibility - iOS
description: Requirements and limitations to develop with the Contentsquare iOS SDK
lastUpdated: 23 October 2025
source_url:
  html: https://docs.contentsquare.com/en/csq-sdk-ios/product-analytics/compatibility/
  md: https://docs.contentsquare.com/en/csq-sdk-ios/product-analytics/compatibility/index.md
---

* **Programming languages:** The iOS SDK supports and tracks content on any screen developed in **Objective-C or Swift (version >= 4.2)**.

* **SwiftUI:** is officially supported

* **iOS version:** starting with SDK 4.17.0 we support **iOS 12.4 and later**

  * Starting with SDK 4.36.0, **no data will be collected for applications running on iOS < 13.0**
  * Current Xcode supports simulators on 12.4 and later
  * ReactNative requires a minimum of iOS 12.4
  * All devices released since 2014 can be updated to iOS 12.4
  * `SFSafariViewController` is **not** supported

## Known limitations and recommendations

### Screenshot fidelity: Combining Visual Effects with Filters

**Symptom:** Some elements of the screenshots may not be visible, such as `UITabBar` buttons.

**Explanation:** Our capturing method prevents to capture views when Visual effects are combined with filters. Our tools captures as much as Xcode’s ‘Debug View Hierarchy’ feature. If you want to preview what is going to be rendered, you can use this feature to visualize your screen. See [Capturing a Snapshot of a UIVisualEffectView ↗](https://developer.apple.com/documentation/uikit/uivisualeffectview#Capture-a-snapshot-of-a-visual-effect-view).

### Screenshot fidelity: Customized layer(s) applied on a container view

**Symptom:** Some elements of the screenshots may not be displayed correctly in the **Zoning Analysis**.

**Explanation:** Our capture method relies on views to determine zoning elements. A view containing subviews is a container and when a container is assigned a customized [layer ↗](https://developer.apple.com/documentation/uikit/uiview/1622436-layer), it may not appear in the **Zoning Analysis**.

**Workaround:** Instead of applying customized layer to the container, prefer applying it on view of type, or subtype, `UIImageView` or `UIControl`.

### Screenshot fidelity: Floating header/footer missing in Zoning

**Symptom:** Some elements of the screenshots don't exist in the **Zoning Analysis**.

**Explanation:** The **Zoning Analysis** module does not support `UITableViewHeaderFooterView` in `UITableView` and `UICollectionReusableView` in `UICollectionView` due to their highly dynamic memory and rendering behavior.

### Screenshot fidelity: Floating header/footer duplicated in Zoning

**Symptom:** Some elements appear multiple times in the **Zoning Analysis**.

**Explanation:** The **Screenshot** captures the currently visible content on screen. When a floating header/footer remains visible during scrolling, it may be captured at different positions throughout the **Long screenshot process**, resulting in duplications.

### Screenshot fidelity: Multiple vertical scrollViews

**Symptom:** The **Long Screenshot** cinematic may not start on mobile, or the resulting screenshot might be unscrollable in **Zoning Analysis**.

**Explanation:** When multiple vertical scrollViews are present on a screen, the **Long Screenshot** cinematic will attempt to run only on the last vertical scrollView the user interacted with. Other scrollable areas will not be automatically scrolled or captured by the cinematic process, even if they contain content. In practice, this means the automatic scrolling (and full content capture) is limited to a single scrollView per screen, based on user interaction.

### Gestures not attached to `UIImageView`

**Symptom:** When analysing the tap rate on an image, we see 0% when we know it is not possible.

**Explanation:** By default `UIImageView` have their `isUserInteractionEnabled` property set to false ([See Apple documentation ↗](https://developer.apple.com/documentation/uikit/uiimageview/1621063-isuserinteractionenabled)). This means that the `UIImageView` won’t receive any input event. All events will be handled by the first parent to have `isUserInteractionEnabled` set to true (usually the first parent will do).

**Workaround:** Create a zone on the parent view to get the taps on the image.

### `UICollectionViewCompositionalLayout` TVP lack of consistency

**Explanation:** As explained in the [Apple documentation ↗](https://developer.apple.com/documentation/uikit/uicollectionviewcompositionallayout), `UICollectionViewCompositionalLayout` is a highly dynamic layout creation object. We are not able to ensure TVP value is the same between different usages.

### Zoning Limitation in SwiftUI with scrolling (Lazy)Stack and (Lazy)Grid

* **Screenshot and Gesture Tracking Limitations:**

  * Using `LazyStack`, or `LazyGrid` nested in a `ScrollView` may present limitations in screenshot and gesture tracking due to differences in memory management compared to UIKit.
  * Intricate hierarchies of `LazyStacks` or `LazyGrids` can lead to inconsistent identification of elements, impacting the reliability of element identification. **Prefer to use single layered Lazy components**, when possible.

* **Rotation Limitation:**

  * Unique identification of elements within SwiftUI `Stack`, `Grid`, `LazyStack`, or `LazyGrid` is not guaranteed after a rotation, so, **rotation is not supported** for `Stack`, `Grid`, `LazyStack`, or `LazyGrid`.

* **Scrolling Element Offset Limitation:**

  * The consistency of unique identifiers is not guaranteed when the scrolling element is displayed starting at an offset different than zero.

Check the following Help Center article for more information about the symptom, root cause and potential mitigation solutions: [I can't create a zone on a list element on iOS (SwiftUI) ↗](https://support.contentsquare.com/hc/en-us/articles/4408117004690)
