बारकोड और क्यूआर कोड स्कैनिंग के लिए AVFoundation को समझना

Apple का AVFoundation फ्रेमवर्क iOS उपकरणों पर ऑडियोविज़ुअल मीडिया के साथ काम करने के लिए एक पूर्ण-फीचर, निम्न-स्तरीय इंटरफ़ेस प्रदान करता है। बारकोड और क्यूआर कोड स्कैनिंग के लिए, ढांचा वर्ग को उजागर करता है, जो कैमरे के फीड से वास्तविक समय में मशीन-रीडेबल कोड की एक विस्तृत श्रृंखला का पता लगा सकता है। इसमें क्यूआर कोड, EAN-8/13, कोड 128, पीडीएफ417, Aztec और कई अन्य प्रारूप शामिल हैं। ढांचा छवि विश्लेषण और कोड डिकोडिंग की भारी उठाने को संभालता है, जिससे डेवलपर्स को कस्टम स्कैनिंग एल्गोरिदम को लागू करने के बजाय अनुप्रयोग लॉजिक पर ध्यान केंद्रित करने की अनुमति मिलती है।

AVFoundation स्कैनिंग हार्डवेयर आधुनिक उपकरणों पर त्वरित है, जो चुनौतीपूर्ण प्रकाश व्यवस्था की स्थिति में भी तेजी से और विश्वसनीय पता लगाने की पेशकश करता है। यह आगे और पीछे के दोनों कैमरों के साथ काम करता है, और प्रदर्शन और उपयोगकर्ता अनुभव को बेहतर बनाने के लिए पहचान क्षेत्र को ब्याज के एक विशिष्ट क्षेत्र में रोक दिया जा सकता है।

कैमरा कैप्चर सत्र की स्थापना

किसी भी AVFoundation आधारित स्कैनर का मूल है। यह वस्तु कैमरे के इनपुट से मेटाडाटा आउटपुट तक डेटा प्रवाह को ऑर्केस्ट्रेट करती है। सत्र की स्थापना के लिए कई बॉयलरप्लेट चरणों की आवश्यकता होती है, जो एक समर्पित व्यू नियंत्रक या प्रबंधक वर्ग में सबसे अच्छा कार्यान्वित होते हैं।

कैमरा अनुमति का अनुरोध

कैमरे तक पहुंचने से पहले, आपको उपयोगकर्ता अनुमति के लिए पूछना चाहिए। आईओएस 10 में शुरू होने से, आपको अपनी इन्फो.plist फ़ाइल में स्ट्रिंग के साथ ] कुंजी शामिल करने की आवश्यकता है, जिसके बारे में आपको यह बताने की आवश्यकता है कि आपके ऐप को कैमरे की आवश्यकता क्यों है। अनुमति का अनुरोध [[FLT: 3]]]]] का उपयोग करके किया जाता है। दोनों मामलों को संभाल लें - प्रदान किया गया और इनकार किया - और तदनुसार अपने यूआई को अपडेट करें।

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

AVCaptureSession बनाना

एक बार अनुमति दी जाती है, एक को तत्काल करें। वीडियो की गुणवत्ता को नियंत्रित करने के लिए अपने सत्र को पूर्व निर्धारित करें; बारकोड स्कैनिंग के लिए, एक अच्छा डिफ़ॉल्ट है, लेकिन आप तेजी से प्रसंस्करण के लिए ]] का भी उपयोग कर सकते हैं।

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]

महत्वपूर्ण: को सत्र में जोड़े जाने के बाद सेट किया जाना चाहिए। इससे पहले इसे सेट करना दुर्घटना का कारण होगा।

सत्र शुरू करना

यूआई उत्तरदायी रखने के लिए एक पृष्ठभूमि धागे पर सत्र चलाएं। पृष्ठभूमि प्रेषण कतार में या एक समर्पित सीरियल कतार पर कॉल ]।

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 – सफारी में खुला या एक इन-ऐप ब्राउज़र का उपयोग [[FLT: 21]]]].
  • Wi-Fi credentials] - मानक प्रारूप पार्स (]) और प्रोग्राममेटिक रूप से कनेक्ट (अतिरिक्त पात्रता की आवश्यकता)।
  • ]उत्पाद कोड - एक एपीआई के माध्यम से उत्पाद की जानकारी जैसे UPC डेटाबेस ] या अपनी खुद की सूची प्रणाली।
  • संपर्क जानकारी – Parse vCard या MeCard प्रारूपों और पते की पुस्तक में एक नया संपर्क बनाने के लिए।
  • Plain text – एक चेतावनी में प्रदर्शित या पेस्टबोर्ड को कॉपी करें।

