2014-09-22 19 views
9

Tôi đã tích hợp ứng dụng của mình với ZBar. Nó hoạt động hoàn hảo trong iOS 7.1 trở xuống, nhưng trong các thiết bị iOS 8.0 tôi thấy rằng chế độ xem máy ảnh được hiển thị đầu tiên bằng màu đen. Tuy nhiên, nếu tôi gửi ứng dụng về trạng thái nền và tôi sẽ gửi lại nền trước, có chế độ xem máy ảnh mở, sau đó nó hoạt động. Có ai có kinh nghiệm này?ZBar SDK và máy ảnh không hoạt động bình thường trong iOS 8

Cảm ơn

+0

Một trong những người dùng của tôi gặp vấn đề tương tự trên iphone 6. Bạn đã gửi báo cáo lỗi cho các nhà phát triển ZBar chưa? – nanako

+0

ZBar đang sử dụng mã 32 bit và chưa có ai chuyển chúng sang 64 bit. Đây là mã nguồn - lần commit cuối cùng là 2 năm trước - https://github.com/ZBar/ZBar. Nó hoạt động tốt trên iOS 6. Tôi có vấn đề này bản thân mình và tôi đang tìm kiếm một SDK thay thế - SDK bên thứ 3 miễn phí gần nhất là ZXING nhưng chúng cũng có vấn đề với 64 bit), Cho đến khi SDK của bên thứ ba được chuyển đến khả thi nhất tùy chọn là một trong những nhúng với IOS (xem dưới đây) nó sẽ cung cấp cho bạn khả năng quét mã QR và như một tiền thưởng PDF417 và mã Aztec tuy nhiên - hỗ trợ cho mã vạch 1D (UPC, CODE128, vv) quét không có – Paulo

+0

Tôi vừa thử phiên bản này của Zing trong IOS 8 - có vẻ như nó đang hoạt động - https://github.com/TheLevelUp/ZXingObjC – Paulo

Trả lời

0

Nếu bạn chỉ cần mã QR quét, nó dễ dàng hơn để làm điều này với phương tiện có nguồn gốc:

Trong .h của VC của bạn thêm:

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

Và trong. 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

Điều đó không trả lời câu hỏi – JSA986

+0

Nhưng bạn trả lời câu hỏi? @ JSA986 –

+2

Vì vậy, một câu trả lời không liên quan đến câu hỏi ban đầu là thích hợp hơn để không có câu trả lời? Bạn chưa trả lời câu hỏi của OP, Không có tham chiếu đến máy quét QR hoặc yêu cầu giải pháp khác. Câu hỏi là về 'Zbar'. Tôi không cần phải đăng câu trả lời cho nhận xét của mình để có bất kỳ câu trả lời ít liên quan hoặc chính xác hơn – JSA986

0

Điều này làm việc cho tôi với iOS 8

ZBarReaderViewController *reader = [ZBarReaderViewController new]; 
reader.readerDelegate = self; 
reader.supportedOrientationsMask = ZBarOrientationMaskAll; 
[self presentViewController:reader animated:YES completion:nil]; 
[reader viewWillAppear:NO];` 
Các vấn đề liên quan