SwiftUI ——扫码

权限配置
在Info.plist文件中配置相机权限 Privacy - Camera Usage Description

创建一个类,实现了AVCaptureMetadataOutputObjectsDelegate 协议,用于处理扫描到的元数据对象;并做权限处理

//
//  ScannerViewModel.swift
//
//  Created by 123 on 2023/10/25.
//import Foundation
import AVFoundation
import SwiftUIclass ScannerViewModel: NSObject,ObservableObject, AVCaptureMetadataOutputObjectsDelegate {var scanSession:AVCaptureSession!var previewLayer: AVCaptureVideoPreviewLayer?@Published var lastQrCode: String = ""var scanPermission = 0// 初始设置func prepareScan() {do {self.scanSession = AVCaptureSession()self.previewLayer = AVCaptureVideoPreviewLayer(session: self.scanSession)self.previewLayer?.videoGravity = .resizeAspectFillguard let videoCaptureDevice = AVCaptureDevice.default(for: .video)else { return }let videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)if (self.scanSession.canAddInput(videoInput)) {self.scanSession.addInput(videoInput)} else {return}let metadataOutput = AVCaptureMetadataOutput()if (self.scanSession.canAddOutput(metadataOutput)) {self.scanSession.addOutput(metadataOutput)metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)metadataOutput.metadataObjectTypes = [.qr]} else {print("Could not add Metadata output.")return}} catch {print("Failed to initialize scanner.")}}func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {self.scanSession.stopRunning()if let metadataObject = metadataObjects.first {guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }guard let stringValue = readableObject.stringValue else { return }lastQrCode = stringValue// 这里可以获取扫描到的二维码内容print("QR Code Scanned: \(stringValue)")}}func showPermissionDeniedAlert() {guard let rootViewController = UIApplication.shared.windows.filter({$0.isKeyWindow}).first?.rootViewController else {return}let alertController = UIAlertController(title: "相机权限",message: "二维码扫描需要访问相机。请在设置中启用相机权限。",preferredStyle: .alert)alertController.addAction(UIAlertAction(title: "取消", style: .default) {_ inself.scanPermission = 2})alertController.addAction(UIAlertAction(title: "设置", style: .default) { _ inif let settingsUrl = URL(string: UIApplication.openSettingsURLString) {if UIApplication.shared.canOpenURL(settingsUrl) {UIApplication.shared.open(settingsUrl)}}})rootViewController.present(alertController, animated: true, completion: nil)}// 函数来检查权限并进行适当处理func checkPermissions() {switch AVCaptureDevice.authorizationStatus(for: .video) {case .authorized: // 用户已经授权self.prepareScan() // 继续设置扫描self.scanPermission = 1case .notDetermined: // 用户还没有决定// 请求权限AVCaptureDevice.requestAccess(for: .video) { granted inif granted {DispatchQueue.main.async {self.prepareScan() // 如果被授权,再次调用准备扫描的方法self.scanPermission = 1}}else{// 如果不允许,则可以在这里处理,如弹出界面提示用户self.scanPermission = 2}}case .denied, .restricted: // 用户被禁用或在家长控制下限制if(scanPermission != 2){// 弹出窗口告诉用户他们没有权限showPermissionDeniedAlert()}print("Camera permissions are either denied or restricted.")@unknown default:fatalError("Unknown status of camera authorization.")}}
}

2.实现UIViewRepresentable,展示扫描视频流 

