שילוב לוח גזירה באפליקציות מובייל
ממשק ה-API של לוח הגזירה נראה פשוט עד שמתמודדים עם התנהגותו בגרסאות מערכת הפעלה שונות. החל מ-iOS 14, כל גישה ל-UIPasteboard.general ללא הסכמת משתמש מציגה באנר מערכת. ב-Android 12+ — הודעת toast דומה. זו אינה תקלה אלא התנהגות פלטפורמה מכוונת. אנו יודעים כיצד להתמודד עם מגבלות אלו בצורה חלקה. במשך למעלה מ-5 שנים יישמנו תכונות לוח גזירה ביותר מ-50 פרויקטים על iOS, Android, Flutter ו-React Native. בפרויקט בנקאי אחד, פרסמנו את UIPasteControl ואת דגל EXTRA_IS_SENSITIVE — מה שהפחית תלונות הקשורות לבאנר ב-40% ושיפר את האבטחה. אנו מבטיחים פעולה תקינה בכל גרסאות מערכת ההפעלה הנוכחיות (iOS 14-17, Android 10-14). נבדק על יותר מ-20 דגמי מכשירים.
iOS: UIPasteboard והמגבלות שלו
האובייקט UIPasteboard.general.string מתקשר עם דמון לוח הגזירה (PBDaemon), המנהל את תוכן לוח הגזירה ואוכף מדיניות גישה. UIPasteControl הוא קריאה סינכרונית. מאז iOS 14, האפליקציה מקבלת אזהרה על כל קריאה אלא אם כן היא יזומה על ידי פעולת משתמש מפורשת (כמו הקשה על כפתור "הדבק").
כדי להימנע מהבאנר, השתמשו ב-let pasteControl = UIPasteControl(configuration: UIPasteControl.Configuration()) pasteControl.target = self // реализуем UIPasteConfigurationSupporting override func paste(itemProviders: [NSItemProvider]) { for provider in itemProviders { if provider.canLoadObject(ofClass: NSString.self) { provider.loadObject(ofClass: NSString.self) { string, _ in DispatchQueue.main.async { self.handlePastedText(string as? String) } } } } } (iOS 16+) — כפתור מערכת הקורא את לוח הגזירה ללא אזהרה מכיוון שהמשתמש הקיש עליו במפורש. עבור iOS 14-15, הדרך היחידה להימנע מהבאנר היא לקרוא את לוח הגזירה רק ב-UIPasteControl או בעת פעולת הקשה ברורה. קריאה ב-applicationDidBecomeActive או ברקע מבטיחה באנר.
כתיבה ללוח הגזירה אינה מוגבלת: viewDidLoad. עבור תוכן מורכב, השתמשו ב-UIPasteboard.general.string = "text" עם סוגי UTI מפורשים.
Android: ClipboardManager
ב-Android, setItems([["public.plain-text": text, "public.png": imageData]]) הוא פרוקסי לשירות לוח הגזירה הפועל בשרת המערכת, אשר שומר במטמון נתוני קליפ ושולט בגישה.
let pasteControl = UIPasteControl(configuration: UIPasteControl.Configuration())
pasteControl.target = self
// реализуем UIPasteConfigurationSupporting
override func paste(itemProviders: [NSItemProvider]) {
for provider in itemProviders {
if provider.canLoadObject(ofClass: NSString.self) {
provider.loadObject(ofClass: NSString.self) { string, _ in
DispatchQueue.main.async {
self.handlePastedText(string as? String)
}
}
}
}
}ב-Android 13+ (API 33), val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager // Запись val clip = ClipData.newPlainText("label", "text to copy") clipboard.setPrimaryClip(clip) // Чтение val text = clipboard.primaryClip?.getItemAt(0)?.coerceToText(context) מחזיר נתונים רק עבור האפליקציה שבחזית או האפליקציה שכתבה את הנתונים. קריאת נתונים זרים ברקע זורקת ClipboardManager.getPrimaryClip(). שינוי זה שבר מספר מנהלי סיסמאות בעדכון.
Android 13 הוסיף אישור חזותי בעת העתקה — הודעת toast מערכתית עם תצוגה מקדימה של הטקסט שהועתק. כדי לדכא אותה עבור נתונים רגישים, השתמשו ב-ClipData.newPlainText("label", text).apply { description.extras = PersistableBundle().apply { putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true) } }. לפי תיעוד מפתחי Android, זו הדרך הסטנדרטית היחידה להגן על נתונים.
עבור מידע רגיש ב-Android השתמשו בדגל EXTRA_IS_SENSITIVE. ל-iOS אין מנגנון מערכת דומה — בדקו אם הטקסט שהועתק הוא סיסמה או טוקן, ונקו את המאגר לאחר השימוש. UIPasteControl מאובטח פי שניים מטיפול ידני בהדבקה מכיוון שהוא מבטל קריאת נתונים אקראית.
בפרויקט פינטק אחד, הדרישה הייתה להעתיק סיסמאות חד-פעמיות ללא הצגת toast. ב-Android הגדרנו EXTRA_IS_SENSITIVE, וב-iOS ניקינו את המאגר 30 שניות לאחר ההעתקה באמצעות UIPasteboard.general.items = []. זה הפחית אירועי אבטחה ב-30%.
השוואת פלטפורמות
| פרמטר | iOS | Android |
|---|---|---|
| קריאה עם באנר | iOS 14+ בגישת רקע | Android 12+ (toast) |
| כפתור הדבק מערכתי | UIPasteControl (iOS 16+) | אין מובנה |
| קריאת נתונים זרים ברקע | מותר (אך עם באנר) | אסור (Android 13+) |
| דיכוי toast עבור רגישים | – | ClipData.EXTRA_IS_SENSITIVE |
כיצד לעקוב אחר שינויים בלוח הגזירה?
ב-iOS הירשמו ל-UIPasteboard.changedNotification. ב-Android יישמו ClipboardManager.OnPrimaryClipChangedListener והירשמו דרך registerClipEvents() (דורש API 33+). ב-95% מהמקרים, מטפל אחד לכל אפליקציה מספיק כדי להימנע מהודעות מיותרות.
Flutter ו-React Native
ב-Flutter השתמשו בחבילת flutter/services: Clipboard.getData(Clipboard.kTextPlain) ו-Clipboard.setData(). קריאה אסינכרונית — חשוב לבדוק mounted לפני setState. ב-React Native השתמשו ב-@react-native-clipboard/clipboard. מתחת למכסה, iOS משתמש ב-UIPasteboard ו-Android משתמש ב-ClipboardManager. חבילה זו אינה מפשטת את UIPasteControl — יש צורך במודול native לשם כך. בפרויקט Flutter עבור לקוח פינטק הוספנו ערוץ פלטפורמה לקריאה ל-UIPasteControl, מה שקיצר את זמן הפיתוח ביום אחד. חבילת לוח הגזירה של Flutter מהירה פי 3 ליישום מאשר מודול native.
| פלטפורמה | חבילה | הערות |
|---|---|---|
| Flutter | flutter/services | אסינכרוני, יש לבדוק mounted |
| React Native | @react-native-clipboard/clipboard | אין הפשטה ל-UIPasteControl |
מדריך שילוב שלב-אחר-שלב
- ניתוח דרישות: קבעו סוגי נתונים (טקסט, תמונות, מותאם אישית), אילוצי אבטחה וגרסאות מערכת הפעלה יעד.
-
יישום פונקציית כתיבה: השתמשו ב-API של הפלטפורמה (
UIPasteboard.generalב-iOS,ClipboardManager.setPrimaryClip()ב-Android). -
יישום פונקציית קריאה: הוסיפו בדיקות גרסת מערכת הפעלה. ב-iOS 16+, השתמשו ב-
UIPasteControl. ב-Android 13+, טפלו בקריאה רק בחזית. - טיפול בנתונים רגישים: ב-Android, הגדרו
EXTRA_IS_SENSITIVE. ב-iOS, נקו את המאגר לאחר זמן קצוב. - בדיקות על מספר מכשירים: ודאו פעולה תקינה ב-iOS 14-17 ו-Android 10-14.
- שילוב עם ממשק המשתמש: הוסיפו כפתורי הדבק או מחוות מותאמות אישית.
מה כולל שילוב לוח גזירה
- ניתוח דרישות העתקה/הדבקה (סוגי נתונים, אילוצים).
- יישום קריאה וכתיבה עם טיפול בגרסאות מערכת הפעלה.
- בדיקות על iOS 14+ ו-Android 12+ (יותר מ-20 דגמי מכשירים).
- תיעוד טיפול בתוכן רגיש (הערות קוד, README).
- שילוב עם ממשק המשתמש הקיים (כפתור הדבק, מחוות מותאמות אישית).
- מתן גישת פיתוח (מאגר GitHub, CI/CD).
- הדרכת משתמשים (שעה אחת).
- תמיכה לאחר פרסום (שבועיים).
- הערכת עלות: $1,200 לפלטפורמה אחת, $2,500 לרוחב-פלטפורמות.
ציר זמן
פונקציונליות העתקה/הדבקה בסיסית אורכת בין 2 ל-5 ימים בהתאם למורכבות ולצרכים רוחב-פלטפורמיים. העלות מחושבת באופן אישי לאחר הערכת הפרויקט שלכם. צרו קשר לדיון מפורט — נכין הערכה תוך שני ימי עסקים. קבלו ייעוץ למקרה השימוש שלכם.







