2017-09-02 39 views
23

mi uygulamasını 4 numaralı sürüme geçirmeye çalışıyorum ama barkod okuyucu çalışmıyor.Hızlı 4 Barkod Okunması

Barkod okuyucu kodunu izole ettim ve hala çalışmıyor. Kamera çalışıyor ancak barkodu algılamıyor.

kod 10.

Bu beta yükseltilmiş tam kod

import AVFoundation 
import UIKit 

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 
var captureSession: AVCaptureSession! 
var previewLayer: AVCaptureVideoPreviewLayer! 

override func viewDidLoad() { 
    super.viewDidLoad() 

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

    let videoCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video) 
    let videoInput: AVCaptureDeviceInput 

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

    if (captureSession.canAddInput(videoInput)) { 
     captureSession.addInput(videoInput) 
    } else { 
     failed(); 
     return; 
    } 

    let metadataOutput = AVCaptureMetadataOutput() 

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

     metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
     metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.ean8, AVMetadataObject.ObjectType.ean13, AVMetadataObject.ObjectType.pdf417] 
    } else { 
     failed() 
     return 
    } 

    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); 
    previewLayer.frame = view.layer.bounds; 
    previewLayer.videoGravity = AVLayerVideoGravity.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) { 
    super.viewWillDisappear(animated) 

    if (captureSession?.isRunning == true) { 
     captureSession.stopRunning(); 
    } 
} 

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

    if let metadataObject = metadataObjects.first { 
     let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject; 

     AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) 
     found(code: readableObject.stringValue!); 
    } 

    dismiss(animated: true) 
} 

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

override var prefersStatusBarHidden: Bool { 
    return true 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    return .portrait 
} 
} 

benim iPhone'da iOS 11 kullanıyorum, bir hızlı 3 iOS'taki gayet güzel çalıştı 9.

Herhangi bir fikrin var mı? Teşekkür ederim.

+2

Bu sorunun, projem için iOS 11 ve Swift 4 sürümüne güncellendikten sonra gerçekleşmediğini bilmek güzel. Benim app de bir AVCaptureMetadataOutput nesne ve AVCaptureMetadataOutputObjectsDelegate delege kullanarak çok basit bir QR kod okuyucu var. Her şeyin sürekli ve sürekli olarak çalıştığını ve kesintiye uğramadığını doğruladım. Ben bu noktada, Apple'a bir hata gönderme zamanı geldiğini düşünüyorum (her ikisi de kullanımda olmalıdır). Değiştirilen tek şey, Swift 4'teki özelliklerin/fonksiyonların isimleriydi ama başka hiçbir şey yoktu. Herhangi bir delege geri bildirimi alamıyoruz. –

+1

Ayrıca, kodunuza bakarak, AVCaptureMetadataOutputObjectsDelegate geri aramanız için bir Seri Kuyruk oluşturmanız gerekir. metadataOutput.setMetadataObjectsDelegate (self, queue: DispatchQueue.main). Ana sırayı kullanmak yerine, görünüm denetleyicinizde bir özellik olarak bir sıra kuyruğu oluşturun ve ana sıradan ziyade burada kullanın. –

cevap

63

Ben bunu anladım ama Apple bu kadar açık vermedi. Delegate AVCaptureMetadataOutputObjectsDelegate'den gelen geriçağırım işlevi yeniden adlandırıldı ve parametre adları farklı! Bence denetleyicisi artık bundan sonra eskisi gibi QR kodlarını tarıyor

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

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

için

Yani, değiştirin. Aynı parametrelere sahiptir, ancak ilk parametre adı farklıdır. Fonksiyon ve parametre isimlerini değiştirip oluştur/çalıştır.

Bu yardımcı olur umarız!

func metadataOutput(captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {} 

için:

+0

Bu çözümdü! Fonksiyon farklı, teşekkürler! –

+2

Apple'a bir geliştirme isteği gönderdim, böylece Xcode, bir işlev değiştiğinde geliştiricilere bir baş harfi verecektir. API'ye ulaşana ve hat satırını okuyana kadar çözümü bulamadığım için çok fazla zaman harcadım çünkü hiçbir şekilde kodum yanlıştı. Ve değildi! O zaman fonksiyon isminin farklı olduğunu anladım. –

+1

Ayrıca metadataObjectsDelegate değerini ayarlarken geri çağırma gerçekleşmesini sağlamak için Main DispatchQueue kullanmam gerekiyordu: 'output.setMetadataObjectsDelegate (self, queue: DispatchQueue.global (qos: .userInteractive)) –

5

verdiği kodu değiştirdikten sonra

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

her şey yine çalışır.

+0

Mario ile aynı bilgilere niçin cevap verdiniz? – Leon

+0

Doğru cevabın Mario tarafından doğrulanması, lütfen bir dahaki sefere doğru cevabı oylasa. Teşekkürler! –

+0

Bu cevap benim için daha iyi çalıştı çünkü fonksiyon imzasının değiştiğinden daha açıktı, sadece fonksiyon ismi değil. – mbonness