Je suis en train de mettre à jour mon application en swift 4, mais le lecteur de code-barres ne fonctionne pas.
J'ai isolé le code du lecteur de code-barres, mais il ne fonctionne toujours pas. La caméra fonctionne mais ne détecte pas le code-barres.
Le code fonctionnait très bien sur swift 3 iOS 10.
Voici le code complet
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
}
}
Je suis sur iOS 11 sur mon iPhone, mis à jour en beta 9.
Une idée? Merci.
2 votes
Il est donc agréable de savoir que ce problème ne m'arrive pas seulement après la mise à jour vers iOS 11 et Swift 4 pour mon projet. J'ai aussi un lecteur de code QR très basique dans mon application utilisant un objet AVCaptureMetadataOutput et le délégué AVCaptureMetadataOutputObjectsDelegate. J'ai vérifié que tout fonctionne constamment et sans interruption. Je pense qu'à ce stade, il est temps de soumettre un bug à Apple (nous devrions le faire tous les deux). La seule chose qui a changé sont les noms des propriétés/fonctions en Swift 4 mais rien d'autre. Étrange que nous ne recevions aucun rappel du délégué.
1 votes
De plus, en examinant votre code, vous devez créer une file d'attente série pour votre rappel AVCaptureMetadataOutputObjectsDelegate. metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main). Au lieu d'utiliser la file d'attente principale, créez une file d'attente sérielle en tant que propriété dans votre contrôleur de vue et utilisez-la ici plutôt que la file d'attente principale.
0 votes
Juste pour référence, vous pouvez utiliser un code à barres tiers github.com/mahendragp/MGPBarcodeScanner