iOS开发 - 系统自带框架实现扫一扫功能

这篇具有很好参考价值的文章主要介绍了iOS开发 - 系统自带框架实现扫一扫功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

iOS 扫一扫

利用系统自带框架实现扫一扫功能

一 项目配置

扫一扫功能相机和相册权限,在info.plist中设置询问用户是否允许访问的权限。

info.plist加入NSCameraUsageDescription、NSPhotoLibraryUsageDescription、NSPhotoLibraryAddUsageDescription


	<key>NSCameraUsageDescription</key>
	<string>开启相机权限,活动扫一扫更快捷</string>
	<key>NSPhotoLibraryAddUsageDescription</key>
	<string>添加照片需要您的同意</string>
	<key>NSPhotoLibraryUsageDescription</key>
	<string>开启照片权限,美照当然要人赞!</string>

二 扫一扫权限判断

当每次进入扫一扫页面时,需要判断是否开启了权限


/** 校验是否有相机权限 */
- (void)checkCameraAuthorizationStatus:(void(^)(BOOL granted))permissionGranted
{
    AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    
    switch (videoAuthStatus) {
            // 已授权
        case AVAuthorizationStatusAuthorized:
        {
            permissionGranted(YES);
        }
            break;
            // 未询问用户是否授权
        case AVAuthorizationStatusNotDetermined:
        {
            // 提示用户授权
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
                permissionGranted(granted);
            }];
        }
            break;
            // 用户拒绝授权或权限受限
        case AVAuthorizationStatusRestricted:
        case AVAuthorizationStatusDenied:
        {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"请在”设置-隐私-相机”选项中,允许访问你的相机" message:nil delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
            [alert show];
            permissionGranted(NO);
        }
            break;
        default:
            break;
    }
}

三 需要用到AVCaptureDevice、AVCaptureDeviceInput、AVCaptureMetadataOutput、AVCaptureSession、AVCaptureVideoPreviewLayer

  • AVCaptureDevice:捕获设备,通常是前置摄像头,后置摄像头,麦克风(音频输入)
  • AVCaptureDeviceInput:AVCaptureDeviceInput 代表输入设备,使用AVCaptureDevice 来初始化
  • AVCaptureMetadataOutput:输出
  • AVCaptureSession:session 把输入输出结合在一起,并开始启动捕获设备(摄像头)
  • AVCaptureVideoPreviewLayer:图像预览层,实时显示捕获的图像

设置相机


/**
 设置相机
*/
- (void)setupCamera {
    self.avDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    self.avInput = [AVCaptureDeviceInput deviceInputWithDevice:self.avDevice error:nil];
    self.avOutput = [[AVCaptureMetadataOutput alloc]init];
    [self.avOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
    self.avSession = [[AVCaptureSession alloc]init];
    [self.avSession setSessionPreset:AVCaptureSessionPresetHigh];
    if ([self.avSession canAddInput:self.avInput]){
        [self.avSession addInput:self.avInput];
    }
    if ([self.avSession canAddOutput:self.avOutput]){
        [self.avSession addOutput:self.avOutput];
    }
    
    // 二维码类型 AVMetadataObjectTypeQRCode
    if ([self.avOutput.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeQRCode]){
        self.avOutput.metadataObjectTypes = [NSArray arrayWithObject:AVMetadataObjectTypeQRCode];
        // AVMetadataObjectTypeAztecCode 条形码
    } else{
        return ;
    }
    
    [self.avSession startRunning];//开始扫描
}

返回预览layer

/**
 显示的预览layer
 
 @return AVCaptureVideoPreviewLayer
 */
- (AVCaptureVideoPreviewLayer *)showPeviewLayer {
    self.avPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.avSession];
    self.avPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    return self.avPreviewLayer;
}


开始扫描与结束扫描

/**
 开始扫描
 */
- (void)startRunning {
    [self.avSession startRunning];
}

/**
 结束扫描
 */
- (void)stopRunning {
    [self.avSession stopRunning];
}


输出扫描结果AVCaptureMetadataOutputObjectsDelegate


#pragma mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:
(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    if ([metadataObjects count] > 0){
        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
        NSString *result = metadataObject.stringValue;//扫描出来的字符串
        NSLog(@"result:%@",result);
        
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"显示扫描结果" message:result delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
        [alert show];
        
        [self.avSession stopRunning];//停止扫描
    }
}

使用

	self.scanConfig = [[INQrScanConfig alloc] init];
        [self.scanConfig setupCamera];
        
        AVCaptureVideoPreviewLayer *previewLayer = [self.scanConfig showPeviewLayer];
        previewLayer.frame = self.layer.bounds;
        [self.layer insertSublayer:previewLayer atIndex:0];
        [self.scanConfig startRunning];

使用

//你要设置的矩形快的frame  为  x1, y1, w1, h1.
    //那么你的 rectOfInterest 应该设置为   (y1/h, x1/w, h1/h, w1/w)
    
    CGFloat size = 260.0;
    CGRect rect = CGRectMake((KAiSysScreenWidth - size)/2, (KAiSysScreenHeight - size)/2, size, size);
    // 使用 (y1/h, x1/w, h1/h, w1/w)
    self.avOutput.rectOfInterest = CGRectMake(rect.origin.y/KAiSysScreenHeight, rect.origin.x/KAiSysScreenWidth, size/KAiSysScreenHeight, size/KAiSysScreenWidth);

