Добавить объявление

SwiftUI: защита конфиденциальных данных при скриншоте или записи экрана

В современных приложениях часто возникает необходимость скрывать конфиденциальную информацию от случайного попадания в скриншоты. SwiftUI предоставляет элегантное решение этой проблемы через комбинацию UIViewRepresentable и системных механизмов защиты.

Основная идея заключается в использовании Secure TextField, который iOS автоматически размывает при попытке захвата экрана. Вот как это можно реализовать:

Создаем обертку SecureContentWrapper для скрытия контента:


struct SecureContentWrapper: UIViewRepresentable {
let content: Content

func makeUIView(context: Context) -> UIView {
let hostingController = UIHostingController(rootView: content)
let secureField = UITextField()
secureField.isSecureTextEntry = true
secureField.addSubview(hostingController.view)
return secureField
}

func updateUIView(_ uiView: UIView, context: Context) {}
}

Для удобства использования создаем модификатор:


struct ContentProtector: ViewModifier {
@State private var contentSize: CGSize = .zero

func body(content: Content) -> some View {
SecureContentWrapper(content: content)
.frame(width: contentSize.width, height: contentSize.height)
.background(
GeometryReader { proxy in
Color.clear
.preference(key: ContentSizePreference.self, value: proxy.size)
}
)
.onPreferenceChange(ContentSizePreference.self) { size in
self.contentSize = size
}
}
}

struct ContentSizePreference: PreferenceKey {
static var defaultValue: CGSize = .zero

static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}

Добавляем расширение для View:


extension View {
func protectContent() -> some View {
self.modifier(ContentProtector())
}
}

Пример использования:


struct PrivateDataView: View {
var body: some View {
VStack {
Text("Номер карты: 1234 **** **** 5678")
.font(.title)

Text("Срок действия: 12/34")

Text("CVV: 123")
}
.padding()
.background(Color.gray.opacity(0.1))
.cornerRadius(12)
.protectContent()
}
}

Важные моменты:


  • Защита работает только при активном захвате экрана.

  • Не предотвращает фотографирование экрана другим устройством.

  • Для максимальной безопасности комбинируйте с другими методами.

Вывод:


Данное решение весьма актуально для банковских, медицинских и других приложений, работающих с персональными данными.

Главное преимущество подхода: его простота и отсутствие необходимости в сложных вычислениях или дополнительных разрешениях.
10.09.2025 63 443