יצירת AVCR עבור Barcode ו- QR Code Scanning

מסגרת AVFoundation של אפל מספקת ממשק בעל ביצועים גבוהים, נמוך ברמת העבודה עם מדיה אודיווויזואלית במכשירי iOS.עבור barcode ו- QR Code סריקה, המסגרת חושפת את ה-FLT:0 Class, אשר יכול לזהות מגוון רחב של קודים קריאים קריאים מכונה בזמן אמת מהזנת המצלמה.

סריקת AVFoundation היא חומרה מחוסמת על מכשירים מודרניים, המציעה זיהוי מהיר ואמינה אפילו בתנאי תאורה מאתגרים.זה עובד עם מצלמות אחוריות וקדמית, ואת אזור הגילוי ניתן להגביל לאזור מסוים של עניין כדי לשפר את הביצועים ואת חוויית המשתמש.

הגדרת לכידת המצלמה

הליבה של כל סורק מבוסס AVFoundation הוא 1FLT:1 אובייקט זה מארגן את זרימת הנתונים מן המצלמה קלט לפלט metadata. הגדרת הפגישה דורש כמה שלבים מלוטשים, אשר הם הטוב ביותר מיושם בבקר תצוגה ייעודי או מחלקה למנהל.

בקשה למצלמה

לפני הגישה למצלמה, עליך לבקש רשות משתמשים. החל ב- iOS 10, עליך לכלול את המפתח של קובץ ה-EP2 שלך עם מיתר המסביר מדוע האפליקציה שלך צריכה את המצלמה. Permission מתבקשת באמצעות ההרחבה של FLT:3 Handle Both המקרים - מוענקת והכחשה - ועדכון UI בהתאם.

AVCaptureDevice.requestAccess(for: .video) { granted in
 if granted {
 // Configure and start the capture session
 } else {
 // Show an alert guiding the user to Settings
 }
}

יצירת AVCapturession

לאחר קבלת אישור, מיידית ל-FLT:5 ,5 ,התאמת את המצגת שלו כדי לשלוט באיכות הוידאו; עבור סריקת קודקוד, FLT:6 הוא ברירת מחדל טובה, אבל אתה יכול גם להשתמש ב-FLT 7 לעיבוד מהיר יותר.

let session = AVCaptureSession()
session.sessionPreset = .high

הוספת המצלמה Input

קבל את מכשיר הווידאו ברירת המחדל (המצלמה האחורית) וליצור כרך 9 (אם לא ניתן להוסיף את הקלט לפגישה (למשל, המכשיר עסוק), לתפוס את השגיאה ולהציג משוב למשתמש.

guard let camera = AVCaptureDevice.default(for: .video) else { return }
do {
 let input = try AVCaptureDeviceInput(device: camera)
 guard session.canAddInput(input) else { return }
 session.addInput(input)
} catch {
 print("Camera input error: \(error.localizedDescription)")
}

תגית: Metadata Output

יצירת אירוע ההרחבה (FLT:11), קבע את נציגו (על תור סדרתי ייעודי), ולהוסיף אותו לפגישה.הנציב יקבל אובייקטים מטא-נתונים מזוהים.

let metadataOutput = AVCaptureMetadataOutput()
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
guard session.canAddOutput(metadataOutput) else { return }
session.addOutput(metadataOutput)

// Specify which code types to detect – must be done after the output is added
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128, .pdf417]

חשוב: יש לקבוע לאחר שהתפוקה תוספה לפגישה.

החל את הישיבה

הפעל את הפגישה על חוט רקע כדי לשמור על UIתגובה. Call (FLT:14) ברקע לשלוח תור או על תור סדרתי ייעודי.

DispatchQueue.global(qos: .userInitiated).async {
 session.startRunning()
}

יישום שיטת Delegate

(ב) ,השיטה (בפרק: ⁇ ⁇ ) היא ⁇ (ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

func metadataOutput(_ output: AVCaptureMetadataOutput,
 didOutput metadataObjects: [AVMetadataObject],
 from connection: AVCaptureConnection) {
 // Process only the first detected code (most common pattern)
 guard let metadataObject = metadataObjects.first,
 let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject,
 let stringValue = readableObject.stringValue else { return }

 // Use the scanned value (e.g., display, validate, or send to server)
 handleScannedCode(stringValue, type: readableObject.type)
}

זה נפוץ לעצור את הפגישה לאחר סריקה מוצלחת כדי למנוע גילויים חוזרים.קראת 'FLT:20 לאחר טיפול בקוד, ולחדש אותו כאשר המשתמש מאמת את הסורק.

קודים מקודדים

ברגע שיש לך ערך מיתר, לקבוע מה פעולה לנקוט בהתבסס על סוג הקוד והתוכן.תרחישים נפוצים כוללים:

  • (ב) ,0URLsigFLT:1 - נפתח בספאם או בדפדפן ללא השגה (בשיתוף: ).
  • (ב) ,0) אישורי Wi-FieurFLT:1 - עיין בתבנית הסטנדרטית (FreaLT:22) ולחבר באופן מתודולוגי (requires Anothertitlement).
  • (ב) עיין ב-[[1924]] ב[[1924]], ב[[1924]], ב[[1924]], ב[[1924]], [[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]
  • (ב) עיין ב-[[1924]], [[1924]], [[1924]]]] ו[[1924]] ו[[1924]]]] ו[[1924]], [[1924]]]]
  • (ב) ויקרא י"א: ויקרא י"ד): "הציגו באזהרה או העתק לראיון.