结果如图:
iOS开发 - 系统自带框架实现扫一扫功能,iphone开发,移动开发,Objective-c,ios,数码相机,扫一扫文章来源地址https://www.toymoban.com/news/detail-555465.html

到了这里,关于iOS开发 - 系统自带框架实现扫一扫功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue2移动端使用vue-qrcode-reader实现扫一扫功能

    移动端实现扫一扫   扫码功能 第一种:如果是用uniapp开发  可以直接使用uni的语法 并且兼容多端 第二种:如果是开发浏览器的网页,基于微信的话,也可以用微信的weixin-js-sdk         具体流程参考官网:概述 | 微信开放文档 第三种:用第三方vue-qrcode-reader实现扫一扫功能

    2024年02月07日
    浏览(37)
  • 微信小程序(扫一扫功能)

    最简单的扫一扫说明方法 问题 如何实现扫一扫功能? 如何添加手机中的图片文件进行扫码? 日常生活中,需要扫描二维码的地方随处可见,而如何让小程序实现扫一扫的功能呢?这就需要对js进行一个配置。 代码如下: 微信小程序的三大优势 1、开发时间短、成本低。 相

    2024年02月09日
    浏览(47)
  • 企业微信调用扫一扫接口安卓手机正常,iOS失败的解决办法

    在使用企业微信自建应用调用扫一扫接口的时候,安卓手机调用摄像头、扫码结果都可以正常使用,但是苹果手机的摄像头都调用不了,将返回参数打印出来也都是成功的。一直以为是代码哪里有错,才出现系统不兼容的问题,网上也找了好多解决方案,都没有效果,后来才

    2024年02月14日
    浏览(257)
  • 教你简单搞定小程序扫一扫以及生成普通二维码功能

    在生活中时常需要用小程序扫描识别相应的二维码(不包含小程序二维码),通过进入到相应的小程序,然后调起手机的相机进行扫一扫。那么将会更加方便简单的实现相应的功能。生成普通的二维码用weapp-qrcode.js来实现,识别二维码用wx.scanCode()或camera来实现,下面下面将

    2024年02月07日
    浏览(37)
  • VUE html5-qrcode H5扫一扫功能

    官方文档  html5-qrcode 安装   npm i html5-qrcode 1、新建一个组件  2、引入 3、获取摄像权限在created调用 4、获取扫码内容 5、必须在销毁页面前关闭扫码功能否则会报错   could not start video source 6、在扫码页面引用组件 组件完整代码 引用组件页面

    2024年02月16日
    浏览(51)
  • 实现微信扫一扫跳转到小程序指定页面

    使用场景:例如我们经常用到的共享充电宝,首先我们需要使用手机上的微信,打开微信扫一扫,扫描共享充电宝上的二维码,当我们扫描二维码后微信会直接跳转到小程序内的某个页面(不一定是首页)。像其他的一些共享设备也是一样的运行模式。那么怎么样才能通过微

    2024年02月02日
    浏览(68)
  • 【微信小程序系列:二】小程序常用功能:跳转地图、扫一扫、人脸识别、拍照、拨打电话、调整屏幕亮度、文字可复制、监听截屏...

    (~ ̄▽ ̄)~,hello,微信小程序系列第二篇,介绍下小程序里的 前端常用功能api ,可以快速copy使用~ 小程序页面里的文字默认是没有长按复制功能的,需要套个标签来实现:跳转官方文档 点击按钮,直接复制文本,直接调用微信方法: 有时显示一些地址需要在地图显示,

    2023年04月09日
    浏览(78)
  • 微信小程序扫一扫

    微信扫一扫有两种 1、wx.scanCode微信扫一扫,普通进入微信小程序需要微信公众平台进行配置 具体请看微信官方文档 扫普通链接二维码打开小程序 | 微信开放文档 微信扫一扫代码如下    button class=\\\"codeBut\\\" bindtap=\\\"scanBut\\\"扫码/button  scanBut(){          var that = this;    

    2024年02月10日
    浏览(62)
  • uniapp移动端——企业微信H5调用jssdk实现扫一扫,通过weixin-java-cp获取ticket签名,配置config

    背景: 使用企业微信开发扫一扫功能 可信域名验证  (1)企业微信的可信域名需要和企业微信的备案主体一致。 域名备案主体可通过站长工具查看域名备案主体。https://icp.chinaz.com/ 企业微信备案主体可以咨询管理员 (2)通过nginx配置域名归属验证txt文件 具体操作详见: htt

    2024年01月25日
    浏览(40)
  • 微信小程序通过扫一扫调用H5项目

    业务逻辑: 小程序为主体,外链一个H5项目,相当于在小程序webView几个页面及功能。 现需在小程序扫一扫点击事件触发后通过二维码生成的url跳转到H5项目相关页面 PS:二维码生成可查看这里 一、小程序 二、H5项目 PS:需求中遇到了这种情况,所以这里记录一下,方便自己的

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包