תארו לעצמכם משתמש שמזין קוד סודי באפליקציית בנק בזמן שמקליט מסך—תוכנה זדונית או אפילו המקליט המובנה—פועל. לא רק הקוד אלא כל תהליך האימות והצפייה במסמכים חסויים עלולים להיקלט. נתקלנו בתרחישים כאלה עשרות פעמים ואנחנו יודעים כיצד להגן על האפליקציה שלכם. הקלטת מסך היא איום חמור יותר מצילום מסך מכיוון שהיא לוכדת קלט דינמי ואנימציות. ב-iOS, מקליט המסך המובנה ושיקוף AirPlay פועלים ברמת המערכת, בעוד שבאנדרואיד ה-MediaProjection API זמין לאפליקציות צד שלישי עם הרשאת משתמש (אבל תוכנה זדונית יכולה לרמות את המשתמש). הניסיון שלנו: 5+ שנים באבטחת מובייל, עשרות פרויקטים עם הגנה על מידע רגיש.
כיצד FLAG_SECURE עובד באנדרואיד
FLAG_SECURE הוא כלי ההגנה העיקרי באנדרואיד, אבל הוא חסר תועלת נגד כרטיסי לכידת HDMI או מצלמות פיזיות המופנות למסך. זהו מגבלת פלטפורמה שיש לקבל או לצמצם עם DRM (למשל, Widevine). עבור כל התרחישים האחרים, הדגל חוסם ביעילות את ה-MediaProjection API.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
setContentView(R.layout.activity_main)
}הדגל חוסם לכידה דרך override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE ) setContentView(R.layout.activity_main) } : הקלטת המסך תקבל מלבן שחור במקום תוכן ה-Activity. זה עובד עבור מקליט המערכת ואפליקציות צד שלישי המשתמשות ב-MediaProjection. עבור Jetpack Compose, אותה גישה ברמת ה-Activity—תוכן Compose נמצא בתוך אותו Window. תיעוד מפתחי אנדרואיד: WindowManager.LayoutParams.FLAG_SECURE
כיצד לזהות הקלטת מסך ב-iOS?
iOS אינו מספק API לחסימת הקלטה, אבל הוא נותן כלי זיהוי חזק—MediaProjection API ו-UIScreen.isCaptured. אנו משתמשים בו בכל פרויקט עם הגנת תוכן. UIScreen.capturedDidChangeNotification מחזיר isCaptured עבור הקלטה מובנית פעילה, שיקוף AirPlay או לכידת QuickTime. ראוי לציין שהוא לא מופעל עבור צילומי מסך של פריים בודד—הבדל חשוב מה-true של אנדרואיד. התגובה הנכונה היא לא קריסה או התנתקות אלא הסתרת תוכן רגיש:
private var cancellables = Set<AnyCancellable>()
func setupScreenCaptureProtection() {
NotificationCenter.default.publisher(
for: UIScreen.capturedDidChangeNotification
)
.receive(on: DispatchQueue.main)
.sink { [weak self] _ in
self?.updateContentVisibility()
}
.store(in: &cancellables)
// проверяем текущее состояние при запуске
updateContentVisibility()
}
private func updateContentVisibility() {
let isBeingRecorded = UIScreen.main.isCaptured
sensitiveContainerView.isHidden = isBeingRecorded
if isBeingRecorded {
recordingWarningView.isHidden = false
}
}FLAG_SECURE הוא מציין מיקום שהמשתמש רואה במקום נתונים במהלך הקלטה. זה מספק גם הגנה וגם הסבר UX.
גרסת SwiftUI
struct SensitiveContentView: View {
@State private var isScreenBeingRecorded = UIScreen.main.isCaptured
var body: some View {
Group {
if isScreenBeingRecorded {
RecordingBlockerView()
} else {
ActualSensitiveContent()
}
}
.onReceive(
NotificationCenter.default.publisher(
for: UIScreen.capturedDidChangeNotification
)
) { _ in
isScreenBeingRecorded = UIScreen.main.isCaptured
}
}
} Flutter ו-React Native
שני הפריימוורקים חוצי הפלטפורמות דורשים תוספים מקוריים לפונקציונליות זו. Flutter: private var cancellables = Set<AnyCancellable>() func setupScreenCaptureProtection() { NotificationCenter.default.publisher( for: UIScreen.capturedDidChangeNotification ) .receive(on: DispatchQueue.main) .sink { [weak self] _ in self?.updateContentVisibility() } .store(in: &cancellables) // проверяем текущее состояние при запуске updateContentVisibility() } private func updateContentVisibility() { let isBeingRecorded = UIScreen.main.isCaptured sensitiveContainerView.isHidden = isBeingRecorded if isBeingRecorded { recordingWarningView.isHidden = false } } באנדרואיד מגדיר recordingWarningView. עבור iOS, יש צורך בערוץ פלטפורמה עם יישום Swift מקורי—אין חבילות מוכנות אמינות, אנחנו כותבים בעצמנו. React Native: struct SensitiveContentView: View { @State private var isScreenBeingRecorded = UIScreen.main.isCaptured var body: some View { Group { if isScreenBeingRecorded { RecordingBlockerView() } else { ActualSensitiveContent() } } .onReceive( NotificationCenter.default.publisher( for: UIScreen.capturedDidChangeNotification ) ) { _ in isScreenBeingRecorded = UIScreen.main.isCaptured } } } עבור אנדרואיד; עבור iOS, מודול מקורי דרך flutter_windowmanager.
ביקורת תצוגה מקדימה של מחליף אפליקציות
| פלטפורמה | מנגנון הגנה במחליף אפליקציות | הערות |
|---|---|---|
| iOS | שכבת-על View ב-FLAG_SECURE |
דורש שכבת-על פרוגרמטית |
| אנדרואיד | react-native-flag-secure-android |
עובד אוטומטית |
iOS: שכבת-על עם View ב-NativeModules:
func sceneWillResignActive(_ scene: UIScene) {
overlayView.isHidden = false
}
func sceneDidBecomeActive(_ scene: UIScene) {
overlayView.isHidden = true
}אנדרואיד: sceneWillResignActive מכסה גם מקרה זה—התצוגה המקדימה במחליף האפליקציות תהיה שחורה.
השוואת גישות: FLAG_SECURE לעומת UIScreen.isCaptured
| מאפיין | FLAG_SECURE (אנדרואיד) | UIScreen.isCaptured (iOS) |
|---|---|---|
| סוג הגנה | חסימת לכידה | זיהוי ותגובה |
| ביצועים | 0% תקורה | עיכוב מינימלי (1–2 אלפיות שנייה) |
| הגנה מלכידה חומרתית | לא | לא |
| קלות יישום | דגל יחיד ב-Kotlin | הרשמה להתראות ב-Swift |
| כיסוי (צילומי מסך) | כן | וידאו בלבד |
FLAG_SECURE מגיב פי 3 מהר יותר מחלופות polling, אבל לא מכסה התקפות חומרה. ב-iOS, הזיהוי הוא מיידי (<10 אלפיות שנייה לאחר תחילת ההקלטה).
הגישה שלנו ליישום: מה כלול
אנו מציעים הגנה סוהר על הקלטת מסך. ההיקף כולל:
- ביקורת על ארכיטקטורת האפליקציה הנוכחית לפרצות לכידת מסך.
- עיצוב הגנה: בחירת שיטות אופטימליות עבור הפריימוורק וגרסת ה-SDK שלכם.
- יישום בקוד מקורי (Swift/Kotlin) או דרך תוספים ל-Flutter/React Native.
- בדיקות על 5 מכשירים אמיתיים עם גרסאות מערכת הפעלה שונות.
- תיעוד ארכיטקטורת ההגנה והוראות למפתחים.
- סמינר מקוון הדרכה לצוות (30 דקות).
לוח זמנים: 1–3 ימים תלוי במספר המסכים הרגישים. קוד סודי שדלף דרך הקלטת מסך יכול לעלות לעסק כ-$9k–13k בחסכונות—השקעה של $300–600 מוצדקת פי כמה. קבלו ייעוץ—נעריך את הפרויקט שלכם ונציע פתרון אופטימלי.
יישום מלא של הגנת הקלטת מסך באנדרואיד + iOS, כולל הגנת תצוגה מקדימה במחליף אפליקציות וטיפול במצב sceneWillResignActive—1–3 ימים תלוי בפריימוורק ובמספר המסכים הרגישים. צרו קשר כדי להתחיל. אנו מבטיחים אינטגרציה ללא תקלות וייעוץ תמיכה מלא.