प्रत्येक कोड प्रकार के लिए, प्रसंस्करण से पहले स्ट्रिंग को मान्य करें। विकृत या दुर्भावनापूर्ण कोड को कृपापूर्वक अनदेखा या सूचित किया जाना चाहिए।

स्कैनिंग प्रदर्शन के लिए सर्वश्रेष्ठ अभ्यास

यह सुनिश्चित करने के लिए कि चिकनी और कुशल स्कैनिंग इन दिशानिर्देशों का पालन करें:

  • ]Limit मेटाडाटा वस्तु प्रकार - केवल कोड प्रारूपों को वास्तव में जरूरत सक्षम बनाता है। हर अतिरिक्त प्रारूप प्रसंस्करण ओवरहेड जोड़ता है।
  • ]एक क्षेत्र के हित [ का प्रयोग ] वीडियो फीड के एक छोटे हिस्से को परिभाषित करने के लिए जहां कोड की उम्मीद है। यह नाटकीय रूप से पहचान गति को बेहतर बनाता है और झूठे सकारात्मकता को कम करता है।
  • ]] सही वीडियो गुरुत्वाकर्षण का उपयोग करें - कैमरा पूर्वावलोकन को आनुपातिक रखता है और स्कैन-क्षेत्र गाइड को ओवरले करने के लिए आदर्श है।
  • ]] - यूआई उत्तरदायी रखने के लिए मुख्य धागे से भारी प्रसंस्करण (जैसे नेटवर्क लुकअप) करें।
  • Consider मशाल समर्थन - उपयोगकर्ता को कम रोशनी परिदृश्य के लिए कैमरे के मशाल को टॉगल करने की अनुमति दें। ] की जाँच करें।
  • ]]] को संभालने के बाद रीसेट स्कैनिंग - एक सफल स्कैन के बाद, उसी कोड के तत्काल पुनः विवर्तन को रोकने के लिए सत्र को एक छोटी देरी (जैसे, 1-2 सेकंड) के साथ पुनः आरंभ करें।

उपयोगकर्ता प्रतिक्रिया प्रदान करना

एक अच्छा स्कैनिंग अनुभव में दृश्य और श्रवण क्यू शामिल हैं। उपयोगकर्ता को मार्गदर्शन करने के लिए इन फीडबैक तंत्रों को लागू करें:

  • ]Visual overlay - ]]]]] की संपत्ति का उपयोग करके पता चला कोड के आसपास एक हाइलाइट आयत तैयार करें। इसके लिए मेटाडाटा निर्देशांक को ] के माध्यम से निर्देशांक देखने के लिए परिवर्तित करने की आवश्यकता है।
  • ]Animation – जब एक कोड मान्यता प्राप्त है तो एक सूक्ष्म एनीमेशन (जैसे, एक सिकुड़ने वाली सीमा) चलायें।
  • ]Sound - [[FLT::29]]]] का उपयोग करके एक सिस्टम ध्वनि चलायें, जैसे कि ("मेल वाक्य" ध्वनि)] ("mail Sent" ध्वनि)] ("mail Sent" ध्वनि)]]] ]]]]]]] ]]]]] ]]]]]]]] ]]]]]]]]]]]]]]]] [[FLT: [[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
  • ]Haptic फीडबैक - एक सूक्ष्म कंपन के लिए या ] का उपयोग करें।
  • Scan क्षेत्र गाइड - उपयोगकर्ताओं को कोड को केंद्रित करने में मदद करने के लिए कोने गाइड के साथ एक पारभासी आयत प्रदर्शित करें।

त्रुटि हैंडलिंग और एज मामले

रॉबस्ट त्रुटि हैंडलिंग आपके स्कैनर को बेकार ढंग से खराब होने पर सुनिश्चित करता है।

  • Camera unavailable – जाँच ] और ]] डिवाइस पर. एक कैमरा के बिना iPod स्पर्श या सिम्युलेटर पर, एक सार्थक संदेश प्रस्तुत.
  • ]Permission denied – एक बटन के साथ एक चेतावनी दिखाएं जो सेटिंग्स को के माध्यम से खुलता है।
  • ]Session विन्यास विफलता - लॉग त्रुटियां जब [[FLT: 36]]] या [[FLT: 37]] रिटर्न [[FLT: 38]]]]. यह हो सकता है अगर किसी अन्य ऐप पृष्ठभूमि (दुर्लभ) में कैमरे का उपयोग कर रहा है।
  • ] कम प्रकाश या धुंधली छवियों - हित के पता लगाने के क्षेत्र को कम करें और कैमरा ऑटोफोकस को सक्षम बनाने के लिए सुनिश्चित करें। उपयोगकर्ता को प्रकाश बढ़ाने या डिवाइस को स्थिर करने के लिए प्रेरित करें।
  • ]]Invalid or unsupported code type – The ] संपत्ति सभी उपकरणों पर सभी प्रारूपों का समर्थन नहीं कर सकती है। का प्रयोग करें, ताकि सेटिंग से पहले संगतता को क्वेरी किया जा सके।

