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
Nguồn
2014-11-05 13:42:31
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
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
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