Как правильно включить камеру iPhone

Я пытаюсь создать простое приложение, которое будет сканировать штрих-коды и иметь этот фрагмент кода.

var captureSession: AVCaptureSession?
var videoPreviewLayer: AVCaptureVideoPreviewLayer?
var codeView: UIView?

override func viewDidLoad() {
    super.viewDidLoad()

    let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)
    guard let captureDevice = discoverySession.devices.first else {
        print("Camre initialization faild.")
        return
    }
    do {
        let input = try AVCaptureDeviceInput(device: captureDevice)
        captureSession?.addInput(input)

        let captureMetadataOutput = AVCaptureMetadataOutput()
        captureSession?.addOutput(captureMetadataOutput)
        captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]

        videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
        videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        videoPreviewLayer?.frame = view.layer.bounds
        view.layer.addSublayer(videoPreviewLayer!)
        captureSession?.startRunning()

    } catch let error as NSError {
        print("Error \(error.localizedDescription)")
    }

}

Я запускаю приложение на физическом устройстве Xs Max с iOS 12.3.1, и оно неожиданно падает на линии

 captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]

с ошибкой "libc++abi.dylib: завершение с необработанным исключением типа NSException"

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
import AVFoundation   


var captureSession: AVCaptureSession!
var videoPreviewLayer: AVCaptureVideoPreviewLayer!

override func viewDidLoad() {
    super.viewDidLoad()

    captureSession = AVCaptureSession()
    guard let captureDevice = AVCaptureDevice.default(for: .video) else {return}

    let videoInput: AVCaptureDeviceInput

    do {
        videoInput = try AVCaptureDeviceInput(device: captureDevice)
    } catch {
        // handle error
        return
    }

    if (captureSession.canAddInput(videoInput)) {
        captureSession.addInput(videoInput)
    } else {
        // handle error
        return
    }

    let metadataOutput = AVCaptureMetadataOutput()

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

        metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        metadataOutput.metadataObjectTypes = [.qr]
    } else {
        // handle error
        return
    }

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

    captureSession.startRunning()
}

Этот код должен вам помочь, также не забудьте добавить AVCaptureMetadataOutputObjectsDelegate

Пожалуйста, не публикуйте ответы, содержащие только код. Правильный ответ объясняет, что было не так, и объясняет, как ответ решает проблему. Пожалуйста, редактировать свой ответ и предоставьте некоторые полезные сведения.

rmaddy 24.05.2019 20:56

Другие вопросы по теме