Cómo utilizar la biblioteca ZXing en iOS
Pasos de integración
Primero, vaya a Google Code o Github para descargar el código ZXing. Todo el proyecto es relativamente grande y solo necesitamos involucrar la parte de iOS, así es. Lo mejor es hacer algunos cortes. En pocas palabras, solo necesitamos conservar las dos carpetas cpp y iphone y eliminar el resto. Como se muestra en la siguiente figura:
Luego continuamos cortando para el directorio cpp, solo se conserva el contenido debajo de cpp/core/src/zxing y el contenido restante también se puede eliminar. Pero toda la estructura del directorio debe permanecer sin cambios. Después del corte, toda la estructura del directorio es la siguiente:
A continuación, movemos el directorio zxing cortado al directorio del proyecto iOS y arrastramos el archivo ZXingWidget.xcodeproj en la imagen de arriba al proyecto iOS.
A continuación, debemos configurar las dependencias entre el proyecto ZXing y el proyecto iOS original. En la configuración del proyecto iOS, haga clic en la pestaña Fases de compilación y agregue Dependencias de destino y Binarios de enlace, luego agregue estas dependencias del marco:
a.AVFoundation b. g. AddressBookUI
El último paso es agregar las siguientes 2 rutas de búsqueda de información de encabezado en la configuración:
./zxing/iphone/ZXingWidget/Classes
./zxing/cpp/core/src
Cabe señalar que la primera ruta debe configurarse para recorrer los subdirectorios, mientras que la segunda ruta no es necesaria, como se muestra en la siguiente figura:
Felicitaciones, después de completar este paso, ha completado la integración de la biblioteca ZXing. Hablemos sobre cómo utilizar la biblioteca ZXing para el reconocimiento de códigos QR.
Reconocimiento de códigos QR
La versión iOS de ZXing proporciona dos métodos para el reconocimiento de códigos QR, el primero es relativamente simple y el segundo es más complejo. Utilicé el primer método al hacer demostraciones y el segundo método al desarrollar proyectos reales. Les presentaré estos dos métodos a continuación.
Utilice el primer método
ZXing proporciona directamente un controlador de vista para escanear códigos QR, a saber, ZXingWidgetController.
Cuando necesite utilizar el código de la interfaz, agregue dependencias de archivos:
1 2
#import ?#import
Cuando necesite escanear, simplemente llame al siguiente código:
1 2 3 4 5 6 7 8 9 10 11
- (IBAction)scanPressed: (id)sender { ?ZXingWidgetController * widController = [[ZXingWidgetController alloc] initWithDelegate : self showCancel: SÍ OneDMode: NO]; ?NSMutableSet * lectores = [[NSMutableSet alloc] init]; ?QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init]; * widController .readers = lectores; ?[lanzamiento de lectores]; ?[self presentModalViewController:widController animado:YES]; llamado:
1 2 3 4
@protocol ZXingDelegate - (void)zxingController: (ZXingWidgetController*)controlador didScanResult: (NSString *)resultado; *) controlador; @end
Utilice el método dos
La diferencia entre el método dos y el método uno es equivalente a la diferencia entre AVFoundation y UIImagePickerController. En pocas palabras, esto significa que usar el método dos es más engorroso que usar el método uno, pero obtienes más capacidades de personalización.
Al usar el método 2, debe usar AVFoundation para obtener la imagen en tiempo real devuelta por la cámara, luego convertirla en una UIImage y finalmente pasarla a la clase Decoder de ZXing para completar el reconocimiento del código QR. . #importar "TwoDDecoderResult.h".
#importar "QRCodeReader.h" ??- (void)viewDidLoad { ?// configurar lector de QR ?self.qrReader = [[NSMutableSet alloc ] init]; = [[QRCRodeReader alloc ] init]; ??// Función de devolución de llamada de AVFoundation - (void)captureOutput: (AVCaptureOutput *)captureOutput didOutputSampleBuffer: (CMSampleBufferRef)sampleBuffer fromConnection: (AVCaptureConnection *)connection { ?// El primer paso es sampleBuffer Convertir a UIImage ?UIImage *image= [self getCaptureImage:sampleBuffer] ?// El segundo paso, ¿utilizar el decodificador para identificar la imagen? Decoder *d = [[Decoder alloc] init]; ? d.delegate = self; ?self.scanningQR = [d decodeImage: image] = ? = YES ?NO: YES }
La clase Decoder de ZXing proporciona la siguiente función de devolución de llamada. resultado:
p>
1 2 3 4 5 6 7 8 9 10
@protocol DecoderDelegatelt;lt;/spangt;NSObjectgt; @ opcional - (void)decodificador: (void)decodificador: (Decoder *) decodificador willDecodeImage: (UIImage *)imagen usandoSubconjunto: (UIImage *)subconjunto; - (void)decodificador: (Decoder *)decodificador didDecodeImage: (UIImage *)imagen usandoSubconjunto: (UIImage *)subconjunto conResultado: (TwoDDecoderResult *)resultado {? NSLog(@"resultado = @", [texto del resultado]); } ?- (void)decodificador: (Decodificador *)decodificador fallóToDecodeImage: (UIImage *)imagen usandoSubconjunto: (UIImage *) motivo del subconjunto: (NSString *) motivo; - (void) decodificador: (Decodificador *) decodificador encontradoPossibleResultPoint: (CGPoint) punto;@end
Consejos para solucionar problemas
I Encontré algunos problemas durante el uso, principalmente un problema de compilación.
Uno de los problemas es que no encuentro el archivo de cabecera.
La solución es: cambiar la extensión del archivo fuente utilizado en ZXing de .m a .mm.
Error: Solución: cambie uno de los parámetros de destino de compilación de ZXingWidget de "Construir solo arquitectura activa" a "NO".
Error: No existe tal archivo o directorio (no existe tal archivo o directorio), este error puede deberse a que su Ruta de búsqueda de encabezado (ruta de búsqueda de encabezado) es incorrecta o que la estructura de directorios de su biblioteca Zxing es diferente de mío Si el énfasis anterior no coincide, verifíquelo.
Si necesitas generar códigos QR para realizar pruebas, te recomiendo un buen sitio web para generar códigos QR en línea: http://cli.im/
Con problemas de compatibilidad con ZXing y OpenCV
Las bibliotecas iOS de ZXing 2.1 y OpenCV 2.4.3 tienen algunos problemas de compatibilidad porque tienen algunos requisitos sobre la versión de la biblioteca estándar C y la versión del compilador. Alguien en Stackoverflow finalmente encontró una manera de hacerlos coexistir pacíficamente, pero solo funciona en iOS 5.0 o superior. Da la casualidad de que nuestra aplicación sólo es compatible con iOS 5.0 y superior, lo que resuelve este problema. Entonces, si usted también encuentra este problema, puede consultar esta publicación de blog.