之前很多二维码扫描都是基于zxing做的,但是zxing用起来真的很麻烦,又一直不更新。随着iOS6退出历史舞台,终于可以使用iOS7以后,用系统的AVFoundation做的二维码扫描器了。
- (void)setupCamera
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗时的操作
// Device
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
// Input
_input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
// Output
_output = [[AVCaptureMetadataOutput alloc]init];
// [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
// Session
_session = [[AVCaptureSession alloc]init];
[_session setSessionPreset:AVCaptureSessionPresetHigh];
if ([_session canAddInput:self.input])
{
[_session addInput:self.input];
}
if ([_session canAddOutput:self.output])
{
[_session addOutput:self.output];
}
// 条码类型 AVMetadataObjectTypeQRCode
_output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
// Preview
_preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
_preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
// _preview.frame =CGRectMake(20,110,280,280);
_preview.frame = self.view.bounds;
[self.view.layer insertSublayer:self.preview atIndex:0];
// Start
[_session startRunning];
});
});
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (_session && ![_session isRunning]) {
[_session startRunning];
}
timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(animation1) userInfo:nil repeats:YES];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[timer invalidate];
}
以上timer是个扫描动画的计时器,可以略过不看。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
NSString *stringValue;
if ([metadataObjects count] >0)
{
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
stringValue = metadataObject.stringValue;
}
[_session stopRunning];
[timer invalidate];
NSLog(@"%@",stringValue);
}
NSString *url = [NSURL URLWithString:@"html/judgement.html" relativeToURL:[ZXApiClient sharedClient].baseURL].absoluteString;
if ([stringValue hasPrefix:url]) {
//如果扫出来的url是自己的域名开头的,那么做如下的处理。
}
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:stringValue]];
直接使用openUrl系统自带的浏览器打开url就行,或者自己写个内置的浏览器打开。
首先将自己的二维码定义成http://www.xxx.com/xxxxx
这样的自己域名的url。
那么第三方的二维码扫出来后,会跳向这个网址。
其次在服务器上部署这个页面,加入如下的代码
这段代码是基于url schemes的原理,如果你的app里存在这个url schemes(例子里是test://),那么会立刻打开这个url,如果不存在,就会超过25毫秒,那么就指向另一个页面,一般是下载页。
接着,在app的url schemes里设置,比如test
这个时候,浏览器发出test://
的请求的时候,就能立刻打开这个app了。
最后,如果不满足于扫描二维码只能打开app,想对二维码里的内容做一些操作的话,可以:
http://www.xxx.com/xxxxx?uid=xxx
这样,当然后面的参数需要加密。test://uid=xxx
。- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
if ([url.absoluteString hasPrefix:@"test://uid="]) {
NSString *uid = [url.absoluteString substringFromIndex:11];
NSLog(@"uid=%@",uid);
//对uid进行操作
} else {
//其他的地方抛过来的url,比如微信
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}