iOS 7 前需依賴 ZBar/ZXing 第三方庫。iOS 7 引入 AVFoundation 原生支援,效能與靈敏度最優。
AVCaptureDeviceAVCaptureDeviceInputAVCaptureMetadataOutputsetMetadataObjectsDelegate:queue:AVCaptureSessionAVMetadataObjectTypeQRCodeAVCaptureVideoPreviewLayerrectOfInterest(正規化座標 0~1)startRunning// 1-3 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&error]; AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init]; // 4 [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; // 5-6 AVCaptureSession *session = [[AVCaptureSession alloc] init]; [session addInput:input]; [session addOutput:output]; // 7 [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]; // 8 AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session]; preview.frame = self.view.bounds; [self.view.layer insertSublayer:preview atIndex:0]; // 9 output.rectOfInterest = CGRectMake(0.2, 0.18, 0.6, 0.5); // x對應垂直、y對應水平 // 10 [session startRunning];
- (void)captureOutput:(AVCaptureOutput *)output
didOutputMetadataObjects:(NSArray *)metadataObjects
fromConnection:(AVCaptureConnection *)connection {
if (metadataObjects.count > 0) {
[session stopRunning];
AVMetadataMachineReadableCodeObject *obj = metadataObjects.lastObject;
self.resultString = obj.stringValue;
// 回調 delegate 或跳轉
}
}
文中提供完整 ScanQrcodeVController 實作,含掃描線動畫、生命週期管理、Delegate 回傳結果。