Xcode 9/Swift 4 AVCaptureMetadataOutput setMetadataObjectTypes 使用 availableMetadataObjectTypes

2024-04-23

似乎有很多与我遇到的问题类似的问题:

AVmetadata 随着 swift 4 xcode 9 的变化 https://stackoverflow.com/questions/46286332/avmetadata-changes-with-swift-4-xcode-9

AVCaptureMetadataOutput setMetadataObjectTypes 发现不支持的类型 https://stackoverflow.com/questions/31063846/avcapturemetadataoutput-setmetadataobjecttypes-unsupported-type-found

Apple 有一个与 AVFoundation 相关的 bug:

https://forums.developer.apple.com/thread/86810#259270 https://forums.developer.apple.com/thread/86810#259270

但这些似乎都不是我真正的答案。
我的代码在 swift 3 中运行得很好,但在 swift 4 中只会出错。使用上述链接中的解决方案不会导致任何变化。

Code:

import UIKit
import AVFoundation

class BarCodeScanViewController: UIViewController,     AVCaptureMetadataOutputObjectsDelegate {
weak var delegate: FlowControllerDelegate?

var captureSession: AVCaptureSession = AVCaptureSession()
var previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer()


override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = UIColor.black
    captureSession = AVCaptureSession()

    guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }
    let videoInput: AVCaptureDeviceInput

    do {
        videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
    } catch {
        return
    }

    if (captureSession.canAddInput(videoInput)) {
        captureSession.canAddInput(videoInput)
    } else {
        failed()

        return
    }

    // let captureMetadataOutput = AVCaptureMetadataOutput()
    let metadataOutput = AVCaptureMetadataOutput()

    if captureSession.canAddOutput(metadataOutput) {
        captureSession.addOutput(metadataOutput)

        // Check status of camera permissions
        metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
//            metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.upce]
        metadataOutput.metadataObjectTypes = [.ean8, .ean13, .pdf417, .upce]
    } else {
        failed()

        return
    }

    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    previewLayer.frame = view.layer.bounds
    previewLayer.videoGravity = .resizeAspectFill
    view.layer.addSublayer(previewLayer)

    captureSession.startRunning()
}

func failed() {
    let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .alert)
    ac.addAction(UIAlertAction(title: "OK", style: .default))

    present(ac, animated: true)

//        captureSession = nil
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if(captureSession.isRunning == false) {
        captureSession.startRunning()
    }
}

override func viewWillDisappear(_ animated: Bool) {
    if captureSession.isRunning == true {
        captureSession.stopRunning()
    }

    super.viewWillDisappear(animated)
}

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
    captureSession.stopRunning()

    if let metatdataObject = metadataObjects.first {
        guard let readableObject = metatdataObject as? AVMetadataMachineReadableCodeObject else { return }
        guard let stringValue = readableObject.stringValue else { return }
        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        found(code: stringValue)
    }

    dismiss(animated: true)
}

func found(code: String) {
    print(code)
}

override var prefersStatusBarHidden: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask     {
    return .portrait
}
}

当我在 Xcode 8 和 swift 3 中构建此代码时,它工作正常。当我在 Xcode 9 swift 4 中运行它时,它在添加媒体类型时崩溃:

metadataOutput.metadataObjectTypes = [.ean8, .ean13, .pdf417, .upce]

在这两种情况下,我都在构建之前没有测试版的 iOS 11 设备。

我尝试过“___”看看是否是上面提到的Apple bug。 如果我注释掉该行,代码就会运行,但没有捕获。

苹果是否还引入了其他一些错误?还有谁有相同的问题吗?

任何帮助,将不胜感激。

Thanks


有关清晰度的更多信息:

Leevi Graham 是正确的,而且苹果确实在没有适当文档的情况下更改了堆栈。这导致看起来好像存在错误。

Swift 4 上的条形码 https://stackoverflow.com/questions/46011211/barcode-on-swift-4/46027337#46027337

澄清对我有帮助的评论:

委托回调已更改为:

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!)

to

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection)

然而,我遇到的真正问题是你不再设置一长串类型来获取你的metadataObjectTypes。您现在只需设置所有可用类型:

metadataOutput.metadataObjectTypes = 
metadataOutput.availableMetadataObjectTypes

So ...

