¿Cómo puedo escanear códigos de barras en iOS?

¿Cómo puedo simplemente escanear códigos de barras en iPhone y / o iPad?

Producimos la aplicación 'Barcodes' para el iPhone. Puede descifrar códigos QR. El código fuente está disponible en el proyecto zxing ; específicamente, desea echar un vistazo al cliente de iPhone y al puerto parcial de C ++ de la biblioteca central . El puerto es un poco viejo, de aproximadamente la versión 0.9 del código Java, pero debería funcionar razonablemente bien.

Si necesita escanear otros formattings, como los formattings 1D, puede continuar con el puerto del código Java dentro de este proyecto a C ++.

EDITAR: Los códigos de barras y el código de iphone en el proyecto se retiraron a principios de 2014.

Echa un vistazo a ZBar lee el Código QR y los códigos ECN / ISBN y está disponible como bajo la licencia LGPL v2.

Al igual que con el lanzamiento de iOS7 ya no es necesario utilizar un marco externo o una biblioteca. El ecosistema de iOS con AVFoundation ahora es totalmente compatible con la exploración de casi todos los códigos de QR sobre EAN a UPC.

Solo eche un vistazo a la Nota técnica y la guía de progtwigción de AVFoundation. AVMetadataObjectTypeQRCode es tu amigo.

Aquí hay un bonito tutorial que lo muestra paso a paso: Biblioteca de escaneo de códigos QR iPhone iOS7

Solo un pequeño ejemplo sobre cómo configurarlo:

 #pragma mark - #pragma mark AVFoundationScanSetup - (void) setupScanner; { self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil]; self.session = [[AVCaptureSession alloc] init]; self.output = [[AVCaptureMetadataOutput alloc] init]; [self.session addOutput:self.output]; [self.session addInput:self.input]; [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode]; self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session]; self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill; self.preview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); AVCaptureConnection *con = self.preview.connection; con.videoOrientation = AVCaptureVideoOrientationLandscapeLeft; [self.view.layer insertSublayer:self.preview atIndex:0]; } 

La camera iPhone 4 es más que capabale de hacer códigos de barras. La biblioteca de código de barras del paso de cebra tiene un tenedor en github zxing-iphone . Es de código abierto.

liteqr es un "Lite QR Reader en Objective C portado de zxing" en github y tiene soporte para Xcode 4.

Hay dos bibliotecas principales:

  • ZXing una biblioteca escrita en Java y luego trasladada a Objective C / C ++ (solo código QR). Y se ha creado un otro puerto para ObjC, por TheLevelUp: ZXingObjC

  • ZBar es un software de código abierto para leer códigos de barras, basado en C.

De acuerdo con mis experimentos, ZBar es mucho más preciso y rápido que ZXing, al less en iPhone.

CÓMO: Agregar un lector de código de barras a una aplicación de iPhone , que apunta a ZBar iPhone SDK , parece útil ( de otro hilo ).

No estoy seguro si esto ayudará, pero aquí hay un enlace a una biblioteca de código QR de código abierto. Como puede ver, un par de personas ya lo han usado para crear aplicaciones para el iPhone.

Wikipedia tiene un artículo que explica qué son los códigos QR . En mi opinión, los códigos QR son mucho más adecuados para el propósito que el código de barras estándar en el que se refiere el iPhone ya que fue diseñado para este tipo de implementación.

Si el soporte para iPad 2 o iPod Touch es importante para su aplicación, elegiría un SDK de escáner de código de barras que puede descifrar códigos de barras en imágenes borrosas, como nuestro SDK escáner de códigos de barras para iOS y Android. La desencoding de imágenes de código de barras borrosas también es útil en teléfonos con cameras de enfoque automático porque el usuario no tiene que esperar a que el enfoque automático se inicie.

Scandit viene con un plan gratuito de precios para la comunidad y también tiene una API de producto que facilita la conversión de numbers de códigos de barras en nombres de productos.

(Descargo de responsabilidad: soy cofundador de Scandit)

Puede ver el código fuente del iPhone DataMatrix de Stefan Hafeneger ( proyecto de Google Code , publicación archivada del blog ) si todavía está disponible.

Hay otra opción para esto ahora si está abierto a licenciar un SDK. Consulte el SDK de RedLaser que funciona para UPCA / EAN13 con o sin autofoco. Recientemente actualizado.

Soy un fundador del inicio de visión por computadora que construyó este nuevo escáner, solo para su información.

El problema con la camera del iPhone es que los primeros models (de los cuales hay toneladas en uso) tienen una camera de enfoque fijo que no puede tomar fotografías enfocadas para distancias menores a 2 pies. Las imágenes son borrosas y distorsionadas y, si se toman a mayor distancia, no hay suficiente detalle / información del código de barras.

Algunas compañías han desarrollado aplicaciones para iPhone que pueden acomodarlas mediante el uso de tecnologías avanzadas de desenfoque. Esas aplicaciones que puedes encontrar en la tienda de aplicaciones de Apple: pic2shop, RedLaser y ShopSavvy. Todas las compañías han anunciado que también tienen SDK disponibles, algunas de ellas de forma gratuita o muy preferenceles, compruebe que salga uno.

Para un escáner de código de barras nativo iOS 7, eche un vistazo a mi proyecto en GitHub:

https://github.com/werner77/WECodeScanner

