iOS
QR कोड स्कैनर
खोज…
परिचय
क्यूआर (क्विक रिस्पांस) कोड दो-आयामी बारकोड हैं जो मशीन-पठनीय ऑप्टिकल लेबल पर व्यापक रूप से उपयोग किए जाते हैं। iOS 7 के बाद से AVFoundation
ढांचे का उपयोग करके QR कोड पढ़ने का एक तरीका प्रदान करता है। यह ढांचा कैमरे को एपीआई / सेटअप करने और कैमरा फीड से क्यूआर कोड पढ़ने के लिए सेट प्रदान करता है।
UIViewController QR के लिए स्कैनिंग और वीडियो इनपुट प्रदर्शित करना
import AVFoundation
class QRScannerViewController: UIViewController,
AVCaptureMetadataOutputObjectsDelegate {
func viewDidLoad() {
self.initCaptureSession()
}
private func initCaptureSession() {
let captureDevice = AVCaptureDevice
.defaultDevice(withMediaType: AVMediaTypeVideo)
do {
let input = try AVCaptureDeviceInput(device: captureDevice)
let captureMetadataOutput = AVCaptureMetadataOutput()
self.captureSession?.addOutput(captureMetadataOutput)
captureMetadataOutput.setMetadataObjectsDelegate(self,
queue: DispatchQueue.main)
captureMetadataOutput
.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
self.videoPreviewLayer =
AVCaptureVideoPreviewLayer(session: self.captureSession)
self.videoPreviewLayer?
.videoGravity = AVLayerVideoGravityResizeAspectFill
self.videoPreviewLayer?.frame =
self.view.layer.bounds
self._viewController?.view.layer
.addSublayer(videoPreviewLayer!)
self.captureSession?.startRunning()
} catch {
//TODO: handle input open error
}
}
private func dismissCaptureSession() {
if let running = self.captureSession?.isRunning, running {
self.captureSession?.stopRunning()
}
self.captureSession = nil
self.videoPreviewLayer?.removeFromSuperLayer()
self.videoPreviewLayer = nil
}
func captureOutput(_ captureOutput: AVCaptureOutput,
didOutputMetadataObjects metadataObjects: [Any]!,
from connection: AVCaptureConnection) {
guard metadataObjects != nil && metadataObjects.count != 0 else {
//Nothing captured
return
}
if let metadataObj =
metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
guard metadataObj.type == AVMetadataObjectTypeQRCode else {
return
}
let barCodeObject = videoPreviewLayer?
.transformedMetadataObject(for:
metadataObj as AVMetadataMachineReadableCodeObject)
as! AVMetadataMachineReadableCodeObject
if let qrValue = metadataObj.stringValue {
self.handleQRRead(value: qrValue)
}
}
}
private handleQRRead(value: String) {
//TODO: Handle the read qr
}
private captureSession: AVCaptureSession?
private videoPreviewLayer: AVCaptureVideo
}
handleQRRead
- एक सफल स्कैन initCaptureSession
पर कॉल किया जाएगा - QR और कैमरा इनपुट dismissCaptureSession
लिए स्कैनिंग को प्रारंभ initCaptureSession
- कैमरा इनपुट dismissCaptureSession
और स्कैनिंग बंद करें
AVFoudation फ्रेमवर्क के साथ QR कोड को स्कैन करना
IOS 7 से पहले जब आप एक QR कोड स्कैन करना चाहते हैं, तो हमें zBar या zXing जैसी थर्ड पार्टी फ्रेमवर्क या लाइब्रेरी पर निर्भर रहने की आवश्यकता हो सकती है। लेकिन Apple ने बारकोड पढ़ने के लिए iOS 7 से AVCaptureMetaDataOutput
शुरुआत की।
का उपयोग कर QR कोड को पढ़ने के लिए AVFoundation
हम सेटअप की जरूरत है / बनाने AVCaptureSession
और प्रयोग captureOutput:didOutputMetadataObjects:fromConnection:
प्रतिनिधि विधि।
चरण 1
आयात AVFoundation
ढांचे और करने के लिए की पुष्टि AVCaptureMetadataOutputObjectsDelegate
प्रोटोकॉल
import AVFoundation class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate
चरण 2
QR कोड रीडिंग पूरी तरह से वीडियो कैप्चर पर आधारित है। तो निरंतर वीडियो पर कब्जा करने के लिए एक AVCaptureSession
बनाएँ और डिवाइस इनपुट और आउटपुट सेट करें। नीचे दिए गए कोड को व्यू कंट्रोलर viewDidLoad
विधि में जोड़ें
// Create an instance of the AVCaptureDevice and provide the video as the media type parameter. let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) do { // Create an instance of the AVCaptureDeviceInput class using the device object and intialise capture session let input = try AVCaptureDeviceInput(device: captureDevice) captureSession = AVCaptureSession() captureSession?.addInput(input) // Create a instance of AVCaptureMetadataOutput object and set it as the output device the capture session. let captureMetadataOutput = AVCaptureMetadataOutput() captureSession?.addOutput(captureMetadataOutput) // Set delegate with a default dispatch queue captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) //set meta data object type as QR code, here we can add more then one type as well captureMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode] // Initialize the video preview layer and add it as a sublayer to the viewcontroller view's layer. videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill videoPreviewLayer?.frame = view.layer.bounds view.layer.addSublayer(videoPreviewLayer!) // Start capture session. captureSession?.startRunning() } catch { // If any error occurs, let the user know. For the example purpose just print out the error print(error) return }
चरण 3
QR कोड को पढ़ने के लिए AVCaptureMetadataOutputObjectsDelegate
प्रतिनिधि पद्धति को लागू करें
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { // Check if the metadataObjects array contains at least one object. If not no QR code is in our video capture if metadataObjects == nil || metadataObjects.count == 0 { // NO QR code is being detected. return } // Get the metadata object and cast it to `AVMetadataMachineReadableCodeObject` let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject if metadataObj.type == AVMetadataObjectTypeQRCode { // If the found metadata is equal to the QR code metadata then get the string value from meta data let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) if metadataObj.stringValue != nil { // metadataObj.stringValue is our QR code } } }
यहां मेटाडेटा ऑब्जेक्ट आपको कैमरा फीड पर क्यूआर कोड की सीमा को पढ़ सकता है। सीमा को प्राप्त करने के लिए बस मेटाडेटा ऑब्जेक्ट को videoPreviewLayer
के transformedMetadataObject
। नीचे दिए गए तरीके को videoPreviewLayer
।
let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) qrCodeFrameView?.frame = barCodeObject!.bounds