这实际上是一个 API 问题。为此提出了几个雷达问题。但 Apple 已经更改了他们的 AVFoundation 文档来解决这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xcode 9/Swift 4 AVCaptureMetadataOutput setMetadataObjectTypes 使用 availableMetadataObjectTypes 的相关文章

  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • TTTAttributedLabel 可点击截断标记

    我有一个 TTTAttributedLabel 并为其指定了一个自定义属性截断标记 NSAttributedString atributedTruncationToken NSAttributedString alloc initWithS
  • 使用 BGTaskScheduler 进行后台获取与调试模拟完美配合,但在实践中却不起作用

    我在 appDelegate 的 didFinishLaunchingWithOptions 中注册后台获取任务 BGTaskScheduler shared register forTaskWithIdentifier Backgroun
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • iOS Swift 和 reloadRowsAtIndexPaths 编译错误

    我与 xCode Swift 陷入僵局并刷新 UITableView 的单行 这条线有效 self tableView reloadData 而这条线没有 self tableView reloadRowsAtIndexPaths curr
  • 领域:结果 和列表

    是否可以转换Results
  • NSUserDefaults 多久同步一次?

    的文档NSUserDefaults说synchronise方法被定期调用 但没有提及频率 10分钟的谷歌搜索没有发现任何信息 发生的频率是多少synchronise方法调用 这是一个未公开的实现细节 可能甚至不是一个恒定的时间间隔 但是 您
  • 如何在 Firebase Analytics 事件中报告参数

    我用过Fabric with iOS在此之前 在同一分析事件中报告自定义参数非常容易 如下所示 Answers logCustomEvent withName saved border customAttributes image inde
  • 从 IOS 应用程序注销的完美方法是什么?

    下面的代码可以工作 但有一个错误 场景是 我首先登录进入应用程序系统 登录成功后 应用程序将设置 UserDefaults UserId 之后 我可以使用存储的 UserId 导航应用程序视图 一旦我进入设置和选项卡注销 这将清除 User
  • iOS 上的 OpenCV - VideoCapture 属性始终返回 1

    我一直在尝试构建一个简单的 OpenCV iOS 应用程序 该应用程序从捆绑包中加载视频并查询其帧数 持续时间等 然后它将尝试从中获取各个帧 不幸的是 当我使用VideoCapture类中 所有属性返回值 1 然后我尝试导航到frame 1
  • 对于使用 CCCrypt() 的 AES128,密钥可以长于 128 位吗?

    我正在使用CCCrypt https developer apple com library archive documentation System Conceptual ManPages iPhoneOS man3 CCCrypt 3c
  • HTML 分页

    有没有html分页的开源项目 我正在为 iPhone 开发一个应用程序 我想在 UIWebView 上显示 HTML 文件 并且不希望用户向下滚动以查看屏幕上未显示的剩余内容 我想在第二个 UIWebView 上显示剩余的内容 我怎样才能做
  • iOS:滚动视图仅在键盘出现后才起作用

    我制作了滚动视图 其中有很多文本字段 我添加了更新的 TPKeyBoardAvoidingScrollView 并将其添加到滚动视图的文件所有者中 我在 h 文件中添加了插座 在 m 文件中综合并添加了行 self view addSubv
  • 为 iOS 应用程序加载基于 SVG 的图像资源

    我从 thenounproject 购买了一个图标作为 SVG 图像 然后我使用一个名为的 macOS 程序Gapplin http gapplin wolfrosch com 将此 SVG 导出为 PNG 图像 它显示为 100x100
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • XCode 4.5 给我“SenTestingKit/SenTestKit.h”文件未找到,但适用于 4.4.1

    我刚刚安装了 XCode 4 5 它在我现有的项目之一上给了我一个 SenTestingKit SenTestingKit h 文件未找到错误 此错误仅发生在 XCode 4 5 中 但它在 4 4 1 上编译正常 我已经检查过SenTes
  • NSCFData fastCharacterContents 崩溃? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我目前在控制台中收到此崩溃日志 20
  • 企业发行版在 Swift 应用程序中与 iOS8 配合不佳

    我在使用 swift 应用程序在 iOS 8 设备上运行 Enterprise 版本时遇到问题 如果我使用非企业帐户进行代码签名 它似乎工作正常 有人遇到这个问题吗 以下是我在尝试使用企业帐户运行构建以进行协同设计时在 iOS 设备上收到的
  • 如何将相机中的图像保存到 iPhone 图库中的特定文件夹?

    嘿 我是 iPhone 新手 最近我一直在尝试制作一个应用程序 基本上 我想要做的是 如果用户将从相机捕获任何图像 那么它应该保存在设备库中 我知道如何将照片保存在图库中 它对我有用 但我无法将所有捕获的图像保存到设备图库中的特定文件夹 例
  • 设置/覆盖 UICollectionView 中单元格之间的填充

    我有一个 UICollectionView 但在获取单元格之间的填充时遇到了问题 理论上 我应该能够将屏幕除以 4 并且我可以获得包含 4 个图像的单元格大小 完美地占据屏幕宽度 但是 它选择不这样做 相反 它会创建 3 个具有巨大填充的图

