2016-11-03 5 views
-4

Die Frage scheint etwas abstrakt zu sein, aber im Allgemeinen muss ich eine Barcode Scan App entwickeln, die mehrere Barcodes (bis zu 3) gleichzeitig erkennen kann Zeit. Kennt jemand eine gute API für die Aufgabe? (Schnelle oder objektive C ist OK). Jede Hilfe ist sehr zu schätzen! Vielen Dank. Ich habe bereits eine App mit Zxing API, aber es scheint keine Option zum Erkennen mehrerer Barcodes zu haben.IOS Barcode scannen api kann 3 Barcodes gleichzeitig lesen

Antwort

1

Sie benötigen AVFoundation! AVFoundation kann Barcodes scannen.

primäres Interesse an dieser Funktion:

#pragma mark - AVCaptureMetadataOutputObjectsDelegate methods 
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { 
//THIS YOU CAN USE ARRAY OF AVMetadataObjectType 
    NSString *supportedBarcodeType = AVMetadataObjectTypeCode128Code; 

    for (AVMetadataObject *barcodeMetadata in metadataObjects) { 
     if ([barcodeMetadata.type isEqualToString:supportedBarcodeType]) { 
      AVMetadataMachineReadableCodeObject *barcodeObject = (AVMetadataMachineReadableCodeObject *)[self.captureLayer transformedMetadataObjectForMetadataObject:barcodeMetadata]; 
     //barcode is FIND! 
      NSString *capturedBarcode = [barcodeObject stringValue]; 

      return; 
     } 
    } 
} 

Konfigurationsmethode:

static char * const metadataOutputQueue = "metadataOutputQueue"; 

- (void)configureSessionWithError:(NSError **)error {  

    self.captureSession = [[AVCaptureSession alloc] init]; 

    NSError *inputError = nil; 
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&inputError]; 

    if (nil != inputError || nil == input) { 
     *error = inputError; 
     return; 
    } 

    [self.captureSession addInput:input]; 

    AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; 
    [self.captureSession addOutput:captureMetadataOutput]; 

    dispatch_queue_t dispatchQueue = dispatch_queue_create(metadataOutputQueue, NULL); 
    [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue]; 
//THIS YOU CAN ADD ARRAY OF AVMetadataObjectType FOR DETECTING BARCODES 
    [captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeCode128Code]]; 

    self.captureLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; 
    [self.captureLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
    [self.captureLayer setFrame:self.cameraPreviewView.layer.bounds]; 

    [self.cameraPreviewView.layer addSublayer:self.captureLayer]; 

    self.sessionConfigured = YES; 
} 

Technical Note this! Tutorial finden Sie unter this site

+0

Vielen Dank für Ihre Hilfe. Ich lese das Tutorial und den Quellcode durch. Aber ein Problem zu lösen ist die Fähigkeit, mehrere Barcodes gleichzeitig zu lesen (bis zu 3) (3 Barcodes in 1 Zeile). Können wir das irgendwie erreichen? –

+0

In captureOutput: didOutputMetadataObject: Ich denke, Sie können 3 Barcodes fangen. Aber du solltest die Rückkehr entfernen; nachdem der erste Barcode gescannt wurde. Und müssen andere Szenario für andere Barcode behandeln. –

+0

scheint das Tutorial kann nur QR fangen. Wie können wir sowohl QR als auch Barcode erfassen? (1D und 2D ...)? –