В современных приложениях часто возникает необходимость скрывать конфиденциальную информацию от случайного попадания в скриншоты. SwiftUI предоставляет элегантное решение этой проблемы через комбинацию UIViewRepresentable и системных механизмов защиты.
Основная идея заключается в использовании Secure TextField, который iOS автоматически размывает при попытке захвата экрана. Вот как это можно реализовать:
1️⃣ Создаем обертку SecureContentWrapper для скрытия контента:
struct SecureContentWrapper<Content: View>: 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) {}
}
2️⃣ Для удобства использования создаем модификатор:
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()
}
}
3️⃣ Добавляем расширение для 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()
}
}
⚠️ Важные моменты:
🔸 Защита работает только при активном захвате экрана.
🔸 Не предотвращает фотографирование экрана другим устройством.
🔸 Для максимальной безопасности комбинируйте с другими методами.
💡 Вывод:
Данное решение весьма актуально для банковских, медицинских и других приложений, работающих с персональными данными.
Главное преимущество подхода: его простота и отсутствие необходимости в сложных вычислениях или дополнительных разрешениях.
➡️ Подписаться на канал
Мобильный трудоголик