परीक्षण उपकरण

AVFoundation बारकोड स्कैनिंग प्रदर्शन iPhone और iPad की पीढ़ियों में काफी भिन्न होता है। अपने कार्यान्वयन का परीक्षण करें:

  • पुराने उपकरणों (iPhone 6s, आईपैड एयर 2) - इन धीमी प्रोसेसर है और उच्च संकल्प प्रीसेट के साथ संघर्ष कर सकते हैं। पुराने हार्डवेयर पर इष्टतम संतुलन के लिए का उपयोग करें।
  • विभिन्न कैमरा प्रकाशिकी के साथ उपकरण - टेलीफोटो या अल्ट्रा-वाइड कैमरे वाले iPhone अलग-अलग ध्यान केंद्रित कर सकते हैं। हमेशा बारकोड स्कैनिंग के लिए डिफ़ॉल्ट चौड़े कोण कैमरा का उपयोग करें।
  • कम रोशनी वातावरण - यह सुनिश्चित करने के लिए कि स्कैन ओवरले दिखाई देता है और मशाल टॉगल काम करता है, मंद स्थितियों में टेस्ट।
  • विभिन्न कोड आकार और अभिविन्यास - 1 सेमी × 1 सेमी स्टिकर से बड़े पोस्टर तक कोड आज़माएं, और परिदृश्य बनाम चित्र स्कैनिंग का परीक्षण करें।

उन्नत विचार

उत्पादन ऐप के लिए, निरंतर स्कैनिंग (एक सत्र में एकाधिक कोड की अनुमति), ज़ूम नियंत्रण, या एआरकेआईटी के साथ एकीकरण जैसी सुविधाओं को जोड़ने पर विचार करें, ताकि वास्तविकता ओवरले को बढ़ाने के लिए। यदि आपको अभी भी छवियों (जैसे, फोटो लाइब्रेरी) से कोड की प्रक्रिया की आवश्यकता है, तो या ]]]] का उपयोग विजन फ्रेमवर्क से करें, हालांकि AVFoundation आम तौर पर वास्तविक समय के वीडियो के लिए तेज़ है।

AVFoundation विन्यास में एक गहरी गोता के लिए, Apple के को एक कैप्चर सत्र गाइड और AVCaptureMetadataOutput प्रलेखन ]] में एक पूर्ण नमूना परियोजना भी मिल सकती है।

इन दिशानिर्देशों का पालन करके और अपने कार्यान्वयन का पूरी तरह से परीक्षण करके, आप एक पॉलिश, उच्च प्रदर्शन बारकोड और क्यूआर कोड स्कैनर प्रदान कर सकते हैं जो आपके आईओएस ऐप की उपयोगिता और विश्वसनीयता को बढ़ाता है।