Hi all, We are developing an iOS app that includes private user-to-user chats, commercial offer details with monetary value, and customer identification data. In line with OWASP MASVS-PLATFORM-3 requirements regarding unintentional sensitive data exposure, we need to protect these specific screens from screenshots and screen recording. We have carefully reviewed the relevant App Review Guidelines (2.5.1 on public APIs, 2.5.2 on self-contained bundles, 5.1.1 on privacy) and the related Human Interface Guidelines. From this analysis we have observed the following:
iOS does not expose a public API to globally disable screen capture (no direct equivalent of Android's FLAG_SECURE). The SwiftUI .privacySensitive() modifier is effective for Lock Screen widgets and Always-On Display, but it does not appear to prevent screenshots or screen recording of an app's main UI while in the foreground. A number of widely distributed App Store apps (banking, authenticator, secure messaging) implement some form of screenshot protection on sensitive screens. Several established open-source libraries leverage the system behavior of UITextField with isSecureTextEntry as a wrapping container for arbitrary views, in order to achieve pixel-level protection for sensitive content.
We would appreciate clarification on the following points:
For privacy-driven protection of sensitive screens (private chats, customer data, monetized offers), is there an officially recommended approach we may have missed? Are there public APIs intended specifically for this use case beyond .privacySensitive()? Is the practice of leveraging UITextField with isSecureTextEntry as a wrapping container for arbitrary views considered an acceptable use of public APIs under Guideline 2.5.1, or does it carry App Review risk? Are there official recommendations or documentation for apps handling sensitive personal data that wish to align with industry standards such as OWASP MASVS-PLATFORM-3 for screenshot and screen recording leakage prevention?
The intended use is strictly limited to a small number of screens marked as containing sensitive data (private messages, deal details, customer information). The protection would be selective and clearly communicated to the user via in-app messaging, not global to the app. Thanks in advance for any clarification, including pointers to existing documentation or threads we may have missed. Deployment target: iOS 15+
Brief follow-ups on your three new questions:
-
UIApplication.userDidTakeScreenshotNotification— yes, observing that notification and reacting (with an overlay or an audit log) is its intended use. For your apparent use case I think it's worth pointing out that the notification is posted after the screenshot has been captured by the system. The callback you provide runs after the screenshot is already in Photos, so an overlay you apply in response can hide your UI for subsequent screenshots but can't redact the one that triggered the notification. For audit logging this fits. It is not a prevention mechanism — by the time your handler runs, the screenshot has already been saved. -
UIScreen.isCapturedandUITraitSceneCaptureState(iOS 17+) — yes, observing the property or trait and reacting to capture state is the intended use of those APIs. They reliably reflect the system's view of capture state for capture mechanisms iOS knows about (Control Center screen recording, AirPlay mirroring, Sidecar / Continuity capture, and so on). The relevant caveat is the inherent race window — the property or trait updates around the time capture begins, but sensitive content rendered on-screen at the moment capture starts may be visible in the window before your handler runs. Same shape as the screenshot notification: fits audit and reactive UI updates, but it is not a prevention mechanism — anything visible on screen when capture begins is in the captured stream before your handler can react. -
Documentation pointers. Apple hasn't published a guide on protecting sensitive content from screen capture. Each of the APIs you mentioned —
View.privacySensitive(_:),UIApplication.userDidTakeScreenshotNotification,UIScreen.isCaptured,UITraitSceneCaptureState, and the App Switcher snapshot pattern documented in QA1838 — has its own documentation describing what that API does. None of that documentation frames them as parts of a "screen capture protection" pattern.
Thanks in advance for the FB number once you've filed.