Table of Contents
Κατανόηση AVFoundation για σάρωση κώδικα Barcode και QR
Το πλαίσιο AVFoundation της Apple παρέχει μια πλήρως εξοπλισμένη, χαμηλού επιπέδου διεπαφή για τη συνεργασία με οπτικοακουστικά μέσα σε συσκευές iOS. Για barcode και QR σάρωση κώδικα, το πλαίσιο εκθέτει την ] τάξη, η οποία μπορεί να ανιχνεύσει ένα ευρύ φάσμα μηχανογραφημένων κωδικών σε πραγματικό χρόνο από την τροφοδοσία της κάμερας. Αυτό περιλαμβάνει κωδικούς QR, EAN-8/13, Code 128, PDF417, Aztec, και πολλές άλλες μορφές. Το πλαίσιο χειρίζεται την βαριά ανύψωση της ανάλυσης εικόνας και αποκωδικοποίησης κώδικα, επιτρέποντας στους προγραμματιστές να επικεντρωθούν στη λογική της εφαρμογής και όχι στην εφαρμογή προσαρμοσμένων αλγορίθμων σάρωσης.
Η σάρωση AVFoundation είναι υλικό ⁇ επιταχυνόμενη σε σύγχρονες συσκευές, προσφέροντας γρήγορη και αξιόπιστη ανίχνευση ακόμα και σε δύσκολες συνθήκες φωτισμού. Λειτουργεί τόσο με μπροστινές όσο και με πίσω κάμερες, και η περιοχή ανίχνευσης μπορεί να περιοριστεί σε μια συγκεκριμένη περιοχή ενδιαφέροντος για τη βελτίωση της απόδοσης και της εμπειρίας του χρήστη.
⁇ της συνεδρίας σύλληψης φωτογραφικής μηχανής
Ο πυρήνας οποιουδήποτε ανιχνευτή με βάση το AVFoundation είναι ο . Αυτό το αντικείμενο ενορχηστρώνει τη ροή δεδομένων από την είσοδο της κάμερας στην έξοδο μεταδεδομένων. Η ρύθμιση της συνεδρίας απαιτεί αρκετά βήματα λεβήτων, τα οποία εφαρμόζονται καλύτερα σε μια ειδική τάξη ελεγκτή προβολής ή διαχειριστή.
Αιτούμαι άδεια φωτογραφικής μηχανής
Πριν από την πρόσβαση στην κάμερα, πρέπει να ζητήσετε άδεια χρήστη. Ξεκινώντας από το iOS 10, θα πρέπει να συμπεριλάβετε το κλειδί [[LFT:2] στο αρχείο Info.plist σας με μια συμβολοσειρά που εξηγεί γιατί η εφαρμογή σας χρειάζεται την κάμερα. Η άδεια ζητείται χρησιμοποιώντας [[LFT:3]]. Χειριστείτε και τις δύο περιπτώσεις ⁇ που χορηγούνται και απορρίπτονται ⁇ και ενημερώστε αναλόγως τον UI σας.
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
// Configure and start the capture session
} else {
// Show an alert guiding the user to Settings
}
}
Δημιουργία της AVCapSsion
Μόλις χορηγηθεί η άδεια, κάντε άμεση χρήση ενός . ⁇ της συνεδρίας του προκαθορισμένη για τον έλεγχο της ποιότητας του βίντεο.Για σάρωση barcode, είναι μια καλή προεπιλογή, αλλά μπορείτε επίσης να χρησιμοποιήσετε [[LFT:7]] για ταχύτερη επεξεργασία.
let session = AVCaptureSession()
session.sessionPreset = .high
Προσθήκη της εισόδου της φωτογραφικής μηχανής
Αποκτήστε την προεπιλεγμένη συσκευή βίντεο (την πίσω κάμερα) και δημιουργήστε ένα . Αν η είσοδος δεν μπορεί να προστεθεί στη συνεδρία (π.χ., η συσκευή είναι απασχολημένη), πιάστε το σφάλμα και παρουσιάστε ανατροφοδότηση στο χρήστη.
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)")
}
Προσθήκη της εξόδου μεταδεδομένων
Δημιουργήστε ένα παράδειγμα, που εκπρόσωπό του (σε μια ειδική σειρά ουρά), και προσθέστε το στη συνεδρία. Ο εκπρόσωπός θα λάβει τα αντικείμενα ανιχνευμένα μεταδεδομένα.
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 responsive. Καλέστε [[LFT:14]] σε μια ουρά αποστολής φόντου ή σε μια ειδική σειρά αναμονής.
DispatchQueue.global(qos: .userInitiated).async {
session.startRunning()
}
Εφαρμογή της κατ' εξουσιοδότηση μεθόδου
Η μέθοδος ανάθεσης καλείται όποτε ο ανιχνευτής ανιχνεύει έναν ή περισσότερους κωδικούς. Αυτή η μέθοδος λαμβάνει μια σειρά από περιπτώσεις, τις οποίες πρέπει να ⁇ τε σε για να αποκτήσετε πρόσβαση στην αποκωδικοποιημένη συμβολοσειρά.
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)
}
Είναι σύνηθες να σταματήσει η συνεδρία μετά από επιτυχή σάρωση για να αποτραπεί η επανειλημμένες ανιχνεύσεις. μετά το χειρισμό του κώδικα, και επανεκκινήστε τον όταν ο χρήστης επαναφέρει τον σαρωτή.
Χειρισμός Ανιχνευμένων Κωδικών
Μόλις έχετε την τιμή συμβολοσειράς, προσδιορίστε τι δράση πρέπει να πάρετε με βάση τον τύπο κώδικα και το περιεχόμενο.
- URLs ⁇ Άνοιγμα σε Safari ή σε πρόγραμμα περιήγησης σε εφαρμογή χρησιμοποιώντας .
- Αντιγραφές Wi ⁇ Fi ⁇ Ανάλυση της τυποποιημένης μορφής () και σύνδεση προγραμματικά (απαιτεί πρόσθετο δικαίωμα).
- Κωδικοί προϊόντος ⁇ Αναζήτηση πληροφοριών προϊόντος μέσω ενός API όπως η Βάση δεδομένων UPC ή το δικό σας σύστημα απογραφής.
- Πληροφορίες επικοινωνίας ⁇ Μορφές ανάλυσης vCard ή MeCard και δημιουργία νέας επαφής στο βιβλίο διευθύνσεων.
- Εικόνα κειμένου ⁇ Εμφάνιση σε ειδοποίηση ή αντίγραφο για επικόλληση πλακέτας.
Για κάθε τύπο κώδικα, επικυρώστε τη συμβολοσειρά πριν από την επεξεργασία. Οι λανθασμένοι ή κακόβουλοι κωδικοί θα πρέπει να αγνοούνται ή να αναφέρονται με χάρη.
Βέλτιστες πρακτικές για την ανίχνευση απόδοσης
Για να εξασφαλιστεί η ομαλή και αποτελεσματική σάρωση, ακολουθήστε τις παρούσες κατευθυντήριες γραμμές:
- Όριο τύπων αντικειμένων μεταδεδομένων ⁇ Μόνο ενεργοποιήστε τις μορφές κώδικα που χρειάζεται πραγματικά η εφαρμογή σας.
- Ορισμός περιοχής ενδιαφέροντος[ ⁇ Χρήση [] για τον καθορισμό ενός μικρού τμήματος της τροφοδοσίας βίντεο όπου αναμένονται κωδικοί. Αυτό βελτιώνει δραματικά την ταχύτητα ανίχνευσης και μειώνει τα ψευδώς θετικά.
- Χρησιμοποιήστε το σωστό βίντεο βαρύτητας ⁇ [[LFT:24]] διατηρεί την προεπισκόπηση της κάμερας αναλογική και είναι ιδανική για την επικάλυψη των οδηγών της περιοχής σάρωσης.
- Κλείσιμο σειράς αναμονής για εκχώρηση κλήσεων[ ⁇ Εκτέλεση βαριάς επεξεργασίας (π.χ., αναζήτηση δικτύου) από το κύριο νήμα για να κρατήσει το UI ανταποκρινόμενο.
- Σχετικά με την υποστήριξη δαυλών ⁇ Αφήστε το χρήστη να ενεργοποιήσει το φακό της κάμερας για σενάρια χαμηλού φωτισμού. Ελέγξτε πριν από την ανατίναξη.
- Επαναφορά σάρωσης μετά το χειρισμό[ ⁇ Μετά από επιτυχή σάρωση, επανεκκινήστε τη συνεδρία με μικρή καθυστέρηση (π.χ., 1 ⁇ 2 δευτερόλεπτα) για να αποτρέψετε την άμεση επαναπροσδιορισμό του ίδιου κώδικα.
Παροχή ανάδρασης χρήστη
Μια καλή εμπειρία σάρωσης περιλαμβάνει οπτικές και ακουστικές ενδείξεις.
- Οπτική επικάλυψη ⁇ Σχεδίαση ορθογωνίου επισήμανσης γύρω από τον ανιχνευθέντα κώδικα χρησιμοποιώντας την ιδιότητα . Αυτό απαιτεί τη μετατροπή συντεταγμένων μεταδεδομένων για την προβολή συντεταγμένων μέσω .
- Ανίχνευση ⁇ Παίξε ένα λεπτό animation (π.χ., ένα συρρικνούμενο σύνορο) όταν αναγνωρίζεται ένας κώδικας.
- Ηχοφωνητό ⁇ Παίξτε έναν ήχο συστήματος χρησιμοποιώντας με σύντομο, θετικό τόνο όπως (ο ήχος «Σημείωσης Ταχυδρομείου».
- ]Απτική ανατροφοδότηση ⁇ Χρήση ] ή για λεπτή δόνηση.
- Οδηγός περιοχής σάρωσης ⁇ Εμφάνιση ημιδιαφανούς ορθογωνίου με γωνιακούς οδηγούς για να βοηθήσουν τους χρήστες να κεντράρουν τον κώδικα.
Σφάλμα χειρισμού και περιπτώσεων άκρων
Ο χειρισμός boust σφαλμάτων εξασφαλίζει ότι ο σαρωτής σας υποβαθμίζεται με χάρη όταν τα πράγματα πάνε στραβά.
- Κάμερα μη διαθέσιμη ⁇ Έλεγχος ] και στη συσκευή. Στο άγγιγμα ή προσομοιωτή iPod χωρίς κάμερα, παρουσιάστε ένα σημαντικό μήνυμα.
- Αρνείται η άδεια ⁇ Εμφάνιση ειδοποίησης με κουμπί που ανοίγει ⁇ μέσω .
- Αποτυχία ρύθμισης της κατάστασης[ ⁇ Σφάλματα καταγραφής όταν ] ή επιστρέφει . Αυτό μπορεί να συμβεί αν μια άλλη εφαρμογή χρησιμοποιεί την κάμερα στο παρασκήνιο (σπάνια).
- Χαμηλό φως ή θολά εικόνες ⁇ Μειώστε την περιοχή ανίχνευσης που ενδιαφέρει και βεβαιωθείτε ότι η αυτόματη εστίαση της κάμερας είναι ενεργοποιημένη.
- Άκυροι ή μη υποστηριζόμενοι τύποι κωδικών ⁇ Η [[LFT:39]] ιδιότητα μπορεί να μην υποστηρίζει όλους τους τύπους σε όλες τις συσκευές. Χρησιμοποιήστε [[LFT:40]] για να διερωτηθείτε τη συμβατότητα πριν από τον ορισμό.
Δοκιμή σε όλες τις συσκευές
AVFoundation barcode σάρωση απόδοση ποικίλλει σημαντικά σε όλες τις γενιές του iPhone και iPad. Δοκιμάστε την εφαρμογή σας σε:
- Παλαιότερες συσκευές (iPhone 6s, iPad Air 2) ⁇ Αυτές έχουν πιο αργούς επεξεργαστές και μπορεί να αγωνίζονται με προεπιλογές υψηλής ανάλυσης. Χρησιμοποιήστε [[LFT:41]] για βέλτιστη ισορροπία σε παλιότερο υλικό.
- Συσκευές με διαφορετικές οπτικές κάμερες ⁇ iPhone με τηλεφωτογραφήσεις ή υπερευρεία κάμερες μπορεί να επικεντρώνονται διαφορετικά. Πάντα χρησιμοποιήστε την προεπιλεγμένη κάμερα ευρείας γωνίας για σάρωση barcode.
- Χαμηλό φως περιβάλλοντα ⁇ Δοκιμή σε αμυδρές συνθήκες για να εξασφαλιστεί η επικάλυψη σάρωσης παραμένει ορατή και η δάδα εναλλάσσεται.
- Διάφορα μεγέθη κώδικα και προσανατολισμούς ⁇ Δοκιμάστε κωδικούς από 1 cm × 1 cm αυτοκόλλητα σε μεγάλες αφίσες, και να δοκιμάσετε τοπίο έναντι της σάρωσης πορτραίτων.
Προχωρημένες Προσεγγίσεις
Για εφαρμογές παραγωγής, εξετάστε το ενδεχόμενο προσθήκης χαρακτηριστικών όπως συνεχής σάρωση (επιτρέποντας πολλαπλούς κωδικούς σε μία συνεδρία), ελέγχους ζουμ ή ενσωμάτωση με το ARKit για ενισχυμένες επικαλύψεις πραγματικότητας. Αν χρειαστεί να επεξεργαστείτε κώδικες από ακίνητες εικόνες (π.χ., βιβλιοθήκη φωτογραφιών), χρησιμοποιήστε [[LFT:42]] ή [[LFT:43]] από το πλαίσιο Vision, αν και το AVFoundation είναι γενικά ταχύτερο για βίντεο πραγματικού χρόνου.
Για μια βαθύτερη κατάδυση στη διαμόρφωση AVFoundation, ανατρέξτε στην Setting Up a Capture Session και στον AVCaptureMetadataEutput document[[LFT:3]]]. Μπορείτε επίσης να βρείτε ένα πλήρες δείγμα έργου στο [Scanning Barcodes with AVCaptureMetadataOutput[[LPT:5]]] άρθρο.
Ακολουθώντας αυτές τις οδηγίες και εξετάζοντας διεξοδικά την εφαρμογή σας, μπορείτε να παραδίδετε έναν γυαλισμένο, υψηλής απόδοσης barcode και έναν σαρωτή κώδικα QR που ενισχύει τη χρηστικότητα και την αξιοπιστία της εφαρμογής σας iOS.