zoukankan      html  css  js  c++  java
  • 扫一扫 功能

    - (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];   
            });   
        });   
    }

    在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]) {   
            //如果扫出来的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);   
          //对uid进行操作   
      } else {   
          //其他的地方抛过来的url,比如微信   
          return [WXApi handleOpenURL:url delegate:self];   
      }   
      return YES;   
    }
  • 相关阅读:
    Android学习笔记安卓基础知识
    V8编程1
    dfdf
    NodeJS沙箱
    CGI编程cgihtml库简析
    dsfdsf
    Android学习笔记获取屏幕大小
    Android学习笔记AndroidManifest.xml配置文件详解
    HTTP状态码解析
    简易c++版本日志库
  • 原文地址:https://www.cnblogs.com/jinlianglu/p/6411465.html
Copyright © 2011-2022 走看看