在iOS7以后,用系统的AVFoundation做的二维码扫描器就能实现我们手机APP的扫一扫功能。
初始化相机,扫描器
- (
void)setupCamera
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^{
_device = [
AVCaptureDevice defaultDeviceWithMediaType:
AVMediaTypeVideo];
_input = [
AVCaptureDeviceInput deviceInputWithDevice:
self.device error:
nil];
_output = [[
AVCaptureMetadataOutput alloc]init];
[_output setMetadataObjectsDelegate:
self queue:dispatch_get_main_queue()];
_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];
}
_output
.metadataObjectTypes =@[
AVMetadataObjectTypeQRCode];
dispatch_async(dispatch_get_main_queue(), ^{
_preview =[
AVCaptureVideoPreviewLayer layerWithSession:
self.session];
_preview
.videoGravity =
AVLayerVideoGravityResizeAspectFill;
_preview
.frame =
self.view.bounds;
[
self.view.layer insertSublayer:
self.preview atIndex:
0];
[_session startRunning];
});
});
}
在viewWillAppear和viewWillDisappear里对session做优化。
-(
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]) {
}
用二维码扫描器扫别人的二维码
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:stringValue]];
直接使用openUrl系统自带的浏览器打开url就行,或者自己写个内置的浏览器打开。
用别人的扫描器扫自己的二维码
首先将自己的二维码定义成http://www.xxx.com/xxxxx这样的自己域名的url。 那么第三方的二维码扫出来后,会跳向这个网址。
其次在服务器上部署这个页面,加入如下的代码
<script language="javascript">
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {
var loadDateTime = new Date();
window.setTimeout(function() {
var timeOutDateTime = new Date();
if (timeOutDateTime - loadDateTime < 5000) {
window.location = "要跳转的页面URL";
} else {
window.close();
}
},
25);
window.location = " test:// ";
} else if (navigator.userAgent.match(/android/i)) {
var state = null;
try {
state = window.open("apps custom url schemes ", '_blank');
} catch(e) {}
if (state) {
window.close();
} else {
window.location = "要跳转的页面URL";
}
}
</script>
这段代码是基于url schemes的原理,如果你的app里存在这个url schemes(例子里是test://),那么会立刻打开这个url,如果不存在,就会超过25毫秒,那么就指向另一个页面,一般是下载页。
接着,在app的url schemes里设置,比如test
Paste_Image.png
这个时候,浏览器发出test://的请求的时候,就能立刻打开这个app了。
最后,如果不满足于扫描二维码只能打开app,想对二维码里的内容做一些操作的话,可以:
将二维码的内容定义成http://www.xxx.com/xxxxx?uid=xxx这样,当然后面的参数需要加密。在js代码里获取这个参数,并原封不动的附加在url schemes后面,如test://uid=xxx。在appDelegate里加上如下代码。 - (
BOOL)application:(
UIApplication *)application handleOpenURL:(
NSURL *)url
{
if ([url
.absoluteString hasPrefix:
@"test://uid="]) {
NSString *uid = [url
.absoluteString substringFromIndex:
11];
NSLog(
@"uid=%@",uid);
}
else {
return [WXApi handleOpenURL:url delegate:
self];
}
return YES;
}
转载请注明原文地址: https://ju.6miu.com/read-1303386.html