//
//  QRScannerView.swift
//实现 UIViewRepresentable 协议,这是一个用于在 SwiftUI 中嵌入 UIKit 视图的抽象。结构体中包含一个 @ObservedObject 修饰的 ScannerViewModel 实例,使得视图可以对 ViewModel 的更改做出响应。
//  Created by 123 on 2023/10/25.
//import Foundation
import SwiftUI
import AVFoundation
struct QRScannerView: UIViewRepresentable {@ObservedObject var scannerViewModel: ScannerViewModelfunc makeUIView(context: Context) ->  UIView {let view = UIView(frame: CGRect.zero)DispatchQueue.main.async {//               调用 scannerViewModel.checkPermissions() 检查相机权限。self.scannerViewModel.checkPermissions()//               设置 preview layer 的 frame 为新 UIView 实例的边界,并将其添加到 UIView 的 layer 上。显示来自摄像头的视频流if let previewLayer = self.scannerViewModel.previewLayer {previewLayer.frame = view.layer.boundsview.layer.addSublayer(previewLayer)}if(self.scannerViewModel.scanPermission==1){self.scannerViewModel.scanSession.startRunning()}}return view}func updateUIView(_ view: UIView, context: Context) {if let previewLayer = scannerViewModel.previewLayer {previewLayer.frame = view.layer.bounds}}}

3.扫码页面

struct ScannerView:View{@StateObject var scannerViewModel = ScannerViewModel()let meetingViewModel:MeetingViewModelvar body: some View {ZStack {QRScannerView(scannerViewModel: scannerViewModel)if scannerViewModel.lastQrCode != "" {Text("Last scanned QR Code: \(scannerViewModel.lastQrCode)").foregroundColor(.white).padding().background(Color.black.opacity(0.7))}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/236657.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19

一些原理文章 卷积神经网络基础(卷积,池化,激活,全连接) - 知乎 PyTorch 入门与实践(六)卷积神经网络进阶(DenseNet)_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…

程序员养生之道:延寿不忘初心——延寿必备

文章目录 每日一句正能量前言如何养生饮食篇运动篇休息篇后记 每日一句正能量 现代社会已不是大鱼吃小鱼的年代,而是快鱼吃慢鱼的年代。 前言 在IT行业中,程序员是一个重要的职业群体。由于长时间的繁重编程工作,程序员们常常忽略了身体健康…

Maya 2024(3D建模、动画和渲染软件)

Maya 2024是一款非常强大的3D建模、动画和渲染软件,它提供了许多新功能和改进,以帮助建模师、动画师和渲染师更加高效地进行创作。 在建模方面,Maya 2024引入了Symmetry(对称)功能,可以在网格两侧生成均匀…

浅析什么是组态图和组态图设计

随着计算机技术和工业自动化水平迅速提高,而车间现场种类繁杂的控制设备和过程监控装置使得传统的工业控制软件无法满足用户的各种需求。在“组态”概念出现之前,工程技术人员需要通过编写程序来实现某一任务,不但工作量大、周期长&#xff0…

鸿蒙保存用户数据 preferences

保存用户数据 ArkTS9 保存用户数据,官方文档写的也比较想详细了,可以参考文档 不过真机运行的时候之前总是有问题,真机跑的当次设置之后再读取没有问题,不过要是在此运行的话,数据就没有了。困扰了好久,…

【opencv】计算机视觉基础知识

目录 前言 1、什么是计算机视觉 2、图片处理基础操作 2.1 图片处理:读入图像 2.2 图片处理:显示图像 2.3 图片处理:图像保存 3、图像处理入门基础 3.1 图像成像原理介绍 3.2 图像分类 3.2.1 二值图像 3.2.2灰度图像 3.2.3彩色图像…

如何应用DAP数据仓库

在当前的信息化建设背景下,企业数据的价值日益凸显,数据分析也越来越受到重视。数据分析通过整合和汇总数据,为企业制定战略、了解市场需求等方面提供强有力的支持。而通过对大量数据进行分析,能够真实、准确、清晰、有效地将企业…

第二证券:大盘震荡蓄势 存量资金博弈

在短期均线约束下,大盘出现轰动分化走势。 11月30日,沪指小幅低开后持续轰动,盘中反弹止步于30日均线,收盘小幅上涨。深成指表现则要弱于沪指,指数受5日均线快速下移约束,毕竟收出阴十字星。截至收盘&…

应用密码学期末复习(3)

目录 第三章 现代密码学应用案例 3.1安全电子邮件方案 3.1.1 PGP产生的背景 3.2 PGP提供了一个安全电子邮件解决方案 3.2.1 PGP加密流程 3.2.2 PGP解密流程 3.2.3 PGP整合了对称加密和公钥加密的方案 3.3 PGP数字签名和Hash函数 3.4 公钥分发与认证——去中心化模型 …

3D开发引擎HOOPS在建筑工程行业中的应用与影响

Tech Soft 3D在工程图形方面的历史可以追溯到90年代初,从一开始,建筑和施工行业就存在于我们的DNA中。最初,Tech Soft 3D因现在的HOOPS Visualize技术被收购,并于1996年从Autodesk公司分离出来,作为Autodesk公司以建筑…

天馈浪涌保护器行业应用解决方案

天馈浪涌保护器(天线信号防雷器)是一种用于保护同轴信号接口的电涌保护装置,它可以防止雷电感应或其他原因造成的暂态过电压对通信设备的损害,提高通信系统的可靠性和安全性。天馈浪涌保护器的作用原理和行业应用如下:…

1.自动化运维工具Ansible的安装

1.物料准备 四台服务器,其中一个是主控机,三个为host 2.安装 在主控机上安装ansible 2.1 设置EPEL仓库 Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。 yum install epel-release -y2.2 执行安装命令 yum i…