Aquí hay un código simple:

 func scanbarcode() { view.backgroundColor = UIColor.blackColor() captureSession = AVCaptureSession() let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) let videoInput: AVCaptureDeviceInput do { videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) } catch { return } if (captureSession.canAddInput(videoInput)) { captureSession.addInput(videoInput) } else { failed(); return; } let metadataOutput = AVCaptureMetadataOutput() if (captureSession.canAddOutput(metadataOutput)) { captureSession.addOutput(metadataOutput) metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code] } else { failed() return } previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); previewLayer.frame = view.layer.bounds; previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; view.layer.addSublayer(previewLayer); view.addSubview(closeBtn) view.addSubview(backimg) captureSession.startRunning(); } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func failed() { let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", prefernetworkingStyle: .Alert) ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) presentViewController(ac, animated: true, completion: nil) captureSession = nil } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) if (captureSession?.running == false) { captureSession.startRunning(); } } override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) if (captureSession?.running == true) { captureSession.stopRunning(); } } func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { captureSession.stopRunning() if let metadataObject = metadataObjects.first { let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject; AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) foundCode(readableObject.stringValue); } // dismissViewControllerAnimated(true, completion: nil) } func foundCode(code: String) { var createAccountErrorAlert: UIAlertView = UIAlertView() createAccountErrorAlert.delegate = self createAccountErrorAlert.title = "Alert" createAccountErrorAlert.message = code createAccountErrorAlert.addButtonWithTitle("ok") createAccountErrorAlert.addButtonWithTitle("Retry") createAccountErrorAlert.show() NSUserDefaults.standardUserDefaults().setObject(code, forKey: "barcode") NSUserDefaults.standardUserDefaults().synchronize() ItemBarcode = code print(code) } override func prefersStatusBarHidden() -> Bool { return true } override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { return .Portrait } 

A veces puede ser útil también para generar códigos QR . Hay una magnífica biblioteca C para esto que funciona como un encanto. Se llama libqrencode . Escribir una vista personalizada para mostrar el código QR no es tan difícil y se puede hacer con una comprensión básica de QuartzCore.

puede verificar que ZBarSDK lea códigos QR y códigos ECN / ISBN, es simple de integrar, intente con el siguiente código.

 - (void)scanBarcodeWithZBarScanner { // ADD: present a barcode reader that scans from the camera feed ZBarReaderViewController *reader = [ZBarReaderViewController new]; reader.readerDelegate = self; reader.supportedOrientationsMask = ZBarOrientationMaskAll; ZBarImageScanner *scanner = reader.scanner; // TODO: (optional) additional reader configuration here // EXAMPLE: disable rarely used I2/5 to improve performance [scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0]; //Get the return value from controller [reader setReturnBlock:^(BOOL value) { } 

y en didFinishPickingMediaWithInfo obtenemos el valor del código de barras.

  - (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info { // ADD: get the decode results id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; ZBarSymbol *symbol = nil; for(symbol in results) // EXAMPLE: just grab the first barcode break; // EXAMPLE: do something useful with the barcode data barcodeValue = symbol.data; // EXAMPLE: do something useful with the barcode image barcodeImage = [info objectForKey:UIImagePickerControllerOriginalImage]; [_barcodeIV setImage:barcodeImage]; //set the values for to TextFields [self setBarcodeValue:YES]; // ADD: dismiss the controller (NB dismiss from the *reader*!) [reader dismissViewControllerAnimated:YES completion:nil]; } 

Creo que esto se puede hacer usando AVFramework, aquí está el código de ejemplo para hacer esto

 import UIKit import AVFoundation class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { @IBOutlet weak var lblQRCodeResult: UILabel! @IBOutlet weak var lblQRCodeLabel: UILabel! var objCaptureSession:AVCaptureSession? var objCaptureVideoPreviewLayer:AVCaptureVideoPreviewLayer? var vwQRCode:UIView? override func viewDidLoad() { super.viewDidLoad() self.configureVideoCapture() self.addVideoPreviewLayer() self.initializeQRView() } func configureVideoCapture() { let objCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) var error:NSError? let objCaptureDeviceInput: AnyObject! do { objCaptureDeviceInput = try AVCaptureDeviceInput(device: objCaptureDevice) as AVCaptureDeviceInput } catch let error1 as NSError { error = error1 objCaptureDeviceInput = nil } objCaptureSession = AVCaptureSession() objCaptureSession?.addInput(objCaptureDeviceInput as! AVCaptureInput) let objCaptureMetadataOutput = AVCaptureMetadataOutput() objCaptureSession?.addOutput(objCaptureMetadataOutput) objCaptureMetadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) objCaptureMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode] } func addVideoPreviewLayer() { objCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: objCaptureSession) objCaptureVideoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill objCaptureVideoPreviewLayer?.frame = view.layer.bounds self.view.layer.addSublayer(objCaptureVideoPreviewLayer!) objCaptureSession?.startRunning() self.view.bringSubviewToFront(lblQRCodeResult) self.view.bringSubviewToFront(lblQRCodeLabel) } func initializeQRView() { vwQRCode = UIView() vwQRCode?.layer.borderColor = UIColor.networkingColor().CGColor vwQRCode?.layer.borderWidth = 5 self.view.addSubview(vwQRCode!) self.view.bringSubviewToFront(vwQRCode!) } func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { if metadataObjects == nil || metadataObjects.count == 0 { vwQRCode?.frame = CGRectZero lblQRCodeResult.text = "QR Code wans't found" return } let objMetadataMachineReadableCodeObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject if objMetadataMachineReadableCodeObject.type == AVMetadataObjectTypeQRCode { let objBarCode = objCaptureVideoPreviewLayer?.transformedMetadataObjectForMetadataObject(objMetadataMachineReadableCodeObject as AVMetadataMachineReadableCodeObject) as! AVMetadataMachineReadableCodeObject vwQRCode?.frame = objBarCode.bounds; if objMetadataMachineReadableCodeObject.stringValue != nil { lblQRCodeResult.text = objMetadataMachineReadableCodeObject.stringValue } } } }