随机推荐

  • 使用 Javascript 播放音频元素 (html5)

    我正在尝试弄清楚如何触发从 javascript 播放音频 我得到了一些 html 看起来像 div class audio foo div
  • 删除 geom_tile 中的空白并匹配 geom_vline&hline 位置

    使用时我无法删除矩形之间的空白geom tile功能 df lt data frame x c seq 2 16 2 seq 17 39 2 y c rep c seq 8 26 2 seq 27 45 2 each 20 z c 1 40
  • Jquery Dialog 打开多个对话框

    我在同一页面上有多个图像 对于每个图像 单击时 我试图打开一个对话框 我在 HTML 设置中设置了以下 6 个图像 当前 当我单击图像时 会弹出 6 个对话框 所有对话框都具有与第一个 div 中找到的相同信息 如何修改我的脚本以使其正常工
  • div 中的文本 - 使用 jQuery 自动滚动 - jsFiddle

    我有以下 HTML 我的小提琴 http jsfiddle net 8yKjD 1 我想要 p 元素及其文本从下到上垂直滚动 我如何在不使用任何插件的情况下使用 jQuery 来做到这一点 提前致谢 http jsfiddle net 8y
  • 实例变量的多态性[重复]

    这个问题在这里已经有答案了 这是我写的三个类 public class Shape public int x 0 public void getArea System out println I don t know my area pub
  • CSS 选择器太长是不是不好?

    选择器是这样的 a b c d e f g h zzzzz font size 16px 对性能不好 如果是 如何 如果否 为什么 我在 Google 上搜索并阅读了很多帖子 包括 Mozilla 的帖子 但没有发现任何提及使用大量类名作为
  • VBA 从 Word 到 Excel

    我在使用 Word 模板中的一些 VBA 代码时遇到问题 目的是让代码打开 Excel 书籍 引用名为 Log 的工作表 并根据 Word 文档的名称查找行 一旦名称匹配 我想将单元格值更改为 已完成 然后保存并关闭 Excel 工作簿 我
  • boost::mpl::fold 用于双参数抽象

    我有一个名为 caRender 的类 它为 clientObjectTypes 中的每个给定对象类型提供一个 caRender renderClientObject 方法 所以下面的代码片段显示了这个运行情况 define UNUSED x
  • 实现多个剪辑路径相交的正确方法是什么?

    As described in another post https stackoverflow com questions 17003171 how to identify which clip paths apply to a path
  • MySQL 清除表中的重复条目并重新链接依赖表中的 FK

    这是我的情况 我有 2 张桌子 patient and study 每个表都有自己的 PK 使用自动增量 就我而言 pat id 应该是唯一的 它没有在数据库级别声明为唯一 因为它在某些用途中可能不是唯一的 它不是自制系统 我找到了如何配置
  • Java 是否提供“friend”访问修饰符?

    我想知道 Java 是否提供了 friend 如 C 中的 访问修饰符 有人说我们可以将 friend 作为 Java 中的默认修饰符 这是真的吗 Java 中的默认访问修饰符允许同一包中的任何代码访问成员
  • 公式中的行根据另一个单元格中的值更改

    我正在尝试在 Excel 中创建一个段落 我在另一张表中列出了我想要从中提取的值 这是我正在使用的代码 CONCATENATE Dear Linkage Log I6 Blah Blah Blah 我希望我的列进行相同的更改 但我试图让 6
  • Delphi XE 和使用 OnKeyDown 捕获箭头键

    我希望我的表单能够处理箭头键 而且我可以做到 只要表单上没有按钮 为什么是这样 关键消息由接收这些消息的控件本身进行处理 这就是为什么当您使用按钮时表单不会接收消息 因此 通常您必须对这些控件进行子类化 但 VCL 足够友好地询问父子表单如
  • 为什么在处理.org java pdf 导出时只显示一个框?

    下面是我的代码 在运行时它显示了我想要的多个框 但是当我尝试导出时 它只在该帧位置显示一个框 我尝试在特定帧生成输出 但它有同样的问题 import processing pdf int ofs 500 boolean record voi
  • 每个域都有唯一的 IP 吗?

    我想知道每个域名地址是否都有唯一的IP地址 此外 这些IP位于哪里 这个重定向系统是如何工作的 当我们尝试通过写入域名来访问网站时 它有多少个重定向 谢谢 否 每个域没有自己的 IP 地址 多个域可以托管在同一台服务器上 并且位于同一 IP
  • 参数类型 Observable 不可分配给 User[] 类型的参数

    我正在努力适应material https material angular io components table overview示例如下 import Component from angular core import MatTab
  • 如何在子进程期间和之后执行操作

    我有一个调用子程序的程序 当子程序使用 Popen 运行时 我需要禁用运行按钮并启用停止按钮 但是 由于Popen打开了一个新进程 因此程序完成后应该打印的内容会立即打印出来 我尝试添加self p communicate after Po
  • 跨浏览器的 CSS 行高问题

    我有一些 CSS line height 18px 的按钮控件 有些是输入控件 type button 另一些是样式化为像输入控件一样显示为按钮的锚点 在 FF3 6 12 IE8 中 它们显示相同的高度 但在 IE7 中 锚点的高度较短
  • Android 在检查并请求权限后继续

    我知道关于检查和请求许可以及处理他们的回复有很多问题得到解答 我对此很清楚 但我有点困惑的是 如果我们正在检查两个不同事物的相同权限 那么在授予权限后我们如何继续任务 例如 我有 recycleView 在我的适配器中我有两个按钮的代码 一
  • Xcode 9/Swift 4 AVCaptureMetadataOutput setMetadataObjectTypes 使用 availableMetadataObjectTypes

    似乎有很多与我遇到的问题类似的问题 AVmetadata 随着 swift 4 xcode 9 的变化 https stackoverflow com questions 46286332 avmetadata changes with s