2014-09-22 24 views
9

Mam zintegrowaną aplikację z ZBar. Działa doskonale w iOS 7.1 i poniżej, ale na urządzeniach z iOS 8.0 stwierdzam, że widok z kamery jest najpierw wyświetlany na czarno. Jeśli jednak wyślę aplikację do stanu w tle i ponownie wyślę ją na pierwszy plan, po otwarciu widoku kamery, to działa. Czy ktoś tego doświadczył?ZBar SDK i kamera nie działa poprawnie w systemie iOS 8

Dzięki

+0

Jeden z moich użytkowników to ten sam problem na iPhone 6. Czy przesłaliście raport o błędzie do programistów ZBar? – nanako

+0

ZBar używa 32-bitowego kodu i nikt jeszcze ich nie przeportował na 64-bitowe. Oto kod źródłowy - ostatnie zatwierdzenie było 2 lata temu - https://github.com/ZBar/ZBar. Działa to dobrze na IOS 6. Mam ten problem sam i szukam zastępczego SDK - najbliższy darmowy SDK innej firmy jest ZXING, ale mają też problemy z 64-bitowym), Dopóki pakiety SDK innych producentów nie zostaną przeniesione na najbardziej opłacalne opcja jest wbudowana w IOS (patrz niżej) da ci możliwość skanowania kodów QR i jako bonus PDF417 i Aztec Codes jednak - obsługa kodów kreskowych 1D (UPC, CODE128, itp.) skanowanie tam nie ma – Paulo

+0

Właśnie próbowałem ta wersja Zing w IOS 8 - wydaje się działać - https://github.com/TheLevelUp/ZXingObjC – Paulo

Odpowiedz

0

Jeśli potrzebujesz tylko skanowanie QR Code, to znacznie łatwiej zrobić to z rodzimych środków:

W ncurses.h swojej VC dodać:

#import <AVFoundation/AVFoundation.h> 
@interface FEQRViewController : UIViewController <AVCaptureMetadataOutputObjectsDelegate> 

aw. m

@interface FEQRViewController() 

@property (nonatomic) BOOL isReading; 

@property (nonatomic, strong) AVCaptureSession *captureSession; 
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer; 

-(BOOL)startReading; 

-(void)stopReading; 

@end 

@implementation FEQRViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.view.backgroundColor = ....; 


    self.isReading = NO; 
    self.captureSession = nil; 


    // Do any additional setup after loading the view from its nib. 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    if (!self.isReading) { 
     if ([self startReading]) { 
      //[self.startButton setTitle:@"Stop" forState:UIControlStateNormal]; 
      [self.statusLabel setText:@"Scanning for QR Code..." ]; 
     } 
    } 
    else{ 
     [self stopReading]; 
     [self.startButton setTitle:@"Start!" forState:UIControlStateNormal]; 
    } 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


-(BOOL)startReading 
{ 
    NSError *error; 
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; 

    if (!input) { 
     NSLog(@"%@", [error localizedDescription]); 
     return NO; 
    } 

    self.captureSession = [[AVCaptureSession alloc] init]; 
    [self.captureSession addInput:input]; 

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

    dispatch_queue_t dispatchQueue; 
    dispatchQueue = dispatch_queue_create("myQueue", NULL); 
    [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue]; 
    [captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]]; 

    self.videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; 
    [self.videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
    [self.videoPreviewLayer setFrame:self.preview.layer.bounds]; 
    [self.preview.layer addSublayer:_videoPreviewLayer]; 

    [_captureSession startRunning]; 
    return YES; 
} 

-(void)stopReading 
{ 
    [self.captureSession stopRunning]; 

    self.captureSession = nil; 
    [self.videoPreviewLayer removeFromSuperlayer]; 

} 


-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ 
    if (metadataObjects != nil && [metadataObjects count] > 0) { 

     AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0]; 
     if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) { 
      [self.statusLabel performSelectorOnMainThread:@selector(setText:) withObject:[metadataObj stringValue] waitUntilDone:NO]; 
      NSURL *url = [NSURL URLWithString:[metadataObj stringValue]]; 
      if (url) 

       [self performSelectorOnMainThread:@selector(goToURL:) withObject:url waitUntilDone:NO]; 

      [self performSelectorOnMainThread:@selector(stopReading) withObject:nil waitUntilDone:NO]; 
      //[self.startButton performSelectorOnMainThread:@selector(setTitle:) withObject:@"Start!" waitUntilDone:NO]; 
      _isReading = NO; 
     } 
    } 
} 

-(void)goToURL:(NSURL *)url 
{ 
    //Handle URL... 
} 

- (IBAction)startButton:(id)sender { 

    if (!self.isReading) { 
     if ([self startReading]) { 
      [self.startButton setTitle:@"Stop" forState:UIControlStateNormal]; 
      [self.statusLabel setText:@"Scanning for QR Code..." ]; 
     } 
    } 
    else{ 
     [self stopReading]; 
     [self.startButton setTitle:@"Start!" forState:UIControlStateNormal]; 
    } 

    _isReading = !_isReading; 
} 

@end 
+0

To nie odpowiada na pytanie – JSA986

+0

Ale odpowiadasz na pytanie? @ JSA986 –

+2

Więc odpowiedź bez żadnego znaczenia dla pierwotnego pytania jest lepsza niż brak odpowiedzi? Nie odpowiedziałeś na pytanie OP, Nie było odniesienia do skanera QR ani prośba o inne rozwiązanie. Pytanie dotyczy 'Zbar'. Nie muszę publikować odpowiedzi, aby moje komentarze były mniej trafne lub poprawne – JSA986

0

To działa na mnie z iOS 8

ZBarReaderViewController *reader = [ZBarReaderViewController new]; 
reader.readerDelegate = self; 
reader.supportedOrientationsMask = ZBarOrientationMaskAll; 
[self presentViewController:reader animated:YES completion:nil]; 
[reader viewWillAppear:NO];`