Code-barres sur swift 4
Je suis en train de mettre à niveau mi application de swift 4, mais le lecteur de code à barres n'est pas de travail.
J'ai isolé le lecteur de code à barres de code, et toujours pas de travail. La caméra fonctionne, mais il ne détecte pas le code à barres.
Le code a très bien fonctionné sur swift 3 iOS 10.
C'est 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 en utilisant iOS 11 sur mon iPhone, mis à jour à la bêta 9.
Une idée? Merci.
- Il est donc bon de savoir que ce problème n'est pas seulement ce qui m'arrive après la mise à jour vers iOS 11 et Swift 4 pour mon projet. J'ai un très de base lecteur de QR code ainsi dans mon application en utilisant un AVCaptureMetadataOutput objet et le AVCaptureMetadataOutputObjectsDelegate délégué. J'ai vérifié que tout est en constante et constamment en cours d'exécution et n'est pas interrompu. Je pense qu'à ce point de son temps pour soumettre un bug à Apple (à la fois d'utilisation). Seule chose qui a changé les noms de propriétés/fonctions Swift 4, mais rien d'autre. Bizarre que nous n'obtenons pas tout délégué rappels.
- Aussi, en regardant votre code, vous devez créer une Série de File d'attente pour votre AVCaptureMetadataOutputObjectsDelegate de rappel. metadataOutput.setMetadataObjectsDelegate(de soi, de la file d'attente: DispatchQueue.principal). Au lieu d'utiliser la file d'attente principale, créer une série de file d'attente en tant que propriété de votre vue-contrôleur et l'utiliser ici plutôt que de la file d'attente principale.
- Juste pour la référence, peut être utilisé de tiers github.com/mahendragp/MGPBarcodeScanner
InformationsquelleAutor Dx_ | 2017-09-02
Vous devez vous connecter pour publier un commentaire.
J'ai pensé à elle, mais Apple ne s'en est pas si évident. La fonction de rappel du délégué AVCaptureMetadataOutputObjectsDelegate a été renommé et les noms des paramètres sont différents!!!
Donc, remplacer
à
Mon point de vue est un contrôleur de scanner les Codes QR comme avant après cette. Il a les mêmes paramètres, mais le premier paramètre le nom est différent. Modifier la fonction et les noms des paramètres et build/run.
Espérons que cette aide!
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.global(qos: .userInteractive))
Après le changement du délégué de retour d'appel :
De
À
J'ai besoin de tous les types disponibles pour metadataObjectTypes trop comme ci-dessous-
output.metadataObjectTypes=output.availableMetadataObjectTypes
était finalement ce qui a permis à mon scanner pour renvoyer une valeurAprès la modification de votre code à partir de:
à:
tout fonctionne à nouveau.