לכל סוג קוד, לאמת את המיתרים לפני עיבוד.יש להתעלם מהקודים הזדוניים או לדיווח בחסד.

Best Practices for Scanning Performance

כדי להבטיח סריקה חלקה ויעילה, בצע את ההנחיות האלה:

  • (FLT:0) סוגי האובייקטים של לימיט מטא-נתונים (Limit metadata Object types) 1hil – רק מאפשרים לפורמט הקוד שהאפליקציית שלך באמת צריכה.
  • (ב) [ה]התערות:0] אזור של עניין (הראשונה ל-1,364 [ה] – השתמש ב-[[1924]] כדי להגדיר חלק קטן מהזנה של הסרטון שבו קודים צפויים.
  • (ב) ,0) ,Use the right videograviFLT:1 , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (FLT:0) למינוף תור סדרתי עבור צירי נספח 1:1 - בצע עיבוד כבד (למשל, חיפושי רשת) מהחוט הראשי כדי לשמור על תגובת UI.
  • (ב) ,0) ,הופנה ללפיד (ב) ל[[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]]
  • (FLT:0) תחילת סריקה לאחר טיפול ב- 1- לאחר סריקה מוצלחת, הפעל מחדש את הפגישה עם עיכוב קצר (למשל 1-2 שניות) כדי למנוע ניתוק מיידי של אותו קוד.

מתן משוב למשתמש

חווית סריקה טובה כוללת רמזים חזותיים ושמיעתיים.מיישם מנגנוני משוב אלה כדי להנחות את המשתמש:

  • (ב) ,0) ,[[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]
  • (ב) [ה]: [ה], [ה], [ה], [ה], [ה],], [ה], [ה'], [ה'],] כ'[ה'], [ה'], [ה'], [ה'[ה'], כ'[ה']'[ה']'[ה']']'[ה'[ה']']'[ה'[ה']']'[ה'[ה'[ה'[ה'[ה'[ה'[ה']'[ה']']']'[ה'[ה']'[ה'[ה']']']']']']'[ה'[ה'[ה'[ה']']']']']'[ה'[ה']']'[ה'[ה'[ה']']'[ה'[ה']']'[ה'[ה']'[ה']']'[ה']']'[ה'[ה'[ה'[ה'[
  • (ב) ,0) , נגן קול באמצעות שורת ההרחבה (FLT:29 עם טון קצר וחיובי כמו FLT:30 (צליל "דואר").
  • (ב) ויקרא י"ד: "ה' אלקים" (בראשית כ"ד)
  • (ב) ,0) ,Scan Zone GuideveFLT:1 - מציג מלבן רב עם מדריכים פינה כדי לעזור למשתמשים למקד את הקוד.

טעויות וצוק איתן

טיפול שגיאות Robust מבטיח הסורק שלך מתפוגג בחסד כאשר הדברים משתבשים.

  • (ב) עיין ב[[1924]] ב[[1924]] וב[[1924]]]] וב[[1924]]]] [[1924]]]], [[1924]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]
  • [ה]ה' [ה']: [ה'], [ה'], [ה'], [ה'], [ה'], [ה']'[ה]']'[ה']']
  • (ב) ,0) , כישלונות תצורה של תצורה של תצורה של תצורה של התפלגות (FLT: 1) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (FLT:0)Low Light orמטושטש תמונות מטושטשות: (FLT:1) - צמצום אזור זיהוי של עניין ולהבטיח את המצלמה אוטומטיפוקקוס מופעל.
  • (ב) ,0) ,לא ניתן לתמוך בסוגי קוד שאינם תומכים (FLT: 9) , רכוש ה-FLT:39 לא יכול לתמוך בכל הפורמטים על כל המכשירים.

בדיקות ברחבי מכשירים

ביצועי סריקת AVFoundation משתנים באופן משמעותי לאורך דורות של iPhone ו-iPad. בחנו את היישום שלכם:

  • מכשירים ישנים יותר (iPhone 6s, iPad Air 2) - אלה יש מעבדים איטיים יותר ועשויים להיאבק עם pressolution גבוה. השתמש ב-FLT:41 עבור איזון אופטימלי על חומרה ישנה.
  • מכשירים עם אופטיקה מצלמה שונה - אייפוןs עם טלפוט או מצלמות אולטרה-רחב יכול להתמקד אחרת.תמיד להשתמש במצלמה הרחבה ברירת המחדל עבור סריקת ברקוד.
  • סביבות אור נמוך - מבחן בתנאים דיים כדי להבטיח כי הסריקה תישאר גלויה ואת הלפיד הלפיד.
  • גדלים קוד שונים ונטיות - נסה קודים מ 1 ס"מ × 1 ס"מ מקלרים לכרזות גדולות, ואת הנוף מבחן לעומת סריקה דיוקן.

שיקולים מתקדמים

עבור יישומי ייצור, שקול הוספת תכונות כמו סריקה רציפה (אפשרות מספר קודים בפגישה אחת), או שילוב עם ARKit עבור עיכובים מציאות רבודה, אם אתה צריך לעבד קודים מתמונות עדיין (למשל, ספריית צילום), להשתמש ב-FLT:42 או FLT:43 ממסגרת החזון, אם כי AVFoundation הוא בדרך כלל מהיר יותר עבור וידאו בזמן אמת.

(ב) ל[[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]]]]

על ידי ביצוע ההנחיות הללו ובדיקה מעמיקה של היישום שלך, אתה יכול לספק ברקוד מלוטש, ביצועים גבוהים וסורק קוד QR אשר משפר את יכולת השימוש של אפליקציית iOS שלך ואת האמינות.